github diegosouzapw/OmniRoute v3.8.51

4 hours ago

OmniRoute v3.8.51

2,022 documented changes — 235 features, 1,454 fixes and 333 maintenance entries from 1,973 commits in the cycle, with 301 external contributors. Thank you all.

📄 Complete release notes (every entry, full description and credit): attached below as CHANGELOG-v3.8.51.md, and in CHANGELOG.md → [3.8.51]. GitHub caps a release body at 125,000 characters, so the 1,454 fixes and 333 maintenance entries live there in full.

📊 Release by the numbers

👥 People who contributed 325
📝 Commits in the cycle 1,972
🔀 Pull requests referenced 1,942
📋 Changelog entries 2,022
🙌 Contributors credited in entries 322
🤖 Automated dependency commits 33

Entries by type

Type Count
🐛 Fixes 1443
✨ Features 228
🧹 Chore 135
🧪 Tests 90
📚 Docs 72
⚙️ CI 11
♻️ Refactor 11
⚡ Performance 10
🏗️ Build 8
🔒 Security 7
📦 Dependencies 5
⏪ Reverts 2

🏆 Top 25 contributors this cycle

By commits in 091589089c..4aed4b4a08, author identities consolidated via .mailmap and the merged PR's GitHub login. Bots excluded.

# Contributor Commits
🥇 diegosouzapw 589
🥈 Dizzle (@maxmad64bis) 175
🥉 Bob.Hou (@HouMinXi) 167
4 Paco Cartones (@pacocartones) 93
5 Koosha Paridehpour (@KooshaPari) 50
6 Ravi Tharuma (@RaviTharuma) 43
7 Markus Hartung (@hartmark) 33
8 Nguyen Thanh Dat (@ntdatt812) 31
9 QuangBlue 31
10 Webman (@jonlwheat2-gif) 23
11 Goni Sulaiman (@gonisulaimann) 22
12 lorenzozane (@lorenzozanee) 22
13 anhtahaylove 19
14 backryun 18
15 Fouad Salkini (@fouadSalkini) 16
16 Abhishek Sharma (@abhisheksharma2411) 15
17 Nguyen Thanh Dat (@datrixlab) 15
18 Patryk Kopyciński (@patrykkopycinski) 15
19 Rafa Martins (@rafacpti23) 15
20 Caio Figueiroa (@shipsfromrio) 15
21 initguru 12
22 Jan Leon (@JxnLexn) 12
23 Syed Raheemuddin (@raheemuddin786) 12
24 Xmon Dai (@xiechimon) 12
25 Nguyễn Viết Tuấn (@TheDemonTuan) 11

Highlights

  • Providers and catalogs (42 provider features): new gateways and web-session providers (UC / UC Direct, Lyceum, regolo /v1), GPT-6 Astra/Sol/Luna in the Codex and OpenAI catalogs with effort aliases, account-live listings as the chat catalog source for Claude/Codex/Copilot/AGY, safe Codex model discovery.
  • Routing and resilience: hierarchical concurrency admission, adaptive reasoning effort (auto), expiry-first account fallback, per-kind breaker cooldown escalation, provider-breaker close on a successful probe, local-cooldown 429s no longer read as quota exhaustion.
  • Proxies: pools stop re-serving a member the provider just refused, refused-egress set-aside tuning, egress-IP visibility per pool, selector steering away from recently refused members, persisted blocked-verdict history.
  • Video / Audio Bridge: hardened drill-down cache substrate, bounded transcript contract, opt-in audio extraction + STT, earned "embedded" transcript provenance.
  • Free tier and Radar: eligibility-gated free-tier bucket, customModels[].isFree, free-tier capability in the plugin manifest, Radar rate-limit and rules surfacing.
  • Dashboard and observability: continuous call-log export, orchestration "Repeat", managed-lease sessions view, per-attempt upstream timing on proxy logs (opt-in), logs-export truncation notice.
  • Security hardening (late in the cycle): pre-request hooks in an isolated realm (GHSA-9p9m), IP allow/deny judged on the connection, trailing-dot internal hosts, management auth on OAuth routes, OIDC/Trae/GHE Copilot guards, constant-time token comparison, loopback-only version manager, traversal refused in the Codex /v1/responses subpath, linear-time tool-markup scanners.
  • Release engineering: npm Trusted Publishing (OIDC), lockfile valid for npm 10/11/12 again, AI-attribution gate with a reviewed historical allowlist.

