Skip to content
Merged
Show file tree
Hide file tree
Changes from 70 commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
1f628e8
chore: bump version to 3.8.4
diegosouzapw May 24, 2026
4df4244
feat(providers): enhance Google Gemini, CLI, and Antigravity resilien…
alltomatos May 24, 2026
7a4905e
docs: add PR #2676 to changelog
diegosouzapw May 24, 2026
3c512a7
fix(vision-bridge): process images when vision-capable model has comb…
May 25, 2026
f24a4c1
fix(vision-bridge): only process images when some combo targets lack …
May 25, 2026
69dc6d0
fix(combos): repair context handoff ordering and add per-model timeout
May 25, 2026
8b152fd
Revert "fix(combos): repair context handoff ordering and add per-mode…
May 25, 2026
8457d76
fix(docker): use node:24 base image to match engines range
diegosouzapw May 26, 2026
92c5110
fix(ci): semver-aware release publish guards (npm + docker)
diegosouzapw May 26, 2026
07341fc
fix: add python3, make, g++ to builder stage apt-get for native addon…
mrmm May 26, 2026
a1d8b31
fix(i18n): restore real hint/placeholder text for web-cookie provider…
diegosouzapw May 26, 2026
ad3d4b6
fix(oauth): Codex race + comprehensive provider error handling (#2718)
diegosouzapw May 26, 2026
9543762
docs(changelog): add [3.8.4] section, bump openapi to 3.8.4, document…
diegosouzapw May 26, 2026
baab216
fix(vision-bridge): process images when vision-capable model has comb…
herjarsa May 26, 2026
fb3f64e
fix(antigravity): default exhausted quota to 0% instead of 100% (#2700)
ahmet-cetinkaya May 26, 2026
d32bdfb
fix(electron): Caps Lock indicator, Electron-aware reset message & su…
benzntech May 26, 2026
b6e061c
fix(proxy): atomically create and assign custom proxies (#2697)
terence71-glitch May 26, 2026
684f396
fix(ci): lock-released-branch β€” fix admin permission scope + add push…
diegosouzapw May 26, 2026
ba50f50
fix(combos): repair context handoff ordering and add per-model timeou…
herjarsa May 26, 2026
98a8473
fix(electron): Caps Lock indicator, Electron-aware reset message & su…
benzntech May 26, 2026
921560e
ci: remove environment restriction from the main publish job (#2709)
oyi77 May 26, 2026
0bc7288
feat(proxy): free pool unificado + Vercel Relay + UI 4 abas (#2705)
diegosouzapw May 26, 2026
f9ca142
deps: bump typescript-eslint in the development group across 1 direct…
dependabot[bot] May 26, 2026
9678a64
deps: bump the production group across 1 directory with 5 updates (#2…
dependabot[bot] May 26, 2026
f867338
deps: bump electron-builder from 26.11.0 to 26.11.1 in /electron (#2720)
dependabot[bot] May 26, 2026
1a88b75
Feat/inner ai provider (#2704)
df4p May 26, 2026
db9cc27
fix(antigravity): default exhausted quota to 0% instead of 100% (#2700)
ahmet-cetinkaya May 26, 2026
8d0f751
fix(reasoning): inject thinking blocks into Claude-format messages fo…
herjarsa May 26, 2026
a4787f8
fix(proxy): atomically create and assign custom proxies (#2697)
terence71-glitch May 26, 2026
08ee7b5
chore: fix conflicts
diegosouzapw May 26, 2026
94b3566
feat(webhooks): wizard 3-step com Slack/Telegram/Discord/Custom + reo…
diegosouzapw May 26, 2026
c73d025
feat(openapi): API endpoints content audit β€” 100% coverage, security …
diegosouzapw May 26, 2026
532208b
feat(services): Embedded Services β€” 9Router + CLIProxyAPI unified man…
diegosouzapw May 26, 2026
d8391b4
chore(release): v3.8.4 β€” 19 features, 2 fixes (#2702)
herjarsa May 26, 2026
7b3b036
fix(db): hotfix migration version collision (068_services + 068_webho…
diegosouzapw May 26, 2026
b90b6a3
feat(proxy): serverless relay endpoints with rate limiting (#2734)
diegosouzapw May 26, 2026
4b2aefa
feat(pwa): enhanced manifest + push notification support (#2733)
diegosouzapw May 26, 2026
4642bca
feat(auth): API key groups with model-level permissions (#2732)
diegosouzapw May 26, 2026
b4bf19d
feat(playground): combo routing visual simulator (#2731)
diegosouzapw May 26, 2026
fd820eb
feat(resilience): credential health check + adaptive circuit breaker …
diegosouzapw May 26, 2026
0c536cc
Refactor/api endpoints audit (#2729)
diegosouzapw May 26, 2026
eaa7009
fix(db): remove duplicate migrations from old PR branches
diegosouzapw May 26, 2026
e4db78f
chore(release): v3.8.4 β€” merge pull requests and update changelog
diegosouzapw May 26, 2026
b596d52
docs: add frontmatter to EMBEDDED-SERVICES.md
diegosouzapw May 26, 2026
3f3ab87
fix(ci): green up release/v3.8.4 pipeline (lint, unit, build paths)
diegosouzapw May 26, 2026
92a3a42
fix(security): pin uuid >= 11.1.1 via overrides to clear moderate audit
diegosouzapw May 26, 2026
92ee9f8
fix(ci): green up remaining red checks (coverage artifacts, integrati…
diegosouzapw May 26, 2026
3214dc6
fix(sonar): clear SonarCloud reliability + security ratings on releas…
diegosouzapw May 26, 2026
02f8bbc
chore(sonar): suppress review-style hotspots that are safe by constru…
diegosouzapw May 26, 2026
a7aec0e
chore(ci): rerun CI workflow for release/v3.8.4 β€” earlier PR sync did…
diegosouzapw May 26, 2026
45150bd
ci(touch): force PR sync to retrigger workflow checks
diegosouzapw May 26, 2026
bfecbac
ci(touch): retry trigger after github actions outage recovered
diegosouzapw May 26, 2026
95d1546
fix(security): route combo fallback errors through errorResponse helper
diegosouzapw May 26, 2026
21f8dc4
fix(security): close semgrep MCP findings (CSWSH, log injection, copi…
diegosouzapw May 26, 2026
3a5b02b
fix(security): require package-lock.json in Docker builds (Sonar S6476)
diegosouzapw May 26, 2026
77a44e2
feat(security): harden relay and runtime defaults
diegosouzapw May 26, 2026
f234cd6
fix(security): block SSRF on webhook test endpoint and create/update …
diegosouzapw May 26, 2026
0c94c39
fix(review): resolve PR #2678 multi-agent review findings (#2743)
diegosouzapw May 26, 2026
0e56c5f
chore(security): hardening pass + Trae IDE provider
diegosouzapw May 26, 2026
2175f0c
fix(security): route management API error responses through sanitizeE…
diegosouzapw May 26, 2026
d1f35f3
fix(review): resolve v3.8.4 important + minor findings from consolida…
diegosouzapw May 26, 2026
7bcc756
fix(v3.8.5): 9 bug fixes from GitHub triage (#2748)
diegosouzapw May 26, 2026
f8fcbf2
fix(mcp): break circular await deadlock in complianceβ†’callLogs + Kiro…
disonjer May 26, 2026
24624f8
fix(ui): claude-web provider shows 'API Key' label instead of 'Sessio…
oyi77 May 26, 2026
4753937
fix(deepseek-web): lazy start session refresh (#2742)
thanet-s May 26, 2026
23f52d0
fix(docker): keep fumadocs doc assets in Docker build context (#2741)
janeza2 May 26, 2026
e082f7a
fix(vision-bridge): force bridge for opencode-go/zen models that over…
herjarsa May 26, 2026
be98547
fix(combos): enable universal handoff by default to preserve cross-mo…
herjarsa May 26, 2026
bcc2427
docs(changelog): add v3.8.4 PR merges + dedupe TRAE_CONFIG declaration
diegosouzapw May 26, 2026
448b65a
chore(v3.8.4): consolidate pending fixes and roll version back from 3…
diegosouzapw May 26, 2026
b6c2ece
fix(oauth/providers): dedupe duplicate trae import and entry
diegosouzapw May 26, 2026
a347629
fix(v3.8.4-followup): 5 bug fixes from triage of 79 open issues (#2753)
diegosouzapw May 26, 2026
bdadd44
feat(batch-fixes): batch processing recovery, clean UI, docker compos…
diegosouzapw May 26, 2026
3b27bd1
fix(antigravity): stabilize model detection, OAuth, and token refresh…
oyi77 May 26, 2026
947f059
Broaden routing, provider, and dashboard capabilities (#2750)
JxnLexn May 26, 2026
bea7fe4
fix: resolve headers private slot errors, typecheck issues, and fix u…
diegosouzapw May 27, 2026
47e7bdc
docs(changelog): credit JxnLexn and hartmark, sync fixes to v3.8.4
diegosouzapw May 27, 2026
1e422b0
chore(husky): disable pre-commit checks
diegosouzapw May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 4 additions & 8 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,16 @@ blob-report
# Issue #2348: The Dashboard Docs viewer reads markdown from `/app/docs` at
# runtime. The previous `docs/*` block hid every file except openapi.yaml,
# so the in-product help screen failed with ENOENT for every page.
# We now keep the English markdown tree but drop the bulky assets
# (translations, screenshots, raster diagrams) that account for ~45 MB
# of the ~50 MB docs directory. The Docs viewer reads the default-locale
# (English) sources at runtime, so translations are not required in the
# container image.
# We now keep the English markdown tree but drop bulky i18n mirrors (~45 MB).
# v3.8.3+ (fumadocs-mdx): `npm run build` webpack-bundles docs β€” keep assets referenced
# from English markdown (docs/diagrams/exported/*.svg, docs/screenshots/*.png).
docs/i18n/**
docs/screenshots/**
docs/diagrams/exported/**
# Raster sources under docs/diagrams/ only (exported SVGs are required at build time).
docs/diagrams/**/*.png
docs/diagrams/**/*.jpg
docs/diagrams/**/*.jpeg
docs/diagrams/**/*.gif
docs/diagrams/**/*.webp
docs/diagrams/**/*.svg
# Note: `*.md` matches the root only (Go filepath.Match does not cross /),
# so nested docs/**/*.md is implicitly kept without a re-include rule.
*.md
Expand Down
82 changes: 79 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,32 @@ PORT=20128
# Default: 20129
# LIVE_WS_PORT=20129

# Disable the real-time WebSocket server.
# Bind address for the live WebSocket server.
# Default: 127.0.0.1 (loopback only). Set to 0.0.0.0 to expose on LAN β€”
# remember to also configure LIVE_WS_ALLOWED_ORIGINS when doing so.
# LIVE_WS_HOST=127.0.0.1

# Comma-separated extra origins allowed to open a live WebSocket. The
# loopback dashboard origins are already permitted by default; use this
# var when fronting the server with a domain (e.g. https://omni.local).
# LIVE_WS_ALLOWED_ORIGINS=https://omni.local,https://dashboard.example.com

# Disable the standalone live WebSocket helper used by scripts/start-ws-server.mjs.
# Used by: scripts/start-ws-server.mjs (CI/embedded harness toggle).
# OMNIROUTE_DISABLE_LIVE_WS=0

# Enable the real-time dashboard WebSocket server.
# Used by: src/server/ws/liveServer.ts, scripts/start-ws-server.mjs
# Default: false | Set to 1 or true to disable.
# OMNIROUTE_DISABLE_LIVE_WS=false
# Default: ON. Set to 0 or false to disable startup of the live WS server.
# Combine with LIVE_WS_HOST / LIVE_WS_ALLOWED_ORIGINS above when exposing
# beyond loopback.
# OMNIROUTE_ENABLE_LIVE_WS=1

# Per-(token,IP) relay rate limit, requests/minute. In-memory, per instance.
# 0 or negative disables the IP-dimension gate (per-token DB limit still applies).
# Default: 30
# Used by: src/app/api/v1/relay/chat/completions/route.ts
# RELAY_IP_PER_MINUTE=30

# Use Turbopack in local dev. Next 16.2.4 can fail to compile next/font/google
# through the custom dev runner without this on Windows.
Expand All @@ -110,6 +132,11 @@ OMNIROUTE_USE_TURBOPACK=1
# Used by: src/lib/credentialHealth/scheduler.ts
# OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK=false

# Set to "true" to emit `[ProxyFetch]` debug logs from the Vercel relay path
# in open-sse/utils/proxyFetch.ts. Off by default to avoid leaking routing
# hints in production logs.
# OMNIROUTE_PROXY_FETCH_DEBUG=true

# Docker production port mappings (docker-compose.prod.yml only).
# These set the HOST-side published ports. Container ports use PORT/API_PORT.
# PROD_DASHBOARD_PORT=20130
Expand Down Expand Up @@ -644,6 +671,11 @@ CODEX_USER_AGENT="codex-cli/0.132.0 (Windows 10.0.26200; x64)"
GITHUB_USER_AGENT="GitHubCopilotChat/0.45.1"
ANTIGRAVITY_USER_AGENT="antigravity/2.0.1 linux/arm64 google-api-nodejs-client/10.3.0"
KIRO_USER_AGENT="AWS-SDK-JS/3.0.0 kiro-ide/1.0.0"
# Optional override for the Kiro social device-code OAuth clientId. Kiro's
# device endpoint accepts any non-empty string and behaves like a User-Agent
# rather than a secret. Only override if AWS ever starts enforcing this field.
# Used by: src/lib/oauth/constants/oauth.ts (KIRO_CONFIG.socialClientId).
# KIRO_OAUTH_CLIENT_ID=kiro-cli
QODER_USER_AGENT="Qoder-Cli"
QWEN_USER_AGENT="QwenCode/0.15.11 (linux; x64)"
CURSOR_USER_AGENT="Cursor/3.4"
Expand Down Expand Up @@ -997,6 +1029,21 @@ APP_LOG_TO_FILE=true
# Used by: src/shared/utils/featureFlags.ts
# ENABLE_CC_COMPATIBLE_PROVIDER=false

# ── 9router embedded service ──
# Override the host/port where the embedded 9router instance listens.
# Rarely needed β€” defaults match the bootstrap config (127.0.0.1:20130).
# Used by: open-sse/executors/ninerouter.ts
# NINEROUTER_HOST=127.0.0.1
# NINEROUTER_PORT=20130

# ── Embedded service WebSocket proxy ──
# Standalone WebSocket proxy that tunnels WS connections to embedded services.
# Binds to loopback by default. Only change EMBED_WS_PROXY_HOST if you know
# what you are doing β€” exposing this to non-loopback bypasses local-only policy.
# Used by: src/lib/services/embedWsProxy.ts
# EMBED_WS_PROXY_HOST=127.0.0.1
# EMBED_WS_PROXY_PORT=20131

# ── CLIProxyAPI bridge (legacy) ──
# Connection settings for external CLIProxyAPI instances.
# Used by: open-sse/executors/cliproxyapi.ts
Expand Down Expand Up @@ -1142,6 +1189,35 @@ APP_LOG_TO_FILE=true
# ONEPROXY_MAX_PROXIES=500
# ONEPROXY_MIN_QUALITY_THRESHOLD=50

# ── Free Proxy Pool (1proxy source) ──
# Used by: src/lib/freeProxyProviders/oneproxy.ts
# Set FREE_PROXY_1PROXY_ENABLED=false to disable this source.
# FREE_PROXY_1PROXY_ENABLED=true
# FREE_PROXY_1PROXY_API_URL=https://1proxy-api.aitradepulse.com/api/v1/proxies/advanced
# FREE_PROXY_1PROXY_MAX=500
# FREE_PROXY_1PROXY_MIN_QUALITY=50

# ── Free Proxy Pool (Proxifly source) ──
# Used by: src/lib/freeProxyProviders/proxifly.ts
# Enabled by default; set to false to disable.
# FREE_PROXY_PROXIFLY_ENABLED=true
# FREE_PROXY_PROXIFLY_QUANTITY=100
# FREE_PROXY_PROXIFLY_ANONYMITY=elite

# ── Free Proxy Pool (IPLocate source) ──
# Used by: src/lib/freeProxyProviders/iplocate.ts
# Opt-in only; must set FREE_PROXY_IPLOCATE_ENABLED=true to activate.
# FREE_PROXY_IPLOCATE_ENABLED=false
# FREE_PROXY_IPLOCATE_BASE_URL=https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols

# ── Vercel Relay ──
# Used by: src/app/api/settings/proxy/vercel-deploy/route.ts
# Hides the "Deploy Relay" button when set to false.
# NEXT_PUBLIC_VERCEL_RELAY_ENABLED=true
# VERCEL_API_BASE=https://api.vercel.com
# Default project name pre-filled in the Vercel Relay deploy modal.
# NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT=omniroute-relay

# ── Tailscale tunnel binaries ──
# Optional explicit paths to tailscale/tailscaled binaries used by the
# dashboard's tunnel manager. Used by: src/lib/tailscaleTunnel.ts.
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,15 @@ jobs:
- run: npm run check:node-runtime
- name: Run c8 over shard ${{ matrix.shard }}/4
run: |
# `--temp-directory` (writable via NODE_V8_COVERAGE) is what the merge
# job reads with `c8 report --temp-directory ...`. Using `--output-dir`
# only produces the final json *report* and leaves the raw v8 files in
# `coverage/tmp`, so uploading `coverage-shard/` was empty. Pin the temp
# dir so the raw coverage files live there and the artifact upload picks
# them up regardless of `--test-force-exit` timing.
npx c8 \
--reporter=json \
--output-dir=coverage-shard \
--temp-directory=coverage-shard \
--exclude=tests/** \
--exclude=**/*.test.* \
node --import tsx --test --test-force-exit --test-concurrency=4 \
Expand Down
132 changes: 115 additions & 17 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@ on:
- "v*"
paths-ignore:
- ".github/workflows/**"
# Use 'released' instead of 'published' so editing/re-publishing old releases
# does NOT re-trigger this workflow. 'released' fires only on the initial
# release publication (and pre-release β†’ release transition).
release:
types: [published]
types: [released]
workflow_dispatch:
inputs:
version:
description: "Version tag to build (e.g. 2.6.0)"
description: "Version tag to build (e.g. 3.8.4)"
required: true
type: string
promote_latest:
description: "Also tag :latest (only if this is the highest semver)"
required: false
type: boolean
default: false

permissions:
contents: read
Expand All @@ -32,61 +40,151 @@ jobs:
uses: actions/checkout@v6
with:
ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/v{0}', inputs.version) || '' }}
# Need full tag history for semver comparison when deciding :latest.
fetch-depth: 0

- name: Resolve version, latest-promotion, and skip flag
id: version
env:
EVENT_NAME: ${{ github.event_name }}
REF_NAME: ${{ github.ref_name }}
REF_TYPE: ${{ github.ref_type }}
INPUT_VERSION: ${{ inputs.version }}
PROMOTE_INPUT: ${{ inputs.promote_latest }}
run: |
set -euo pipefail

# 1) Resolve version string from the trigger (all inputs come via env).
case "$EVENT_NAME" in
workflow_dispatch)
VERSION="${INPUT_VERSION#v}"
;;
push)
if [ "$REF_TYPE" = "tag" ]; then
VERSION="${REF_NAME#v}"
else
# Push to main β†’ build & tag as `main` only. Never touch :latest.
VERSION="main"
fi
;;
release)
VERSION="${REF_NAME#v}"
;;
*)
VERSION="${REF_NAME#v}"
;;
esac
# Sanity-check: only allow [A-Za-z0-9._-] in VERSION (defense in depth).
if ! printf '%s' "$VERSION" | grep -qE '^[A-Za-z0-9._-]+$'; then
echo "Refusing to use unsafe VERSION value: $VERSION" >&2
exit 1
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"

# 2) Decide whether to promote :latest.
PROMOTE="false"
if [ "$VERSION" = "main" ]; then
PROMOTE="false"
elif printf '%s' "$VERSION" | grep -qE -- '-(rc|alpha|beta|pre|next)'; then
echo "Pre-release identifier detected β€” skipping :latest."
PROMOTE="false"
elif [ "$EVENT_NAME" = "workflow_dispatch" ]; then
PROMOTE="${PROMOTE_INPUT:-false}"
else
git fetch --tags --quiet || true
HIGHEST=$(git tag -l 'v[0-9]*' | sed 's/^v//' | grep -vE -- '-(rc|alpha|beta|pre|next)' | sort -V | tail -1 || echo "")
if [ -n "$HIGHEST" ] && [ "$VERSION" = "$HIGHEST" ]; then
PROMOTE="true"
else
echo "Version $VERSION is not the highest semver tag (highest=${HIGHEST:-<none>}). Not promoting :latest."
fi
fi
echo "promote_latest=$PROMOTE" >> "$GITHUB_OUTPUT"

# 3) Skip if this exact version is already published in Docker Hub.
# `main` is always rebuilt (mutable floating tag).
SKIP="false"
if [ "$VERSION" != "main" ]; then
if docker manifest inspect "diegosouzapw/omniroute:${VERSION}" >/dev/null 2>&1; then
echo "Image diegosouzapw/omniroute:${VERSION} already exists on Docker Hub β€” skipping rebuild."
SKIP="true"
fi
fi
echo "skip=$SKIP" >> "$GITHUB_OUTPUT"

echo "Publishing diegosouzapw/omniroute:$VERSION (promote_latest=$PROMOTE, skip=$SKIP)"

- name: Set up QEMU (for multi-arch builds)
if: steps.version.outputs.skip != 'true'
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
if: steps.version.outputs.skip != 'true'
uses: docker/setup-buildx-action@v4

- name: Login to Docker Hub
if: steps.version.outputs.skip != 'true'
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Login to GitHub Container Registry
if: steps.version.outputs.skip != 'true'
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract version from release tag or input
id: version
- name: Compute image tags
id: tags
if: steps.version.outputs.skip != 'true'
env:
VERSION: ${{ steps.version.outputs.version }}
PROMOTE_LATEST: ${{ steps.version.outputs.promote_latest }}
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
VERSION="${{ inputs.version }}"
else
VERSION="${GITHUB_REF_NAME}"
VERSION="${VERSION#v}"
set -euo pipefail
TAGS="${IMAGE_NAME}:${VERSION}"
TAGS="${TAGS}"$'\n'"ghcr.io/diegosouzapw/omniroute:${VERSION}"
if [ "$PROMOTE_LATEST" = "true" ]; then
TAGS="${TAGS}"$'\n'"${IMAGE_NAME}:latest"
TAGS="${TAGS}"$'\n'"ghcr.io/diegosouzapw/omniroute:latest"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Publishing Docker image: $IMAGE_NAME:$VERSION"
{
echo "tags<<EOF"
echo "$TAGS"
echo "EOF"
} >> "$GITHUB_OUTPUT"
echo "Tags to push:"
echo "$TAGS"

- name: Build and push multi-arch image
if: steps.version.outputs.skip != 'true'
uses: docker/build-push-action@v7
with:
context: .
target: runner-base
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}
${{ env.IMAGE_NAME }}:latest
ghcr.io/diegosouzapw/omniroute:${{ steps.version.outputs.version }}
ghcr.io/diegosouzapw/omniroute:latest
tags: ${{ steps.tags.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
no-cache: false
env:
DOCKER_BUILDKIT_INLINE_CACHE: 1

- name: Inspect image
if: steps.version.outputs.skip != 'true' && steps.version.outputs.version != 'main'
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
docker buildx imagetools inspect "${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}"
docker buildx imagetools inspect "${IMAGE_NAME}:${VERSION}"

- name: Update Docker Hub description
# Only refresh README/description when we actually promote :latest
# (avoids overwriting from main pushes or back-fill builds).
if: steps.version.outputs.skip != 'true' && steps.version.outputs.promote_latest == 'true'
uses: peter-evans/dockerhub-description@v5
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
Expand Down
Loading
Loading