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-firstaccount 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/responsessubpath, 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/responsescompression 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/subscriptionroutes only through plan-included connections with a documented hard-stop overage and fails closed on exhaustion, whileauto/thriftyorders the poolsubscription → keyless → free → cheap → premiumand 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 whoseresetAthas 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/modelVisibilityDenylistsettings pair to curate exactly which models/v1/modelsadvertises, mirrored into everyauto/*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-bridgeprovenance (#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=audiooperation 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/drilldownconsumer 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 explicitsuccess/absent/transient_failureoutcome — 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/modelspicks 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 idseekai(aliasska),https://seekai.cc/v1, live/v1/modelsviapassthroughModels, 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|maxreasoning) and routezaiGLM-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.modelSortand 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 andhidePaidModelsrespects it even for providers outside the free budget (#11843) — thanks @maxmad64bis - feat(nodejs): add
5diveas aconfiguretarget —omniroute configure 5dive/omniroute setup-5divewrite a 5dive auth profile that points an agent fleet'sclaudeseats at OmniRoute, with the root-only write, the loopback-vs-httpsendpoint rule and the per-seat model pin handled explicitly (#11852) — thanks @5dive-bot - feat(sse): treat
maxas a first-class reasoning-effort tier and clamp per model family (GLM 5.1+/DeepSeek V4+/Kimi K3+ keep nativemax; o1/MiniMax/Grok/Muse Spark clamp to their upstream ceiling) (#11875) — thanks @Chewji9875 - feat(providers): the provider plugin manifest now advertises a
usage-fetchcapability for the 40 providers that have a wired usage/quota fetcher, so external dashboards can read it fromGET /api/v1/provider-plugin-manifestinstead of parsingopen-sse/services/usage.tsafter every release. Discovery only — no new fetcher, no quota change, and the Dashboard quota widget stays gated byUSAGE_SUPPORTED_PROVIDERS.USAGE_FETCHER_PROVIDERSmoved to a zero-dependency leaf (open-sse/services/usage/fetcherProviders.ts) and is re-exported fromservices/usage.ts, keeping the manifest module a light leaf… (#11903) — thanks @maxmad64bis @pacocartones - feat(plugins):
OMNIROUTE_PLUGINS_DIRsets the directory the runtime plugin scanner reads — and the root the plugin manager installs into — overriding theHOME-derived default, so a Docker/K8s deployment can point straight at its bind-mounted plugin tree instead of movingHOMEjust to relocate the scan path. An image that exports no home no longer scans/tmp/.omniroute/pluginsin silence: the resolved directory is logged once at startup asscanner.dir_resolved, naming the input that won. Unset, behaviour is unchanged. Distinct from the CLI-onlyOMNIROUTE_PLUGIN_PATH, which findsomniroute-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
baseUrlso imported OpenAI-compat nodes surface on the provider card (#12108 #12495) — thanks @HouMinXi - feat(routing): add a
scoreAuto router strategy that selects the highest configured weighted score and reusesexplorationRate(#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-supportedcapability 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-fetchresolves on id or alias (the usage dispatcher accepts both);usage-supportedresolves on id alone, matching the runtime guardUSAGE_SUPPORTED_PROVIDERS.includes(providerId).USAGE_SUPPORTED_PROVIDERSmoved 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=reliabilityand 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 themaxEvents/maxBytescap check, eliminating ~9,800 wastedstructuredClonecalls per streaming response (65–71% fasterpush()). 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
headroomUrlthrough Settings so status/start use the operator URL instead of onlyHEADROOM_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
stabilityas 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 weight0, 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 carriesfreeAccessExclusionsaying 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 separateexcludeTosAvoidguard 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/levelreturnsstreak: { current, longest }(per key withapiKeyId, 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/leaderboardattachesnameper 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
commoncatalog (newcommon.suspiciouskey propagated to every locale) — add it to the Gamification sidebar group asgamification-admin(/dashboard/gamification/admin), and expose the loading and empty states as politerole="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-localeadds a language to config, dashboard, docs mirrors, CLI, README/indexes and site in one command; browser, CLI and cookie detection resolveuk,fil/tl,zh-Hant(and the retired legacyin→id) via config aliases;config/i18n.jsonnow 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 --adoptrestores.i18n-state.json;sync-language-barsgenerates 🌐 bars from config;validate_translation.py… (#12496) - feat(api): Emit gateway-measured
tokens_per_second(TTFT excluded) on streaming usage andX-OmniRoute-Tokens-Per-Secondwhen 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 winningX-OmniRoute-Modelonto the JSON/SSE body OpenCode already consumes. Missing tok/s is left unset (nevertokens / 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
agyandantigravitylive catalogs soagy/gemini-3.8-flash-highis not rejected after the prefix folds toantigravity(#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 theapiblock, the pre-apitop-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_VARIANTSfeature 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
JobRegistrycron, 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 intoincludeBodiesto 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
/v1endpoint, with per-request HMAC-SHA1→SM3→AES request signing, live model + context-window discovery from/models/get_config, and prompted tool-calling translated to OpenAItool_calls(#11461) — thanks @arminanton - feat(providers): MaxAI vision input — image_url content parts are forwarded inline in
message_contentto 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 viadoc_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/searchroutes to Nimble's search API atlitedepth (locale, freshness and include/exclude domain filters mapped onto the shared request contract), and/v1/web/fetchroutes 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-npmjob publishes with a short-lived credential minted from GitHub's id-token — noNPM_TOKEN, no 2FA prompt, provenance attached.publish_mode=staged(owner approves with 2FA) anddirect(token) remain available onworkflow_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 useprovider/modelformat (e.g.anthropic/claude-sonnet-4-6,openai/gpt-5); live model catalog athttps://api.opper.ai/v3/compat/models; entry mirrorsrequesty(same shape,passthroughModels: true, no static seed) (#11629) - feat(dashboard): the
/dashboard/orchestrationsnapshot hook now subscribes to theagentsWebSocket channel (agent.task.updated) instead ofrequestsas 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/OverflowNoderendering, the?node=/overflow-click page routing, the Agents-tab orchestrator-click no-op andshowCompletedtoggle, and the overview kanban's done-column sort order (#12270 #12271 #12393) - New
/dashboard/orchestrationpage: 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 thea2a_taskstable (purged after 30 days, configurable viaOMNIROUTE_A2A_HISTORY_RETENTION_DAYS) and served by the newGET /api/a2a/tasks/historylisting 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
/a2aJSON-RPC endpoint, which authenticates with an API key only (REQUIRE_API_KEY=trueor 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 amemory_hitshistory event, purely for observability — the retrieved memory is never injected into a skill's prompt or behavior. Gated by theOMNIROUTE_A2A_MEMORY_HITSkill-switch (default enabled; set to0to 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-modelmax_output_tokenscompatibility (#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-keyauth (never-expiringuai_sk_live_key),POST /chat/completionswith streaming SSE and native tool-calling, and the full live metered catalog (82 models across 15 providers, discovered from the publicGET /v1/models). Registered as provideruc-direct(aliasucd). Complements the un-metereducpersona 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_bonusandbadge_unlockXP rewards.XP_REWARDSlisted both rewards but the award pipeline never paid them: the private reward table inevents.tsomitted them,updateStreak()did not report when a streak extended, and badge unlocks carried no XP. Every request that extends a daily streak now paysstreak_bonus × streak lengthonce per UTC day (guarded by a same-dayxp_audit_logcheck), and every badge unlocked through the pipeline paysbadge_unlockonce per badge (guarded by theuser_badgesprimary key;unlockBadge()now reports whether it inserted). Bonus XP flows through the sameaddXp+ level sync +… (#12522) — thanks @pacocartones - feat(providers): advertise a
free-tiercapability 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 viapassthroughModels. 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 viapassthroughModels. 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/modelscatalog (including the CN hostapi.agnes-ai.cn).agnes-1.5-flashnow forwards toagnes-3.0-flash. Video 2.5 pollsGET /v1/videos/{id}(not the V2.0/agnesapicontract). 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 (
-lowthrough-ultra); Codex CLI identity pins@openai/codex@0.153.4in 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 - leftdelta 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 inscripts/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 ontoUsageQuotainproviderSpecificData.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
llmgatewayprovider now reads its monthly plan-credit and weekly premium-model allowance fromGET /v1/keyand 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:portwhen 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.tsmodule + 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/keysacceptsexpiresAt(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=1turns 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 theauto/claude-haikufast variant to the built-in routing catalog, including barek3models 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_scopedentry inlimits[], which OmniRoute ignored, so the pool was invisible. The provider-limits cache keepsmodelQuotasand 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
useCopyToClipboardhook to copy that column's response text and show a checkmark whiledisabledon 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 literalauto, 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_effortis an OpenAI-shaped field, so a Claude- or Gemini-targeted request is unaffected). Opt in viaX-OmniRoute-Effort: autoor a model'sdefaultReasoningEffort: "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_FAILEDfeature 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_OBSERVATIONfeature 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 minutesand 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.updateFromResponseBodynow parses that phrasing (andN 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 refillsNevery window with calls spreadwindow / Napart, and records it inlearnedRateLimits. 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_FAILEDfeature 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 viasetImmediate; 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 newRERANK_REMOTE_PROVIDER_NODESfeature flag (default off), subject to the provider outbound URL policy; the loopback host check is consolidated into@/shared/network/loopbackNodeHostshared by rerank, audio, and the local health checker (#13732 #13733) — thanks @seanford - feat(security): OmniRoute now warns at boot when the server that answers
/v1inference is bound to a non-loopback interface whileREQUIRE_API_KEYis disabled. The guard added in and the live dashboard WebSocket, but not the Next server that actually serves/v1/chat/completionsand/v1/responses— which bindsHOST || 0.0.0.0, every interface by default. That matters becauseGET /v1/modelsfollows the dashboard login posture (requireAuthForModels) while inference followsREQUIRE_API_KEY, so an instance with an admin password andREQUIRE_API_KEY=falseanswers401to 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-siterewrites 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, envOMNIROUTE_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: nullclears 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-cnpointed athttps://api.agnes-ai.cn/v1. Keys issued forapihub.agnes-ai.comstay on the existingagnescard. Live/v1/modelson that host listsagnes-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(defaulttrue) to gate the built-inauto/*combos, which previously bypassed a key'sallowedCombos/allowedModels/blockedModelsrestrictions entirely — a restricted key could still reach any model throughauto/best-fast. Also adds a per-keycatalogScope(all/combos/models) to control what/v1/modelsadvertises, 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 withanthropic-usage-limit: slowand 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'sslow-retry-after, bounded byslow-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-cardroute (GETlists,POSTredeems). List and redeem requests egress through the connection's proxy and honor exclusive-lease isolation; z.ai'srequestIdis 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). WhenOMNIROUTE_SELF_HOSTED_PROVIDERS(inline YAML) orOMNIROUTE_SELF_HOSTED_PROVIDERS_FILEis set, the existing/v1/chat/completionsroute 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 thex-omniroute-providerheader, aprovider/model(orprovider::model) model prefix, or the first configured provider; upstream credentials stay runtime-only and are stripped from echoed responses. OptionalOMNIROUTE_SELF_HOSTED_API_KEYguards the entry… (#13611) — thanks @luyuehm - feat(routing): deterministic routing strategies for the self-hosted entry (
strategy:block, M2/RIC-740). The unified/v1/chat/completionsentry (RIC-738) now accepts a declarativestrategy:block — inline in the providers YAML or viaOMNIROUTE_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 (cheapestcostPer1MInputfirst), latency-aware (fastest recent average first), and an explicitfallbackChainorder. 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/modelsdiscovery config withxai-oauthso 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
/modelsdiscovery throughhttps://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
stickyRoundRobinLimitandconnectionAwareExpansionwhen the current strategy has no editor for them, matchingsanitizeComboRuntimeConfig(#13370 #14014) — thanks @HouMinXi - feat(dashboard): request timeline plots MCP tool invocations from
mcp_tool_auditnext 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, notOMNIROUTE_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
sdktelemetry 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>-maxin the Claude effort catalog,maxin the Kiro effort values, and the adaptive-thinking envelope forclaude-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 letanthropic-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 durabledca:token, remint on 401 / DCA-only records, honorerror.resets_atquota cooldowns, and import CLIProxyAPItype: metaauth files. Dual-auth keeps pastedMETA_API_KEYon 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-searchandtavilyproviders now read plan and account credit usage fromGET 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-aichat 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 keyedGET /api/v1/searchprobe (60 s cache, fail-open) so combo/round-robin rotation can skip exhaustedcontext7keys (#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
allowwindow turns the pool into a whitelist, ablockwindow is a blackout that always wins over an overlappingallow. 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, …, oranyfor 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-firstdrains 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 fromreset-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
SELECTper string leaf,sanitizePayloadPIIreturns 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.diskCacheMaxAgeMsis an opt-in bound for the disk-cache fallback. Unset or0stays 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-IDauth_indexwith 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
-lowthrough-ultra) and GPT-6 Luna (-lowthrough-max) with Codex pricing; explicitmaxeffort is no longer clamped toxhigh, 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_asidewhen a pool member is temporarily set aside, plusproxy.pool.exhausteddeclarations for wildcard subscribers (#14755) — thanks @maxmad64bis - New
PROXY_WEBHOOK_REBOUND_MSenv (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, defaultXAI_OAUTH_LIVE_MODEL_DISCOVERYon, and persistautoSync: trueon 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 |