✨ New Features

  • feat(audio): proxy native ElevenLabs voices, text-to-speech, and speech-to-text HTTP routes through stored OmniRoute credentials, preserving query strings, multipart uploads, binary responses, and upstream errors (#10556 #11434) — thanks @hartmark
  • Added Google AI Studio Gemini batch text-to-speech support through POST /v1/audio/speech (#11434) — thanks @hartmark
  • Run synchronous RTK and Caveman request compression in a bounded worker-thread pool, keeping large /v1/responses compression heaps outside the HTTP isolate while preserving strict fail-open behavior and per-engine telemetry (#11434) — thanks @hartmark
  • feat(routing): subscription-first auto groupings — auto/subscription routes only through plan-included connections with a documented hard-stop overage and fails closed on exhaustion, while auto/thrifty orders the pool subscription → keyless → free → cheap → premium and steps up one rung at a time as each is exhausted. Billing class comes from a curated per-connection catalog (uncurated is treated as metered, never plan-included), both reuse STRICT_ZERO_COST's per-connection verification, and a quota reading whose resetAt has passed is now refreshed regardless of TTL so routing returns to plan… (#11146) — thanks @yourspraveen
  • feat(providers): publish a management-authenticated versioned web-session credential contract from OmniRoute's canonical browser credential metadata (#11340) — thanks @Zartharas
  • feat(video bridge): harden the optional drill-down cache substrate with exact-path broker policy, canonical principal/session/media isolation, independent retained-byte quotas, cancellation-safe commits, rejection of excess or non-canonical Base64 padding and non-JPEG/truncated media, warning-sensitive full JPEG canonicalization that strips trailing polyglot bytes, server-derived dimensions, and auditable derivation metadata; production tenant binding and multi-resolution selection remain follow-up work (#11369 #11434) — thanks @hartmark
  • feat(search): Add Xquik X search with typed results, credential validation, REST routing, and MCP selection (#11370) — thanks @kriptoburak
  • feat(video): add an opt-in focused analysis mode that safely uses a normalized, 500-code-point latest-user hint for task-aware frame captions while preserving full-mode prompts, temporal-window isolation, and cache identity without storing raw task text (#11383 #11434) — thanks @hartmark
  • feat(dashboard): surface durable exclusive managed leases in the existing Sessions view, keeping leased clients visible across idle gaps while marking connections with in-flight work as active (#11389) — thanks @KaspaPulse
  • build(bun): allow Turbopack bundler flag on Bun 1.4+ with configurable Webpack fallback (#11471) — thanks @TheDemonTuan
  • feat(api): add an opt-in modelVisibilityAllowlist/modelVisibilityDenylist settings pair to curate exactly which models /v1/models advertises, mirrored into every auto/* combo candidate pool so a denied model cannot be routed to via combo selection either (#11481 #11997)
  • feat(rankings): the Free Provider Rankings page shows what each provider actually served over the last 24 h. It ranked by ELO alone, which left a provider that answers every call with an error in first place; the usage data was already served by the API but never requested. A provider with too small a sample shows a dash, not a number (#11546 #11553) — thanks @maxmad64bis
  • feat(guardrails): enforce a bounded, deterministic contract for Video Bridge transcripts — 256 cues, 4096 input code units and 4 KiB UTF-8 per cue, 64 KiB total text, malformed-Unicode rejection, focus-window scoping, cross-source reconciliation with contributing-source metadata, and a structural provenance trust boundary so caller JSON can never self-assert embedded/audio-bridge provenance (#11652 #12009)
  • feat(video): orchestrate optional Video Bridge audio extraction and Audio Bridge STT behind a dual opt-in (operator setting AND per-request signal) — a new loopback-only broker mode=audio operation shares the frame path's exact process queue, deadline, AbortSignal, and byte budgets to extract a bounded mono 16 kHz PCM WAV from the same already-downloaded video, then reuses the existing Audio Bridge transcription boundary; provider segment timing is preserved when available and marked coarse otherwise, and every failure degrades to a visual-only-safe partial instead of throwing (#11654 #12012)
  • Add a tenant-bound Video Bridge drill-down lifecycle on top of the existing secure cache substrate: opaque hashed handles (never raw session/video identifiers), preview/standard/detail multiresolution variants resampled on read, response pagination capped at 8 frames and 32 MiB, and a new authenticated /api/v1/video-bridge/drilldown consumer route that stays disabled for remote access by default and denies cross-key access with the same response as a nonexistent handle (no existence oracle) (#12006)
  • test(video): Add the Video Bridge FU-07/FU-09 promotion-evidence harness — a frozen Zod manifest schema covering the 8 required scenario kinds (static scenes, rapid cuts, late facts, fades, blur, small text, close events, visual prompt injection) with a minimum of 3 repetitions per case, deterministic declarative fixture recipes (videoBridgePromotionFixtures.ts), a pure medians/p95 metrics aggregator, a pure FU-07/FU-09 promotion-verdict evaluator applying the ticket's exact thresholds (missing token usage always holds), a digest-only persistence layer that never retains raw media or raw model… (#11656 #12008)
  • feat(video bridge): "embedded" transcript provenance can now be legitimately earned instead of merely asserted — a bounded, allowlisted (mov_text/subrip/webvtt) subtitle probe runs through the loopback-only Video Bridge broker (at most 2 streams, 10s subdeadline bounded by the request deadline, 256 KiB output, 4096-code-unit lines), normalized through a bounded, ReDoS-safe WebVTT parser and Zod-validated end to end. The adapter always resolves to an explicit success/absent/transient_failure outcome — a subtitle failure never breaks the visual description path, and only a fingerprint-verified broker… (#11659 #12011)
  • Default new Antigravity-family connections (agy CLI imports and Antigravity OAuth connects) to model auto-sync, so live model discovery lands in the synced catalog and /v1/models picks up freshly released upstream models (e.g. Gemini 3.7 Flash tiers) without code changes. Existing connections keep their current setting; the per-connection dashboard toggle remains the opt-out (#11685 #11887) — thanks @MumuTW
  • feat(ui): enable React Compiler (reactCompiler: true + babel-plugin-react-compiler) for automatic memoization at build time (#11783) — thanks @jonlwheat2-gif
  • feat(providers): add SeekAi (seekai.cc) as an OpenAI-compatible New-API gateway — catalog id seekai (alias ska), https://seekai.cc/v1, live /v1/models via passthroughModels, aggregator-list membership so New-API balance detection can opt in. No referral/aff codes (#11786 #12557) — thanks @HouMinXi
  • feat(zai): add GLM-5.3-Flash Coding Plan support (1M context, 128K output, vision, low|high|max reasoning) and route zai GLM-5.3-family API-key traffic through the OpenAI-compatible Coding Plan endpoint with native thinking defaults (#11801) — thanks @Neuron-Mr-White
  • feat(combo): choose how combo models are ordered — manual, provider, score, or name — via a sort control in the dashboard builder, persisted in config.modelSort and re-applied on load and after add (#11812) — thanks @maxmad64bis
  • feat(free): custom models can be marked free-tier via customModels[].isFree; isFreeModel() is the first door and hidePaidModels respects it even for providers outside the free budget (#11843) — thanks @maxmad64bis
  • feat(nodejs): add 5dive as a configure target — omniroute configure 5dive / omniroute setup-5dive write a 5dive auth profile that points an agent fleet's claude seats at OmniRoute, with the root-only write, the loopback-vs-https endpoint rule and the per-seat model pin handled explicitly (#11852) — thanks @5dive-bot
  • feat(sse): treat max as a first-class reasoning-effort tier and clamp per model family (GLM 5.1+/DeepSeek V4+/Kimi K3+ keep native max; o1/MiniMax/Grok/Muse Spark clamp to their upstream ceiling) (#11875) — thanks @Chewji9875
  • feat(providers): the provider plugin manifest now advertises a usage-fetch capability for the 40 providers that have a wired usage/quota fetcher, so external dashboards can read it from GET /api/v1/provider-plugin-manifest instead of parsing open-sse/services/usage.ts after every release. Discovery only — no new fetcher, no quota change, and the Dashboard quota widget stays gated by USAGE_SUPPORTED_PROVIDERS. USAGE_FETCHER_PROVIDERS moved to a zero-dependency leaf (open-sse/services/usage/fetcherProviders.ts) and is re-exported from services/usage.ts, keeping the manifest module a light leaf… (#11903) — thanks @maxmad64bis @pacocartones
  • feat(plugins): OMNIROUTE_PLUGINS_DIR sets the directory the runtime plugin scanner reads — and the root the plugin manager installs into — overriding the HOME-derived default, so a Docker/K8s deployment can point straight at its bind-mounted plugin tree instead of moving HOME just to relocate the scan path. An image that exports no home no longer scans /tmp/.omniroute/plugins in silence: the resolved directory is logged once at startup as scanner.dir_resolved, naming the input that won. Unset, behaviour is unchanged. Distinct from the CLI-only OMNIROUTE_PLUGIN_PATH, which finds omniroute-cmd-*… (#11906) — thanks @amaleta @pacocartones
  • feat(leases): add an explicit owner-authenticated status action that returns only the active lease's privacy-safe configured connection and provider labels, with generation fencing and no credential or internal-id disclosure (#11910) — thanks @KaspaPulse
  • feat(providers): import-from-file modal shows per-row API errors and ships a downloadable CSV template (#12071 #12504) — thanks @HouMinXi
  • feat(providers): dashboard search matches connection name and baseUrl so imported OpenAI-compat nodes surface on the provider card (#12108 #12495) — thanks @HouMinXi
  • feat(routing): add a score Auto router strategy that selects the highest configured weighted score and reuses explorationRate (#12155) — thanks @jacobsparts
  • Add a runtime feature flag to disable universal context handoffs globally without changing the default behavior (#12167) — thanks @jacobsparts
  • feat(providers): the provider plugin manifest now also advertises a usage-supported capability for the 46 providers whose usage API is accepted by the server and Dashboard routes, so integrators can distinguish "the server will serve quota for this provider" from "a fetcher is wired" without reading TypeScript. Discovery only — no fetcher or quota change. usage-fetch resolves on id or alias (the usage dispatcher accepts both); usage-supported resolves on id alone, matching the runtime guard USAGE_SUPPORTED_PROVIDERS.includes(providerId). USAGE_SUPPORTED_PROVIDERS moved to a zero-dependency leaf… (#11903 #12214) — thanks @maxmad64bis
  • feat(rankings): order Free Provider Rankings by what each provider actually served — GET /api/free-provider-rankings?sortBy=reliability and a "Most reliable first" toggle on the page. Providers with too few calls to state a success rate keep their score order below the measured ones; the default order is unchanged (#12218) — thanks @maxmad64bis
  • perf(sse): defer cloneLogPayload() in the structured SSE collector until after the maxEvents/maxBytes cap check, eliminating ~9,800 wasted structuredClone calls per streaming response (65–71% faster push()). Reducer snapshot isolation restored for OpenAI and Responses summaries (#12241 #12243) — thanks @PauloHSOliveira
  • feat(usage): Devin CLI agentic quota (Codeium seat-management GetUserStatus) and OpenRouter key limits plus account credits now surface in Provider Limits (#12256) — thanks @Neuron-Mr-White
  • feat(settings): persist headroomUrl through Settings so status/start use the operator URL instead of only HEADROOM_URL (#12306 #12487) — thanks @HouMinXi
  • feat(auto-combo): Auto-Combo scoring can now weigh how often a provider/model has actually succeeded. The engine already carried that number on every candidate — 24 hours of usage history behind a ten-sample floor, real-time metrics otherwise — and the scoring function never read it, while the weight table described stability as if it did. reliability (1 - failureRate, with the same field precedence and the same rate-bounding the speed ranking already uses, so a corrupt reading means "nothing observed" rather than "fails every call") is now a declared factor shipping at weight 0, so routing is… (#12317) — thanks @maxmad64bis
  • feat(routing): With freeAccessPolicy: "strict", the read-only candidate listing (GET /v1/auto-combo/{channel}/candidates) no longer hides the candidates the zero-cost guard excludes — the same read-only transparency the resilience filter already honours . Each candidate now carries freeAccessExclusion saying why it would be kept out, and it tells an exhausted allowance apart from a quota reading that never arrived or went stale, which used to look identical from the outside. Routing is unchanged: the listing reports, it never enforces. The separate excludeTosAvoid guard still drops its candidates… (#9133 #12319) — thanks @maxmad64bis
  • feat(radar): The Radar catalog table now shows two facts it was already receiving from the feed and dropping on the floor: the per-model rate limits (requests and tokens, per minute and per day) in a new column, and a badge when a provider's terms state it may train on the prompts you send. A limit of zero renders as zero rather than "rate-only" — for a ceiling those are opposite facts — and a model with no training statement gets no badge, because an absent statement is not a guarantee (#12320) — thanks @maxmad64bis
  • feat(radar): explain Community, single-use, contributor, supporter, recovery, abuse, offers, and privacy rules before either Radar activation action, and remove the superseded fixed-PR grant promise from every UI locale (#12342)
  • feat(gamification): the dashboard Profile page now shows the real daily streak — /api/gamification/level returns streak: { current, longest } (per key with apiKeyId, operator-wide maximum otherwise) and the streak card reads it instead of a hard-coded 0 (#2403 #12377) — thanks @pacocartones
  • feat(gamification): the dashboard leaderboard now shows each API key's display name under the Name column instead of a truncated key id; GET /api/gamification/leaderboard attaches name per entry (name only — no key material), while the shared ranking helper and the federation leaderboard stay id-only (#12385) — thanks @pacocartones
  • feat(gamification): enforce the documented 1000 XP/min per-API-key anti-cheat rate limit on the XP award path; over-limit awards are logged and skipped instead of persisted, and the sliding window now matches the timestamp format stored in xp_audit_log (#2403 #12390) — thanks @pacocartones
  • feat(admin): localize the gamification anomalies page — the loading state, the Status column and the Suspicious badge now come from the common catalog (new common.suspicious key propagated to every locale) — add it to the Gamification sidebar group as gamification-admin (/dashboard/gamification/admin), and expose the loading and empty states as polite role="status" live regions (#12401) — thanks @pacocartones
  • feat(providers): skip GitHub combo members missing from the live synced catalog, and drop Copilot models that are policy-disabled or hidden from the model picker (#12473) — thanks @RaviTharuma
  • feat(i18n): locale-expansion tooling — npm run i18n:add-locale adds a language to config, dashboard, docs mirrors, CLI, README/indexes and site in one command; browser, CLI and cookie detection resolve uk, fil/tl, zh-Hant (and the retired legacy in → id) via config aliases; config/i18n.json now ships in the npm package so the published CLI can read it; new real-translation ratio gate (npm run i18n:check-ratio, advisory) with a per-locale ratchet baseline; run-translation --adopt restores .i18n-state.json; sync-language-bars generates 🌐 bars from config; validate_translation.py… (#12496)
  • feat(api): Emit gateway-measured tokens_per_second (TTFT excluded) on streaming usage and X-OmniRoute-Tokens-Per-Second when first-token latency is known (#12616 #12631) — thanks @RaviTharuma
  • feat(opencode-plugin): map gateway cost/usage/tok/s onto OpenCode inference payloads the official plugin copies X-OmniRoute-Response-Cost, token counts, X-OmniRoute-Tokens-Per-Second / usage.tokens_per_second, TTFT, and the winning X-OmniRoute-Model onto the JSON/SSE body OpenCode already consumes. Missing tok/s is left unset (never tokens / latency) (#12636) — thanks @RaviTharuma
  • feat(combo): add combo strategy quota-weighted: skip exhausted accounts, then weighted-draw by leftover / in-flight load; existing conversations stay pinned until the account is empty (#12789) — thanks @HouMinXi
  • feat(models): Account live listings become the chat catalog source for Claude, Codex, Copilot, and AGY; public metadata only fills prices on IDs those accounts already list (#12866) — thanks @HouMinXi
  • fix(models): Union agy and antigravity live catalogs so agy/gemini-3.8-flash-high is not rejected after the prefix folds to antigravity (#12866) — thanks @HouMinXi
  • feat(opencode): Add @omniroute/opencode-plugin-v2, an opencode v2 plugin that gives a v2 install a route to an OmniRoute gateway: it publishes models, combos and auto-combos into the host catalog, refreshes them lazily behind a 300s TTL, and keeps serving the last known catalog from an on-disk snapshot when the gateway is unreachable. The v1 plugin (@omniroute/opencode-plugin) is untouched and keeps working as before. The plugin adapts to the host instead of assuming one shape: it reads the shape the host seeds into the catalog draft and publishes the api block, the pre-api top-level fields, or both.… (#12870) — thanks @omniroute @maxmad64bis
  • feat(services): show sanitized CLIProxyAPI account health from its authenticated management API without exposing credentials, file paths, or raw account metadata (#6342 #11434) — thanks @hartmark
  • feat(search): Add AnySearch free web search + URL extract (webFetch) with typed results, credential validation, REST routing, and MCP selection - fallback-only (#11690) — thanks @Xxx91n
  • feat(dashboard): display clamped [0, 100]% cached input token ratio in request logs table (#11970) — thanks @b3nw
  • feat(catalog): add OMNIROUTE_DISABLE_THINKING_LEVEL_VARIANTS feature flag to optionally filter out thinking level variants from model catalog (#11971) — thanks @b3nw
  • feat(dashboard): continuously export call logs to external analytics stores. A pluggable destination registry ships the full Logs-tab record set on an hourly JobRegistry cron, with a persisted per-destination cursor, batched inserts, a config UI rendered from each destination's own field descriptors, and a REST layer (/api/log-export/*) for CRUD, a connection test, and an on-demand run. A destination can opt into includeBodies to also ship the request and response payloads shown in the Logs detail pane, including the client and provider views of each call; this is off by default, and payloads inherit… (#11945) — thanks @dpozimski
  • feat(providers): add MaxAI as a signed, OpenAI-compatible provider serving its 13 paid chat models (GPT-5.6 / Luna / Thinking, Claude 5 Sonnet, Claude Haiku 4.5, Gemini 3.1 Pro / Flash-Lite, Grok 4.1-fast / 4.5, DeepSeek V3.2 / R1, Llama 3.3 70B) through OmniRoute's /v1 endpoint, with per-request HMAC-SHA1→SM3→AES request signing, live model + context-window discovery from /models/get_config, and prompted tool-calling translated to OpenAI tool_calls (#11461) — thanks @arminanton
  • feat(providers): MaxAI vision input — image_url content parts are forwarded inline in message_content to the 6 vision-capable models (GPT-5.6 / Luna / Thinking, Claude Haiku 4.5, Gemini 3.1 Pro / Flash-Lite) (#11461) — thanks @arminanton
  • feat(providers): MaxAI image generation — 6 image models (gpt-image-1, dall-e-3, flux-1-schnell/dev/pro, sd3-medium) exposed through POST /v1/images/generations (#11461) — thanks @arminanton
  • feat(providers): MaxAI document RAG — inline base64 file/document attachments are uploaded to MaxAI (content-addressed doc_id) and attached to the chat via doc_list (#11461) — thanks @arminanton
  • feat(providers): browserless MaxAI onboarding — email device-pair login (/api/providers/[id]/login) and signed access-token refresh, so a connection can be created and kept fresh without a real browser or Google OAuth (#11461) — thanks @arminanton
  • feat(providers): per-provider TLS impersonation profile (MaxAI presents a Windows Firefox-150 client fingerprint) so its bot-sensitive endpoints accept OmniRoute traffic (#11461) — thanks @arminanton
  • feat(providers): add Nimble as a web-search and web-fetch provider (nimble-search) — /v1/search routes to Nimble's search API at lite depth (locale, freshness and include/exclude domain filters mapped onto the shared request contract), and /v1/web/fetch routes to Nimble Extract, which covers all four fetch formats (markdown, html, links, screenshot) from a single call. One API key serves both surfaces (#11620) — thanks @wildcard
  • The npm publish is automatic again, through npm Trusted Publishing (OIDC): the hosted stage-npm job publishes with a short-lived credential minted from GitHub's id-token — no NPM_TOKEN, no 2FA prompt, provenance attached. publish_mode=staged (owner approves with 2FA) and direct (token) remain available on workflow_dispatch (#11931)
  • feat(providers): Add Opper as an API-key gateway provider — EU-hosted AI gateway with 700+ models from 30+ providers behind one OpenAI-compatible API and one key (OPPER_API_KEY); model ids use provider/model format (e.g. anthropic/claude-sonnet-4-6, openai/gpt-5); live model catalog at https://api.opper.ai/v3/compat/models; entry mirrors requesty (same shape, passthroughModels: true, no static seed) (#11629)
  • feat(dashboard): the /dashboard/orchestration snapshot hook now subscribes to the agents WebSocket channel (agent.task.updated) instead of requests as its refetch trigger, and relaxes its background poll from 5s to 30s while that WS connection is up — falling back to the tighter 5s cadence, reprogrammed live on any connect/disconnect transition, whenever the socket is down (#12409)
  • feat(dashboard): Orchestration canvas quick wins — search box plus state/source/provider filter chips with a one-click clear, and per-source collapse/expand, all reflected in the URL so a filtered/collapsed view is shareable and survives a refresh; the detail drawer gained a "copy trace JSON" action and hardened error/empty-state and accessibility handling; the Agents-tab edges now animate traveling particles along active (running) connections; and the canvas node/edge status colors moved off fixed hex values onto theme-aware --orch-status-* CSS custom properties, so they adapt correctly to light/dark mode (#12393)
  • chore(dashboard): Orchestration UI hardening pass and the missing component/model test coverage it called for — OrchestratorNode/ActivityNode/OverflowNode rendering, the ?node=/overflow-click page routing, the Agents-tab orchestrator-click no-op and showCompleted toggle, and the overview kanban's done-column sort order (#12270 #12271 #12393)
  • New /dashboard/orchestration page: live unified view of everything running — Cloud Agent, A2A and Conductor as a real-time graph (Agents tab), the combo cascade (Routing tab, reusing the Combo Live Studio) and a state kanban (Overview tab), with a detail drawer (trace, cost, approve/cancel). Read-only over existing APIs — no new backend. Canvas concept credit: PR (#11815 #12261)
  • feat(dashboard): new "History" tab on /dashboard/orchestration — an Airflow-style grid of finished runs over a 24h/7d/30d preset window, one row per (source, identity), clicking a cell opens the existing detail drawer. It is backed by real persistence: A2A task lifecycle transitions are now written to the a2a_tasks table (purged after 30 days, configurable via OMNIROUTE_A2A_HISTORY_RETENTION_DAYS) and served by the new GET /api/a2a/tasks/history listing endpoint, with the task-detail route falling back to persisted history once a run leaves the in-memory snapshot. Conductor runs stay remote and are… (#12479)
  • feat(dashboard): the orchestration detail drawer gained a "Repeat" action for Cloud Agent, A2A and Conductor tasks — a two-click confirm (click once to arm, click again within the confirm window to fire) re-submits the original prompt/input as a new run. The button is disabled with an explanatory tooltip whenever the original input can't be recovered from the loaded task detail (e.g. it never carried a prompt, or the detail failed to load). Two limitations of the A2A variant, by design: it targets the /a2a JSON-RPC endpoint, which authenticates with an API key only (REQUIRE_API_KEY=true or a configured… (#12508)
  • feat(a2a): A2A task execution now records which memories were consulted for the task's last user message as metadata.memoryHits (id/key/type/content-snippet) plus a memory_hits history event, purely for observability — the retrieved memory is never injected into a skill's prompt or behavior. Gated by the OMNIROUTE_A2A_MEMORY_HITS kill-switch (default enabled; set to 0 to skip the recall lookup entirely). The drawer's new "Memory used" section lists these hits for a2a tasks and is omitted whenever there are none. Known limitation: recall only resolves under the keyless posture — a keyed caller's… (#12508)
  • feat(providers): add a Perplexity Agent API provider (perplexity-agent / pplx-agent) for Perplexity /v1/responses, including the documented Anthropic, OpenAI, Google, xAI, DeepSeek, Z.AI, Moonshot/Kimi, NVIDIA, and Perplexity model IDs plus Anthropic-model max_output_tokens compatibility (#12103) — thanks @AIB1TAL0S
  • feat(providers): add RPD (Requests Per Day) limit to provider rate limit overrides across UI, schemas, DB, and i18n (#12147) — thanks @b3nw
  • feat(providers): add UC Direct (uncensored.com Developer API), the metered OpenAI-compatible surface. A standard OpenAI-compatible passthrough (default executor) for uncensored.com's official REST API at https://api.uncensored.com/api/v1: X-api-key auth (never-expiring uai_sk_live_ key), POST /chat/completions with streaming SSE and native tool-calling, and the full live metered catalog (82 models across 15 providers, discovered from the public GET /v1/models). Registered as provider uc-direct (alias ucd). Complements the un-metered uc persona provider — same models, metered credits and a plain API key instead of a subscription session (#11513) — thanks @arminanton
  • feat(providers): add UC (uncensored.com), the un-metered subscription "persona" chat as an OpenAI-compatible provider. A WebSocket web-app port: a durable Clerk credential mints a short-lived session token per connect (browserless — no API key), driving UC's persona socket. Ships the browserless email-code login (request → verify → harvest), the 19 verified persona models (Claude Opus, Gemini, Grok, GLM, Kimi, DeepSeek, MiniMax, incl. the uncensored variants), prompted <tool> tool-calling with a per-model code-style dialect + auto-cure retry for guardrailed models, live <think>/reasoning split, streaming + non-streaming OpenAI responses, and full quota/auth error surfacing (paywall / message-limit /… (#11513) — thanks @arminanton
  • feat(logs): add copy-all button to request detail modal (#11083) — thanks @AndrianBalanescu
  • feat(check): make serviceKinds required and add the reverse-walk provider consistency gate (#11392) — thanks @Tushar49
  • feat(providers): only advertise verified-working connections by default (#11448) — thanks @alltomatos
  • feat(resilience): add hierarchical concurrency admission (#11493)
  • feat(providers): derive + surface expiry for JWT-bearing web cookies (#11497 #11505) — thanks @oyi77
  • feat(tunnels): support named cloudflared tunnels via CLOUDFLARED_CONFIG (#11561) — thanks @ggiak
  • feat(compression): make proactive context-compression threshold a live setting (#11564) — thanks @ragnar-claude
  • feat(resilience): add provider peak-hour protection (#11622) — thanks @Neuron-Mr-White
  • feat(providers): add 1min.ai provider (#11631) — thanks @zero-executioner
  • feat(dashboard): collapsible JSON tree viewer for request/response payloads (#11703) — thanks @hartmark
  • feat(routing): add LiquidAI LFM2.5-2.6B free tier via OpenRouter (#11752) — thanks @brick30llc-ctrl
  • feat(pricing): add GLM-5.3-Flash pricing, model specs, and catalog registration (#11830) — thanks @AndrianBalanescu
  • feat(routing): add relayMode for schema-locked context handoffs (#11839) — thanks @raheemuddin786
  • feat(config): add support for runtime system prompt configuration and hot-reloading (#11841) — thanks @raheemuddin786
  • feat(routing): expand connection-aware quota prefilter across combo strategies (#11682 #11850) — thanks @HouMinXi
  • feat(models): reactive discovery sync after Antigravity model-not-found 404 (#11888) — thanks @MumuTW
  • feat(models): auto-aliases and token limits from synced Antigravity discovery (#11889) — thanks @MumuTW
  • feat(settings): raise sticky round-robin limit caps to 1000 (#12015) — thanks @adivekar-utexas
  • feat(resilience): operator-configurable global credential health check interval (#12043) — thanks @adivekar-utexas
  • feat(quota): use official OpenCode Go usage API (#12124) — thanks @ddarkr
  • feat(resilience): default the credential health check sweep to 60 minutes (#12138) — thanks @adivekar-utexas
  • feat(quality): new-code mode for the complexity and dead-code ratchets (Clean as You Code) (#12142)
  • feat(dashboard): orchestration canvas — unified model + snapshot hook (part 1/2) (#12156)
  • feat(usage): add Kilo Code balance and Kilo Pass quotas (#12178) — thanks @killer30001000
  • feat(providers): refresh vendored ChatGPT Web connector to v4.0.7 (#12181) — thanks @backryun
  • feat(providers): manual "Clear cooldown" action in the cooling panel (#12224) — thanks @patrykkopycinski
  • feat(providers): restore ChatGPT Web via clean-room browser transport (#12239) — thanks @backryun
  • feat(sse): wire the PROVIDER_PROFILES window gate into the global provider cooldown (#12247)
  • feat(providers): modernize CLOVA Studio chat and embeddings (#12277) — thanks @backryun
  • feat(browser): adopt Obscura as primary headless browser engine with Chromium fallback (#12286) — thanks @opensource-elearning
  • feat(sse): full language parity for output styles (es/de/fr/it/ru/zh + autoDetect) (#12289)
  • feat(quality): complete test:scoped — --full map rebuild, stdin selection, CI loader parity (#8084 #12353)
  • feat(providers): refresh Fable, Cursor, and Devin catalogs (#12367) — thanks @backryun
  • feat(video): redact transcript text from logs and durable memory (#12150 #12427)
  • feat(dashboard): parent-link, genuine-continuation badge, and modal perf fixes (#12448) — thanks @hartmark
  • feat(dashboard): adaptive context-budget dial on compression panel (#12488) — thanks @HouMinXi
  • feat(providers): refresh Z.ai Web models and browser transport (#12524) — thanks @backryun
  • feat(video): redact raw client-snapshot transcript fields in the detailed log (#12150 #12528)
  • feat(providers): refresh NVIDIA hosted models (#12538) — thanks @backryun
  • feat(quota): Moonshot Open Platform balance and TPD lock for custom nodes (#12590) — thanks @HouMinXi
  • feat(video): redact transcript in the in-memory pending-request snapshot (#12430 #12596)
  • feat(dashboard): link a log entry's Conversation Context to its owning conversation (#12646) — thanks @hartmark
  • feat(catalog): eligibility-gated free-tier bucket (#12669)
  • feat(db): fail-closed previous_response_id continuation for redacted video turns (#12150 #12707)
  • feat(gamification): pay the documented streak_bonus and badge_unlock XP rewards. XP_REWARDS listed both rewards but the award pipeline never paid them: the private reward table in events.ts omitted them, updateStreak() did not report when a streak extended, and badge unlocks carried no XP. Every request that extends a daily streak now pays streak_bonus × streak length once per UTC day (guarded by a same-day xp_audit_log check), and every badge unlocked through the pipeline pays badge_unlock once per badge (guarded by the user_badges primary key; unlockBadge() now reports whether it inserted). Bonus XP flows through the same addXp + level sync +… (#12522) — thanks @pacocartones
  • feat(providers): advertise a free-tier capability in the provider plugin manifest for every provider with documented free models, so sidecars and dashboards can filter free-capable providers without reading the quota catalog (#12786) — thanks @maxmad64bis
  • feat(providers): Added EURouter as an OpenAI-compatible API-key gateway (https://api.eurouter.ai/v1), with live model discovery via passthroughModels. Its copy states that models are served by third-party upstreams listed per model, so an EU-based router is not read as EU data residency for inference (#13025) — thanks @ntdatt812
  • feat(providers): Added GreenPT as an OpenAI-compatible API-key provider (https://api.greenpt.ai/v1), with live model discovery via passthroughModels. No free-inference badge: the published docs describe a free API subscription billed per token, not a free tier (#13024) — thanks @ntdatt812
  • feat(i18n): 9 new locales — Greek (el), Croatian (hr), Serbian (sr), Lithuanian (lt), Estonian (et), Latvian (lv), Slovenian (sl), Maltese (mt), Irish (ga) — across the dashboard, docs mirrors, CLI, README and the site; OmniRoute now ships every official EU language (51 locales) (#13044)
  • feat(i18n): 8 new locales — Kannada (kn), Malayalam (ml), Odia (or), Punjabi (pa), Nepali (ne), Sinhala (si), Burmese (my), Khmer (km) — across the dashboard, docs mirrors, CLI, README and the site (59 locales). The translator now restores the ICU literal escape around angle placeholders and splits oversized docs sections before translating (#0000 #13660)
  • feat(providers): list Agnes 3.0 Flash as the current free chat model, drop retired 1.5 Flash, add Image 2.0/2.5 Flash plus Video 2.5/2.5 Flash, and discover the live /v1/models catalog (including the CN host api.agnes-ai.cn). agnes-1.5-flash now forwards to agnes-3.0-flash. Video 2.5 polls GET /v1/videos/{id} (not the V2.0 /agnesapi contract). Live /v1/models (2026-09-09) no longer serves 1.5; the wiki marks it deprecated. 3.0 Flash is 512K context / 65,536 max output, same window as 2.5. CN-region keys use the existing per-connection base-URL field, default stays… (#13120) — thanks @HouMinXi
  • feat(sse): Codex and OpenAI catalogs list GPT-6 Astra with effort aliases (-low through -ultra); Codex CLI identity pins @openai/codex@0.153.4 in lockstep with the image (#13026) — thanks @openai @0 @HouMinXi
  • feat(dashboard): the orchestration History tab gained a "Compare runs" mode — toggling it turns each grid cell into a 2-item selection queue (a 3rd click drops the oldest pick), and picking two cells opens a side-by-side comparison panel instead of the usual detail drawer. The panel fetches both runs' detail the same way the drawer does (falling back to persisted history once a run leaves the live TTL window) and shows, per side: identity/source/state, start time, a signed right - left delta for duration/cost/event count, the event timeline aligned by index, and any memory hits. One side's fetch failing… (#12677)
  • feat(dashboard): badge a conversation that never reached a clean stop (#12717) — thanks @hartmark
  • feat(release): reconcile-changelog tool + version-anchored fragment aggregation (#12987)
  • feat(mcp): carry context_length through MCP list_models_catalog projection (#12776 #13406) — thanks @KooshaPari
  • feat(cli): make startup readiness budget configurable (#13369 #13433) — thanks @KooshaPari
  • feat(docs): every Markdown page under docs/ is now mirrored in all 65 dashboard locales, not only the 22-page core set — 152 sources × 65 locales = 9,880 mirrors (6,208 new), with the 🌐 language bar of every mirror rewritten for the full locale list. The docs drift gate (npm run i18n:check, blocking in CI) derives its scope from the tree, so it now guards all 152 pages. Found and fixed by the run in scripts/i18n/run-translation.mjs: a markdown table or tight bullet list with no blank line inside it (PROVIDER_REFERENCE.md's 244-row table, FREE_TIERS.md's 71-item list) was sent as one 16–40 KB… (#14106)
  • feat(usage): openai-compatible-* connections can now report billing/quota in Provider Limits. The connection declares its own quota endpoint, auth mode and a dot-path mapping onto UsageQuota in providerSpecificData.quotaEndpoint, so no upstream-specific code is needed per service — a mapping that resolves nothing reports no quota rather than an exhausted-looking 0/0 (#13616 #13673) — thanks @abhisheksharma2411
  • feat(sse): track LLM Gateway DevPass quota — the llmgateway provider now reads its monthly plan-credit and weekly premium-model allowance from GET /v1/key and surfaces both windows in Dashboard › Limits and quota-aware preflight (#12462) — thanks @PixmaNts
  • feat(providers): register gemini-3.8-flash — Gemini 3.8 Flash (DeepMind 2026-09-02) with tool calling and vision support (#12638 #12663) — thanks @toor11
  • feat(proxylogs): proxy log columns and detail pane now show the registry proxy name instead of a bare host:port when several registry entries share the same gateway (#12814) — thanks @tiangao88
  • compression: add Hungarian Caveman language pack with Hungarian-specific rules, language detection, localized output instructions, and language-pack tests (#12825) — thanks @botii16
  • feat(sse): parse/scrub DSML tool-call markers embedded in reasoning and recognize adaptive thinking on the response side — dsmlToolCalls.ts module + translator/stream/handler wiring (#12905) — thanks @initguru
  • feat(codex): safely discover compatible models by classifying upstream models before activation to keep hidden, unsupported, retired, or newer-client models out of the active catalog, exposing candidate diagnostics while persisting only active models, adding GPT-6 Astra fallback definitions, and bumping the tested Codex CLI version to 0.153.4 (#12933) — thanks @TheDemonTuan
  • feat(api): POST /api/keys accepts expiresAt (ISO datetime, nullable) with the same semantics as the key-update path, so automation can create an expiring key in one operation instead of create-then-update. Omitted/null preserves the current non-expiring behavior; enforcement reuses the existing expiry policy (#12952) — thanks @caniko
  • feat(build): add build:fast and start:fast to bypass standalone tracing (#13021) — thanks @tuandinh0801
  • feat(sse): OMNIROUTE_DISABLE_CONVERSATION_TRACKING=1 turns off conversation-history collection for operators who do not use the dashboard's conversation view. resolveConversationId() returns an untracked result before it reads SQLite or parses message history, and the switch also covers client-supplied session IDs. Routing-session handling is unchanged, tracking stays on by default, and existing records are not deleted. One reporting install held 5.97 million turn records at about 4.26 GB (#13150) — thanks @cryptiklemur
  • feat(providers): Add auto/kimi, auto/qwen, auto/deepseek, auto/gpt, and the auto/claude-haiku fast variant to the built-in routing catalog, including bare k3 models on Kimi coding and web backends (issue (#13214 #13709) — thanks @keii-2596
  • feat(usage): Claude OAuth usage now shows the separate weekly Fable limit next to the shared five-hour and weekly meters. Anthropic reports it as a weekly_scoped entry in limits[], which OmniRoute ignored, so the pool was invisible. The provider-limits cache keeps modelQuotas and restores it on stale-data fallback. The Fable meter is display-only and does not affect routing, account selection, or cooldowns (#13266) — thanks @cryptiklemur
  • feat(playground): copy an individual Compare column's response. Each column in the Compare tab now has a copy button beside the remove button, reusing the existing useCopyToClipboard hook to copy that column's response text and show a checkmark while disabled on an empty response. (The independent-scrolling half of this PR was already fixed separately in (#13532 #13317) — thanks @ventulus95
  • feat(models): add Gemini 3.8 Flash tiers to Antigravity and AGY catalogs , with credit to (#13318 #12499) — thanks @tuandinh0801 @Abhishekchhetri020
  • feat(reasoning): adaptive reasoning effort (auto) — the gateway resolves the thinking budget per user turn from deterministic request-shape signals (stateless per-turn pin) instead of forwarding a literal auto, applied at the gateway pre-translation for any harness (Claude Code, Cursor, Codex, opencode, Hermes) whose request dispatches to an OpenAI Chat-Completions-shaped upstream (targetFormat === FORMATS.OPENAI — reasoning_effort is an OpenAI-shaped field, so a Claude- or Gemini-targeted request is unaffected). Opt in via X-OmniRoute-Effort: auto or a model's defaultReasoningEffort: "auto" (now… (#13448) — thanks @patrykkopycinski
  • feat(dashboard): Add a dedicated, full-width API-key routing editor with explicit model/combo choices, searchable selectors and protection for unsaved rule drafts (#13555) — thanks @JxnLexn
  • feat(proxies): proxy pools and opencode's per-account rotation stop re-serving a proxy that just failed (refused TCP probe, or a 429 through it) for a period that doubles on each repeat up to a cap, without writing any proxy status; with every candidate set aside the choice is unchanged. Opt-in via the PROXY_SKIP_RECENTLY_FAILED feature flag (default off: selection unchanged) (#13578) — thanks @maxmad64bis
  • feat(proxy-logs): proxy log rows keep the HTTP status the provider actually returned (upstream_status, null when no response arrived), so a throttled egress IP (429), a refused one (403) and a provider outage (500) are no longer the same "error" line, and a 429 generated locally is no longer mistaken for one from the provider (#13580) — thanks @maxmad64bis
  • feat(proxies): the proxy pool editor shows, for the last 24 h, how many distinct egress IPs actually served the pool's members, how many connections went through them and the most seen behind one IP, read from the proxy log through a separate route so it can never break the pool screen; opt-in with the PROXY_POOL_EGRESS_OBSERVATION feature flag (default off) (#13581) — thanks @maxmad64bis
  • feat(sse): learn hard request caps stated in 429 bodies and pace under them. Providers such as TokenRouter reject bursts with prose like Maximum 5 requests within 1 minutes and no rate-limit headers, so the limiter never learned the ceiling and kept racing into it; every 429 also tore the limiter down and rebuilt it with no pacing. updateFromResponseBody now parses that phrasing (and N requests per minute, N requests per M seconds, N RPM) into a per-window cap, applies it to the limiter as an empty reservoir that refills N every window with calls spread window / N apart, and records it in learnedRateLimits. A learned cap is reapplied whenever the… (#13594 #13895) — thanks @costajohnt
  • feat(proxies): a proxy pool stops re-serving a member the provider just refused through it and tries another member instead, reusing the existing skip cooldown; a later success through the member clears it. Opt-in with the PROXY_SKIP_RECENTLY_FAILED feature flag (default off: pool selection unchanged) (#13602) — thanks @maxmad64bis
  • feat(flags): add DB_HEALTHCHECK_STARTUP_DEFERRED_ENABLED (default off) — opt-in deferral of the startup DB health/integrity check past process boot via setImmediate; off keeps the pre-` until the check has already run (#13717) — thanks @HouMinXi
  • feat(i18n): 7 new locales — Hausa (ha), Yoruba (yo), Igbo (ig), Amharic (am), Uzbek (uz), Georgian (ka), Armenian (hy) — across the dashboard, docs mirrors, CLI, README and the site (66 locales, the full planned expansion from 43) (#13727)
  • feat(api): POST /v1/rerank (and the memory engine's loopback rerank step) can route to OpenAI-compatible provider nodes on a LAN/Tailscale host — not only loopback — behind the new RERANK_REMOTE_PROVIDER_NODES feature flag (default off), subject to the provider outbound URL policy; the loopback host check is consolidated into @/shared/network/loopbackNodeHost shared by rerank, audio, and the local health checker (#13732 #13733) — thanks @seanford
  • feat(security): OmniRoute now warns at boot when the server that answers /v1 inference is bound to a non-loopback interface while REQUIRE_API_KEY is disabled. The guard added in and the live dashboard WebSocket, but not the Next server that actually serves /v1/chat/completions and /v1/responses — which binds HOST || 0.0.0.0, every interface by default. That matters because GET /v1/models follows the dashboard login posture (requireAuthForModels) while inference follows REQUIRE_API_KEY, so an instance with an admin password and REQUIRE_API_KEY=false answers 401 to the probe an operator… (#12568 #2257 #13820) — thanks @abhisheksharma2411
  • Expose combo wall-clock timeout (comboTimeoutMs) next to Target timeout in the combo editor and Combo defaults. Empty keeps the 10-minute hang-stop; a positive value replaces it (#13857) — thanks @HouMinXi
  • feat(i18n): retranslate-site rewrites the site catalogs' verbatim-English leaves (2,059 across 63 catalogs; mean English residue 10.3 % → 6.3 %, the rest being brand names kept on purpose) (#13886)
  • feat(compression): Lite tool-result truncation length is configurable (lite.maxToolLength, env OMNIROUTE_LITE_MAX_TOOL_LENGTH). Default stays 2000. An out-of-range step cap no longer hides a valid global cap; a toggle-only settings write keeps a stored cap; maxToolLength: null clears it. Dashboard copy no longer hard-codes 2,000 characters (#13915 #13178) — thanks @HouMinXi
  • feat(proxy): support multiple local core endpoints, one per line (#13923) — thanks @maxmad64bis
  • feat(providers): Added Agnes AI (China) as agnes-cn pointed at https://api.agnes-ai.cn/v1. Keys issued for apihub.agnes-ai.com stay on the existing agnes card. Live /v1/models on that host lists agnes-3.0-flash (same id as intl); the CN seed matches 2.0/2.5/3.0 and not retired 1.5. (#13399) — thanks @HouMinXi
  • feat(api): add per-key allowAutoCombos (default true) to gate the built-in auto/* combos, which previously bypassed a key's allowedCombos/allowedModels/blockedModels restrictions entirely — a restricted key could still reach any model through auto/best-fast. Also adds a per-key catalogScope (all/combos/models) to control what /v1/models advertises, and the dashboard gained an Auto Combos toggle and a catalog scope selector in the API key permissions UI (#13670) — thanks @fouadSalkini
  • feat(sse): Claude OAuth connections can opt in (per account, Edit connection → Claude section) to Claude Code's lower-priority lane and once-a-week session-limit reset. After the first 5-hour usage-wall 429 carrying anthropic-ratelimit-unified-slow-offer: treatment, OmniRoute retries the same account with anthropic-usage-limit: slow and keeps sending it until the window resets — the account keeps serving past the limit instead of being cooled down (slot_busy/529 wait the server's slow-retry-after, bounded by slow-max-wait). With auto-reset on, the wall first tries `POST… (#13074) — thanks @davidebaraldo
  • feat(providers): update Fish Audio for S2.1 Pro Free, validated advanced TTS controls, and provider-scoped persistent voice-clone management (#13090) — thanks @Bl0ck154
  • feat(usage): redeem GLM Coding Plan Reset Cards (glm / glm-cn / glmt / zai) from the Provider Limits UI — clear an exhausted 5-hour or weekly coding-plan window before it rolls over, via the new /api/usage/glm-reset-card route (GET lists, POST redeems). List and redeem requests egress through the connection's proxy and honor exclusive-lease isolation; z.ai's requestId is reused for retries of an ambiguous (transport-failed) redemption so a lost response cannot double-consume a card (in-memory, best-effort — restart the server and a fresh key is required). Responses are validated… (#12754) — thanks @insoln
  • feat(routing): self-hosted unified OpenAI-compatible entry (/v1/chat/completions). When OMNIROUTE_SELF_HOSTED_PROVIDERS (inline YAML) or OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE is set, the existing /v1/chat/completions route diverts through the self-hosted provider adapters (open-sse/services/providerAdapters.ts) — OpenAI / Anthropic / local-compatible — instead of the cloud pipeline. Provider is auto-routed via the x-omniroute-provider header, a provider/model (or provider::model) model prefix, or the first configured provider; upstream credentials stay runtime-only and are stripped from echoed responses. Optional OMNIROUTE_SELF_HOSTED_API_KEY guards the entry… (#13611) — thanks @luyuehm
  • feat(routing): deterministic routing strategies for the self-hosted entry (strategy: block, M2/RIC-740). The unified /v1/chat/completions entry (RIC-738) now accepts a declarative strategy: block — inline in the providers YAML or via OMNIROUTE_SELF_HOSTED_STRATEGY / OMNIROUTE_SELF_HOSTED_STRATEGY_FILE — expressing five explainable, non-predictive routing policies: blacklist / whitelist (hard filters), cooldown circuit breaker (consecutiveFailures + cooldownMs), cost-priority (cheapest costPer1MInput first), latency-aware (fastest recent average first), and an explicit fallbackChain order. The ordered candidate list is the fallback chain: a failed primary (network or non-2xx)… (#13611) — thanks @luyuehm
  • feat(dashboard): add sidebar pinned items shortcut section with individual item pin toggle and localStorage persistence (#12891) — thanks @ZaimMarzuki
  • feat(providers): share the existing api.x.ai/v1/models discovery config with xai-oauth so SuperGrok OAuth connections pick up new Grok ids without a registry seed edit (#13518) — thanks @HouMinXi
  • feat(core): improve observability for dual-auth fallback execution (#11828) — thanks @raheemuddin786
  • feat(chat-admission): expose admission tunables via dashboard settings (#12038) — thanks @oyi77
  • feat(dashboard): show exact token counts on hover in usage analytics cards and tables (#12553) — thanks @ZaimMarzuki
  • feat(providers): add xKiro (#12648)
  • feat(reasoning): opt-in min output budget floor for thinking models (#12742) — thanks @patrykkopycinski
  • feat(sse): retry transient 5xx backend errors with jitter (global-fallback call site) (#12695 #13143) — thanks @KooshaPari
  • feat(services): add open-wa as a 6th embedded service (#13222) — thanks @birdleandro-bit
  • feat(providers): update Openference free models and add Deyin to compatible agents (#13378) — thanks @AnhLead
  • feat(docker): add self-host compose + 5-minute deploy doc (RIC-739) (#13639) — thanks @luyuehm
  • feat(antigravity): expose physical send telemetry (#13659) — thanks @domenicomassafra
  • feat(i18n): blocking key-completeness gate — every locale carries every en.json key (#13827)
  • feat(i18n): new-key gate rejects MISSING markers; skills translate new keys in parallel (#13996)
  • feat(mitm): dynamically inject configured models into Antigravity model catalog (#14006) — thanks @steve25060
  • feat(cache): configurable dual-layer semantic caching with Redis/In-Memory vector stores (re-land of (#12630 #14159) — thanks @BillyOutlast
  • feat(providers): add Lyceum (lyceum.technology) as an OpenAI-compatible, pay-per-use provider — chat, embeddings, and live /models discovery through https://api.lyceum.technology/openai/v1, plus a credit-balance quota fetcher (GET /api/v2/external/billing/credits) surfaced in Dashboard › Limits and quota-aware preflight (#12470 #12474) — thanks @PixmaNts
  • Add a bounded, request-correlated Auto candidate evaluation trace so pre-dispatch exclusions can be diagnosed without changing routing behavior or recording request content (#14444) — thanks @keeltrace
  • feat(dashboard): combo editor shows the effective round-robin sticky limit and its source, a connection-aware expansion inherit/on/off toggle, and a prompt-cache locality hint on pinned RR/weighted steps; AUTO-COMBO docs cover the sticky batch and the single dynamic-account recommendation. Save keeps stickyRoundRobinLimit and connectionAwareExpansion when the current strategy has no editor for them, matching sanitizeComboRuntimeConfig (#13370 #14014) — thanks @HouMinXi
  • feat(dashboard): request timeline plots MCP tool invocations from mcp_tool_audit next to LLM calls, with a per-API-key filter covering both row kinds. GET /api/mcp/audit (and /stats) is exempt from the local-only MCP prefix so a tunnel-served dashboard can poll it; SSE/stream stay loopback-only. Audit rows stamp the caller's API-key id from the HTTP principal, not OMNIROUTE_API_KEY_ID (#13941 #13898) — thanks @HouMinXi
  • feat(api-manager): collapsible and searchable connection groups with provider select-all in permissions modal (#13952) — thanks @fouadSalkini
  • feat(plugins): the editor plugin registers the host sdk telemetry hook behind an opt-in flag that defaults to off, marking matching inference calls without touching anything else (#14235) — thanks @maxmad64bis
  • feat(kiro): expose Kiro's provider-native Opus 5 Max effort tier — <base>-max in the Claude effort catalog, max in the Kiro effort values, and the adaptive-thinking envelope for claude-opus-5 — original change by tarciorick (#14284) — thanks @bufftop25
  • feat(sse): forward the auto mode classifier beta (dangerous-tool-use-2026-09-03) to Anthropic-format upstreams, and let anthropic-compatible-* providers forward client-negotiated betas at all, so Claude Code sessions behind the gateway stay eligible for server-side auto mode classification (#14312) — thanks @dpozimski
  • feat(oauth): Muse Code (Meta) device-authorization login with CLIProxyAPI-parity credential lifecycle — RFC 8628 against auth.meta.com, mint the subscription inference key at /muse-code/key, persist the durable dca: token, remint on 401 / DCA-only records, honor error.resets_at quota cooldowns, and import CLIProxyAPI type: meta auth files. Dual-auth keeps pasted META_API_KEY on the same card (#14329) — thanks @RaviTharuma
  • feat(routing): add opt-in planner/executor orchestration for two-model pipeline combos, with protocol-aware tool-loop detection, dynamic final ownership, native parallel tool calls, and bounded sequential rounds (#14346 #14616) — thanks @potatosips
  • feat(proxies): show each pool member's last seen egress IP next to the pool totals (#14364) — thanks @maxmad64bis
  • test(cli): add isolated real-binary smoke contracts with local sentinel authentication, response receipts, and bounded process-group cleanup (#14382)
  • test(cli): allow explicit inheritance of the harness's freshly sanitized environment so metadata controls reach real clients without exposing caller credentials or loader hooks (#14382)
  • feat(cli): Add remote/context-aware manual model CRUD with metadata validation, dry-run, protected override removal and persistence readback; prefer the public model catalog and keep JSON/JSONL complete. Manual models remain inference-unverified (#14392)
  • feat(sse): track Tavily API credit usage — tavily-search and tavily providers now read plan and account credit usage from GET https://api.tavily.com/usage, surfacing monthly credits in Dashboard › Limits and avoiding exhausted connections during search rotation (#14442) — thanks @HouMinXi
  • feat(providers): add Cloudflare Workers AI image generation (FLUX.1 Schnell, free tier) — reuses the existing cloudflare-ai chat provider's Account ID + API Token connection with no new credential type (#14443) — thanks @brick30llc-ctrl
  • feat(sse): Context7 rate-limit quota and usage in Provider Limits — reads the ratelimit-* headers of a keyed GET /api/v1/search probe (60 s cache, fail-open) so combo/round-robin rotation can skip exhausted context7 keys (#14454) — thanks @HouMinXi
  • feat(cli-tools): assign models to the review and Mixture-of-Agents roles from the dashboard — the Hermes agent already routes work to a dedicated review model and to the MoA reference/aggregator pair, but the config generator had no slots for them, so picking a different model meant hand-editing a file the dashboard would overwrite on the next save. The roles are now first-class and translated across all locales (#14455) — thanks @aldoeliacim
  • feat(dashboard): quota pools can now be scheduled. Each pool takes a list of time windows (days of the week + hours, in an IANA zone of its own) saying when OmniRoute may use its accounts: an allow window turns the pool into a whitelist, a block window is a blackout that always wins over an overlapping allow. Inside an open window two independent limits apply, either of which may be left off — keep free, one floor per metered quota window (5h, weekly, …, or any for whichever is most consumed), measured on the whole-account saturation signal so a human burning the same credentials pushes… (#14466) — thanks @davidebaraldo
  • feat(cli): add a copy-only dashboard companion with local/remote-context runbooks, explicit server-host status and credential-free command previews (#14494)
  • fix(compression): keep lossy compression off the default path, following HouMinXi's plan (dedup and whitespace stay on; summaries, relevance filters, and style rewrites are per-request) and KooshaPari's. Opt-in header: x-omniroute-compression: allow-lossy, engine:<id>, or a named combo @KooshaPari (#8251 #14529) — thanks @HouMinXi @KooshaPari @RaviTharuma
  • fix(resilience): follow HouMinXi's per-connection circuit breaker, so one account's failure no longer opens the breaker for every account on that provider. Proxy failures stay provider-wide. Model-scoped 400 patterns now live in one module, which is KooshaPari's @KooshaPari (#8251 #14530) — thanks @HouMinXi @KooshaPari @RaviTharuma
  • feat(providers): add expiry-first, a per-provider account fallback strategy that spends the quota closest to being lost. It ranks each account by how much it must burn per hour to avoid wasting its leftover at the next reset (usable / hoursUntilNearestReset), so a full account whose window closes soon outranks an equally full one that holds for days, while a nearly empty account never wins on its near reset alone. fill-first drains the top-priority account and lets the rest roll over unspent; on a four-account Codex pool that left an 88% account untouched through a reset. Distinct from reset-aware… (#14533) — thanks @feci
  • perf(logging): stop walking whole request bodies several times per request when PII sanitization is off: feature flag overrides are cached instead of one SQLite SELECT per string leaf, sanitizePayloadPII returns the payload by reference when the flag is off, pending-request previews are pruned to the preview shape before they are protected (strings are still protected whole and cut last), and the PII masker guardrail no longer JSON-clones every body. On 2 MB agentic bodies at 20 concurrent streams this removed ~12,800 flag lookups per request and cut TTFT p50 from 2.4 s to 1.7 s (#14535) — thanks @dpozimski
  • feat(opencode-plugin): features.diskCacheMaxAgeMs is an opt-in bound for the disk-cache fallback. Unset or 0 stays unbounded. Past a positive bound the snapshot is still served and the fallback log escalates from warn to error (#14540) — thanks @RaviTharuma
  • feat(providers): correlate CLIProxyAPI X-CPA-TRACE-ID auth_index with usage history and the sanitized account-health label (#14544) — thanks @RaviTharuma
  • feat(opencode): bound the Responses headers wait with an opt-in rotation budget (#14558) — thanks @maxmad64bis
  • feat(sse): tell stalled content streams apart from severed transport connections in stored stream error codes (#14582) — thanks @maxmad64bis
  • feat(sse): Codex catalog lists GPT-6 Sol (efforts -low through -ultra) and GPT-6 Luna (-low through -max) with Codex pricing; explicit max effort is no longer clamped to xhigh, and catalog effort tiers for every GPT-6 Codex model follow the live levels (#14677) — thanks @QuangBlue
  • feat(dashboard): Add a unified, searchable model catalog across all providers (#14684) — thanks @Dattuog
  • feat(dashboard): pool egress observation gains a per-exit failure breakdown by error family (#14749) — thanks @maxmad64bis
  • feat(proxy): a local-core entry can steer its selector to the next member when the existing set-aside sets it aside, without restarting the core (#14752) — thanks @maxmad64bis
  • feat(admin): pool members show set-aside state (reason, expected end, repeat count) and preference order (#14754) — thanks @maxmad64bis
  • feat(webhooks): emit proxy.set_aside when a pool member is temporarily set aside, plus proxy.pool.exhausted declarations for wildcard subscribers (#14755) — thanks @maxmad64bis
  • New PROXY_WEBHOOK_REBOUND_MS env (default 5 min, 1s–1h) caps repeat alerts per member so a burst of refusals sends one event (#14755) — thanks @maxmad64bis
  • feat(dashboard): proxy log journal shows received code, exit address, correlation and served account (#14777) — thanks @maxmad64bis
  • feat(calls): record rendered-content presence and usage provenance per request in the call log (#14795) — thanks @maxmad64bis
  • feat(proxy-health): the proxy health cell shows the last sweep verdict with cause and age (#14807) — thanks @maxmad64bis
  • feat(call-logs): show per-request recovery actions in the request log (#14810) — thanks @maxmad64bis
  • feat(proxy-logs): record per-attempt upstream headers duration on proxy log rows, plus opt-in first-chunk duration (PROXY_LOG_FIRST_CHUNK_TIMING), and show them in the proxy log detail (#14892) — thanks @maxmad64bis
  • feat(proxyHealth): a proxy that relays but whose target refuses the egress address now keeps a bounded per-proxy refusal streak (count, first and last seen, last cause and status) across sweeps and restarts, shown in the proxy health cell and on both health routes; a sweep that sees the proxy healthy ends the streak, and entries of deleted proxies are pruned on the next sweep. Observability only — selection is unchanged (#14938) — thanks @maxmad64bis
  • feat(providers): request Claude's model list with limit=1000, enable xAI API-key model passthrough, default XAI_OAUTH_LIVE_MODEL_DISCOVERY on, and persist autoSync: true on new Grok Build OAuth connections so newly published chat ids can appear without a seed bump (#14237) — thanks @HouMinXi
  • feat(i18n): New locale — Bosnian (bs) — across the dashboard, docs mirrors, CLI, README and the site (#14187) — thanks @jasminsehic
  • feat(dashboard): synced/imported models can now carry a manual context-window override. Rows imported through a provider's /models import had no edit affordance at all, so the override ` (#4125 #14337 #14356) — thanks @abhisheksharma2411
  • feat(db): per-request cost ledger + per-key tpm/rpm/monthly quota (RIC-741) (#13610) — thanks @luyuehm
  • feat(cli-tools): add Oh My Pi (omp) CLI detection and configuration support (#14178) — thanks @navanshjagetiya7-eng
  • feat(api): per-agent AgentBridge restore-default endpoint (re-land of (#13846 #14730)

🐛 Bug Fixes and 📝 Maintenance

1,454 fixes and 333 maintenance entries — listed in full, each with its PR and credit, in the attached CHANGELOG-v3.8.51.md.

🙌 Contributors

Thanks to everyone whose work landed in v3.8.51:

Contributor PRs / Issues
@5dive-bot #11852
@aaustinhuang #13201, #13206
@abhisheksharma2411 #11547, #11684, #11959, #12209, #12235, #13134, #13295, #13673, #13676, #13814, #13820, #14150, #14356, #14704, #14819
@adevwithpurpose #11464, #14156, #14832, #14848
@adityadwi21 #13776
@adivekar-utexas #12015, #12043, #12090, #12138, #12826, #14692, #14924, #14929, #14939, #14969
@afonsoft #13801, #13802, #13807, #14998, #15000, #15001, #15002
@agusgonzaleznic #14881
@ahmedhosnypro #13373
@ai-jeremi-esky #13874
@AIB1TAL0S #12103
@aldoeliacim #14287, #14448, #14455, #14930
@AlejandroAkbal #14965
@alexdrgpy06 #14452
@alfred-rootson #14252
@alltomatos #11448
@alpha-code2019 #12810
@alvinveroy #11857, #12027, #12165, #13002, #13004
@amaleta #11906, #11934
@amartinawi #11575
@amirrezakm #12309, #12310, #12948
@andrea-kingautomation #13785
@andreyzagid-tech #14215
@AndrianBalanescu #11083, #11830, #11834, #11844
@AnhLead #13378
@anhtahaylove #13091, #13092, #13093, #13096, #13097, #13100, #13106, #13109, #13114, #13155, #13166, #13171, #13175, #13187, #13196, #13289, #13292, #13315, #13630, #13778
@anhtran-ai #13167, #14090
@aniruddhaadak80 #11760, #14844
@app #12554
@appscluster #13988
@Ardem2025 #7138, #9908, #9944, #13929, #14083, #14112
@aref-alapour #12799, #13957, #14344
@arjav1181 #13910
@arminanton #11461, #11513
@AStupidBear #11584, #13332, #13725
@atescivitci-cmd #12105
@b3nw #11970, #11971, #12147
@backryun #11259, #11950, #12075, #12076, #12078, #12079, #12081, #12082, #12181, #12228, #12239, #12255, #12258, #12277, #12367, #12423, #12524, #12538, #14052
@Beexly #12406
@benjaminkitt #11747
@benzntech #11614, #11615
@BillyOutlast #14159, #14361
@birdleandro-bit #13222
@Bl0ck154 #11948, #11951, #11952, #11953, #11954, #12311, #13090, #14244
@botii16 #12825
@brick30llc-ctrl #11752, #12242, #12252, #12262, #14443
@bufftop25 #14282, #14284
@caniko #12952
@cfigueiroa #14782
@Ch3fUlrich #14900
@chatchawan-simplewish #13223
@Chewji9875 #11455, #11875, #12028
@cheynetom #12058
@CodeStartUp #14672
@costajohnt #13895, #14009, #14010, #14273
@CrashCartCapital #13446
@cryptiklemur #13149, #13150, #13173, #13266, #14161, #15101
@dajiaohuang #13201, #13206
@dakaribeckerer-art #13993
@datrixlab #13159, #13320, #13321, #13322, #13323, #13327, #13328, #13329, #13333, #13334, #13335, #14172, #14173, #14459, #14460
@Dattuog #14684, #15051
@davidebaraldo #12222, #12304, #13074, #14466
@davidlinfr #6390
@ddarkr #12124
@Deftera186 #11809
@delafu #13803
@DenXio101 #13798
@developerjillur #14925
@dmlanday #12484, #12485
@domenicomassafra #13168, #13659, #13809, #13810, #14216
@doramirdor #13056
@dpozimski #11945, #13635, #14312, #14535
@drmikecrypto #12565
@ducphamtien-fonos #13128
@DW-MediaLab #12229
@dylanhaskins #13856
@easypathuni #13312
@echel0nn #11923
@Egorich-print #12388
@EkoSaputro14 #13930
@elielsousa-pathbit #13444, #13793
@Ercaner1988 #14203
@f9td56dbgh-hub #11660
@fabioluissilva #11991
@Falco20100 #13913
@feci #14533
@fewensa #13861
@fidelix #12989, #13790, #14870
@foreveryh #12177
@formilw #13784, #13919, #14374
@fouadSalkini #12585, #13466, #13666, #13670, #13951, #13952, #13994, #14188, #14197, #14311, #14314, #14585, #14694, #14801, #14878, #14879
@ftevxk #13772
@Gaulnews #12520
@geek007git #12115, #12116, #12117, #12120, #12122
@geekyNads #11784, #12266, #14541
@ggdayup #13533, #13548
@ggiak #11561, #12276, #12350, #12402, #13295
@giauphan #13324
@gonisulaimann #12368, #12369, #12371, #12735, #12736, #13741, #14153, #14155, #14164, #14184, #14185, #14271, #14275, #14281, #14285, #14412, #14586, #14686, #14689, #14700, #14703, #14705, #14709, #14710
@Gorillaz322 #12207
@groovecityJO #12682
@Hakarioz #14049
@hartmark #11434, #11452, #11473, #11499, #11703, #11983, #11984, #11985, #11986, #11988, #11989, #11990, #11994, #12221, #12293, #12445, #12446, #12447, #12448, #12460, #12461, #12623, #12646, #12650, #12680, #12717, #12718, #12727, #12741, #12854, #12995, #12999, #13071, #13078, #13079, #13115, #13338, #13573, #13687, #13749, #14279, #14806
@hizzt #11894
@honeypot55 #13751
@hongnoul #11484
@HouMinXi #11411, #11414, #11512, #11518, #11520, #11641, #11642, #11643, #11687, #11779, #11849, #11850, #11851, #11915, #11916, #11918, #11919, #11920, #12013, #12017, #12033, #12042, #12106, #12139, #12166, #12169, #12171, #12205, #12213, #12312, #12325, #12487, #12488, #12495, #12504, #12557, #12566, #12590, #12591, #12624, #12626, #12632, #12637, #12678, #12696, #12697, #12711, #12733, #12746, #12767, #12770, #12789, #12803, #12805, #12811, #12866, #12868, #12899, #12926, #12934, #12950, #12951, #12974, #13001, #13006, #13011, #13017, #13026, #13027, #13034, #13035, #13038, #13042, #13050, #13060, #13061, #13069, #13107, #13120, #13136, #13178, #13195, #13197, #13331, #13344, #13398, #13399, #13445, #13463, #13518, #13560, #13572, #13626, #13628, #13636, #13643, #13655, #13701, #13717, #13720, #13857, #13859, #13865, #13898, #13902, #13903, #13955, #14005, #14014, #14054, #14063, #14064, #14065, #14066, #14075, #14113, #14201, #14237, #14260, #14310, #14438, #14442, #14454, #14462, #14474, #14478, #14525, #14529, #14530, #14542, #14593, #14607, #14625, #14626, #14627, #14664, #14732, #14734, #14838, #14842, #14849, #14886, #14894, #14899, #14912, #14913, #14914, #14915, #14921, #14928, #14979, #14983, #14987, #15017, #15019, #15020, #15038, #15039, #15040, #15041, #15042, #15043, #15044, #15045, #15046, #15047, #15048, #15050, #15060, #15063, #15064, #15066, #15067, #15068, #15119, #15120, #15121
@Hsia97 #11624
@hubo1989 #13754
@hummern #13647
@IAMBOBJIM #12972
@Iammilansoni #13969
@IbrahimKhan12 #14549
@initguru #12901, #12902, #12903, #12904, #12905, #12906, #12908, #12909, #12910, #12911, #12912, #12913
@insoln #12668, #12737, #12754, #12755, #12830, #12859, #12864, #12954, #12955, #12956, #12957, #13636
@isavage #13663
@ishan-parihar #14247
@iuiu-py #14293
@jacobsparts #11854, #12155, #12167
@jasminsehic #12935, #14187
@JasonBroderick #13072
@jbovard2016 #13623
@Jehu #14633, #15011
@jmche #13031
@Joaquinbrialva #14549
@joglomedia #11980
@jonlwheat2-gif #11443, #11450, #11549, #11567, #11608, #11633, #11635, #11640, #11644, #11671, #11672, #11673, #11674, #11675, #11676, #11677, #11706, #11783, #12051, #12052, #12053, #12055, #13567
@JxnLexn #12471, #13299, #13434, #13555, #13556, #14175, #14176, #14276, #14278, #14751, #14827, #14876
@kanade-hoshino #12180
@kang-heewon #14059
@Karan825 #11861
@kareem-jalal #8169
@KaspaPulse #11389, #11469, #11628, #11666, #11910
@kaung-minkhant #14114
@keeltrace #12080, #12223, #12763, #12818, #14444
@keii-2596 #13709
@KelvinKSPS #13808
@khnker #13649
@killer30001000 #12178, #12468
@Kizuno18 #12340
@KooshaPari #12470, #12592, #12667, #12699, #12703, #12706, #12764, #12769, #12771, #13123, #13143, #13300, #13301, #13302, #13340, #13401, #13403, #13404, #13405, #13406, #13407, #13409, #13410, #13411, #13412, #13413, #13414, #13418, #13419, #13423, #13424, #13427, #13433, #13522, #13523, #13524, #13525, #13528, #13531, #13532, #13534, #13539, #13543, #13545, #13546, #13547, #13550, #13551, #13553
@kriptoburak #11370
@KrzysiekSko #12425, #12432, #12673
@L4XB #13622, #13624, #13738, #14729
@Laksopan23 #14673, #14675, #14828
@legas888Oleg #13825
@LeMonBLOCK #8169
@ljluestc #12161
@lorenzozanee #13761, #13762, #13763, #13764, #13765, #13766, #13767, #13768, #14209, #14210, #14211, #14219, #14263, #14264, #14697, #14785, #14813, #14814, #14818, #14826, #14964
@luw2007 #13849
@luyuehm #13610, #13611, #13639
@marcelokarval direct commit / report
@marcothedood #14613
@marcs7 #13637
@marioschoenert-code #13162
@marshalfevzi #13756
@maxmad64bis #1622, #11435, #11437, #11441, #11537, #11550, #11553, #11555, #11557, #11812, #11842, #11843, #11903, #12151, #12214, #12215, #12218, #12226, #12314, #12316, #12317, #12318, #12319, #12320, #12321, #12507, #12715, #12731, #12744, #12786, #12787, #12788, #12790, #12792, #12794, #12795, #12828, #12832, #12853, #12857, #12870, #12937, #12941, #12975, #13141, #13142, #13146, #13147, #13153, #13217, #13218, #13279, #13280, #13281, #13436, #13438, #13439, #13440, #13441, #13471, #13484, #13498, #13577, #13578, #13580, #13581, #13582, #13602, #13605, #13606, #13607, #13608, #13609, #13612, #13613, #13614, #13615, #13633, #13641, #13645, #13646, #13650, #13657, #13671, #13672, #13686, #13795, #13923, #13924, #14011, #14013, #14029, #14148, #14149, #14151, #14179, #14202, #14213, #14218, #14220, #14221, #14222, #14223, #14226, #14231, #14233, #14234, #14235, #14236, #14251, #14253, #14290, #14319, #14353, #14364, #14370, #14464, #14558, #14579, #14581, #14582, #14588, #14620, #14621, #14623, #14637, #14639, #14655, #14656, #14657, #14658, #14659, #14669, #14679, #14680, #14681, #14687, #14688, #14691, #14706, #14707, #14708, #14749, #14750, #14752, #14754, #14755, #14756, #14775, #14776, #14777, #14789, #14790, #14791, #14792, #14793, #14794, #14795, #14796, #14797, #14802, #14804, #14807, #14808, #14809, #14810, #14891, #14892, #14934, #14938, #14940, #15004, #15005, #15077
@mdigitalbh81 #12240, #13571, #14162, #15010, #15033
@Meet6338-X #11598, #11609, #12110
@mhenke #14230
@MikeTuev #14674, #14735, #14737
@milunmoghe #14670
@Mistertelecom #14056, #14108, #14120, #14123, #14125
@morpheus9393 #11943, #13759
@Moseyuh333 #13642, #14895
@MumuTW #11492, #11502, #11506, #11507, #11626, #11675, #11685, #11728, #11746, #11888, #11889, #11890, #11892, #13408
@nahdd123uosackr #13174, #13193
@NaNomicon #13806
@navanshjagetiya7-eng #14178
@Neuron-Mr-White #11622, #11801, #12256, #12492, #12855, #14903
@NightStalker-87 #12183
@Nikita75699 #14272
@Notaloop763 #13689
@NoxzRCW #11879, #11880, #11881, #11882, #11883, #11935
@ntdat812 #11585, #12095, #12836, #12858
@ntdatt812 #11368, #11573, #11574, #11576, #11577, #11580, #11582, #11583, #11588, #11589, #11590, #11591, #11592, #11593, #11672, #12177, #12180, #12873, #12918, #12920, #12921, #12925, #12930, #13007, #13009, #13024, #13025, #13083, #13087, #13101, #13104, #13110
@official-burak #11542
@ogunlowoaamos #14541
@oleksandr1811 #13777
@opensource-elearning #12179, #12189, #12278, #12286, #13566, #13852
@Orion1943 #13779
@oyi77 #11408, #11409, #11421, #11505, #11677, #12036, #12038, #12110, #13702, #14868
@ozeas #13140
@pacocartones #11521, #11522, #11527, #11528, #11529, #11530, #11531, #11532, #11533, #11534, #11595, #11599, #11603, #11604, #11605, #11607, #11610, #11676, #11714, #11716, #11718, #11767, #11838, #11860, #11862, #11869, #11871, #11872, #11873, #11903, #11906, #11921, #11934, #12356, #12358, #12359, #12360, #12361, #12362, #12364, #12365, #12373, #12374, #12375, #12376, #12377, #12379, #12380, #12381, #12386, #12387, #12389, #12390, #12394, #12395, #12397, #12401, #12403, #12404, #12522, #12523, #12535, #12536, #12540, #12541, #12543, #12545, #12548, #12549, #12550, #12551, #12552, #12647, #12651, #12653, #13055, #13676, #13837, #13838, #13839, #13841, #13842, #13843, #13844, #13845, #14048, #14093, #14094, #14095, #14097, #14098, #14099, #14100
@pan17 #13799
@pandudpn #13823
@patrykkopycinski #11936, #11937, #12224, #12723, #12742, #12885, #13037, #13355, #13357, #13358, #13359, #13448, #13617, #13627, #14561
@PauloFH #11509
@PauloHSOliveira #12241
@peridot-augustus #14605
@peterbussch #14289, #14923
@Petrusreno #14354, #14991
@phamtienduceng-eng #13775
@phs1997 #13972
@PixmaNts #12462, #12474
@Pllutonyy #12838, #12839
@ponkcore #12054
@potatosips #14616
@prabhtheone #13992, #14117, #14164, #14812
@prabhu-omkar #13579
@Prajeeth-12 #11634, #12046
@pranay-gpt #13771
@ProphetOfDoom-PoD #13797, #13908
@qinghuanandejiangshi #13819
@QuangBlue #14596, #14597, #14598, #14609, #14615, #14632, #14636, #14649, #14650, #14653, #14677, #14720, #14721, #14738, #14739, #14740, #14741, #14816, #14825, #14829, #14837, #14839, #14917, #14919, #14920, #14974, #14975, #14978, #15036, #15037, #15074
@quiterunner-commits #12131, #12143
@rafacpti23 #11554, #11558, #12192, #12197, #12198, #12202, #12203, #12204, #12841, #14076, #14140, #14143, #14144, #14147
@rafaeldrincon #13487, #14871
@rafazafar #13156
@ragnar-claude #11564
@raheemuddin786 #11491, #11828, #11839, #11840, #11841, #12003, #12230, #12231, #12232, #12233, #12234, #12961
@rahilmavani #11761
@Rahulsharma0810 #11771, #13758
@rapha4lx #14576
@RaviTharuma #11710, #11727, #11797, #11798, #11802, #11805, #11806, #11811, #12098, #12099, #12101, #12449, #12452, #12472, #12473, #12493, #12533, #12607, #12628, #12631, #12636, #12875, #12876, #12880, #12882, #12884, #13185, #13426, #13783, #14069, #14088, #14329, #14526, #14529, #14530, #14540, #14544, #14624, #14643, #14644, #14645, #14646, #14647, #14652
@retroamx #13189
@rezjalibd #12186
@RhianB14 #11692
@ricardusx #13770
@Rick7C2 #13008
@riez #13888
@rifqiawl #11517, #11519, #11969
@rolemiaster #13769
@rqzbeh #11390, #12525
@Sabeekhann #11699, #11705
@sahildaswani #13831
@santosraju99-hub #11755, #11770
@SCys #12562, #14316, #14349, #14824
@seanford #13733, #13740
@Seramicx #11568
@Sharang8601 #14622
@Sheshiyer #13047
@shipsfromrio #14941, #14942, #14943, #14945, #14946, #14949, #14950, #14951, #14953, #14954, #14955, #14956, #14957, #14958, #14959
@shubhayu-dev #14347
@SIGTERM-015 #13219
@sistemabritto #13352
@Siva010 #12191, #12785
@skygunner #15053, #15055
@smkzw #14307
@smshagor-dev #13863, #13867
@soaoen #14523
@solstxce #11597
@sonirahul #12872
@soroush5 #12691, #13753, #13755, #14205
@sprintberlin #13561, #14190, #14259, #14490
@Stazyu #12497
@steve25060 #14006
@stormsia #13984
@sxh313 #14340, #14345, #14374
@tanveer-arch #12442, #12443
@tauanbinato #14972
@tenshiak #12279
@texastoland #13800, #14214, #14555
@TheDemonTuan #11468, #11470, #11471, #11482, #11548, #11758, #11775, #11814, #12933, #13848, #13956
@themedexperiencesusa #13350
@TheRealAlexV #14873
@ThiagoMafra-Integrare #12863, #13780
@thomasmaerz #12688, #12834
@tiangao88 #12814, #12982, #14001
@tolgaaksoy #13786, #13787
@toor11 #12663, #12664, #15018
@TrippyEngineer #9057
@trycohn #13864, #13967
@tuandinh0801 #11454, #13013, #13015, #13020, #13021, #13318, #13705
@turbolego #11621, #11762, #11772, #11774, #11781, #12216, #12337, #13040, #13041
@Tushar49 #11392
@ujjawalkaushik1110 #11863
@Vaishnavi220506 #14594
@valimwiliam2020-art #14336, #14348, #14367
@vamshiOmniWorks #14280
@VardoKen #14207
@ventulus95 #13317
@vermasomesh835 #11794
@VictorRP7 #13226
@VIPKaiser #13920, #14315, #14342, #14345, #14583, #14584
@visheshgubrani #12966
@voidstackloop #13342, #13773
@vsd2807 #11565, #11619
@wahidsadik371-coder #12126
@watchingdogs #12031
@wenzetan #14477
@wildcard #11620
@wofiporia #12629
@woodsonl #12686, #12730, #13938, #14324, #14551, #14589, #14723, #14766, #14768
@xiaoyaner0201 #11460, #11662, #12083, #13293, #13711, #13746, #14164, #14457, #14641, #14986
@xiechimon #13750, #13855, #14115, #14164, #14242, #14243, #14291, #14300, #14350, #14538, #14556, #14562, #14595
@Xore #13383, #13792
@Xxx91n #11690
@yelsoft16 #14845
@yourspraveen #11146
@ysntony #13046, #14246
@yugui923 #14228
@yxyxy #11671
@zachary-frederich #12993
@ZaimMarzuki #11960, #12553, #12891, #13029
@Zartharas #11340
@zcrew0x #13690
@zeeshanhaque21 #13708
@zero-executioner #11631
@zhiru #14133
@Zicocoder #14122
@diegosouzapw maintainer

Don't miss a new OmniRoute release

NewReleases is sending notifications on new releases.