omniroute 3.4.0 โ†’ 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +107 -0
  2. package/app/.next/BUILD_ID +1 -1
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/prerender-manifest.json +3 -3
  5. package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/audit/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  41. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  42. package/app/.next/server/app/_global-error.html +2 -2
  43. package/app/.next/server/app/_global-error.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  46. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  47. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  48. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  49. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  50. package/app/.next/server/app/api/system/version/route.js.nft.json +1 -1
  51. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  61. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  62. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  63. package/app/.next/server/chunks/[root-of-the-server]__00506b12._.js +3 -3
  64. package/app/.next/server/chunks/[root-of-the-server]__065579e2._.js +1 -1
  65. package/app/.next/server/chunks/[root-of-the-server]__0afaa15f._.js +1 -1
  66. package/app/.next/server/chunks/[root-of-the-server]__0d7861ae._.js +1 -1
  67. package/app/.next/server/chunks/[root-of-the-server]__18cfc934._.js +1 -1
  68. package/app/.next/server/chunks/[root-of-the-server]__28c3dc07._.js +1 -1
  69. package/app/.next/server/chunks/[root-of-the-server]__3cedce56._.js +1 -1
  70. package/app/.next/server/chunks/[root-of-the-server]__42f8ae2b._.js +1 -1
  71. package/app/.next/server/chunks/[root-of-the-server]__44e9e6ab._.js +1 -1
  72. package/app/.next/server/chunks/[root-of-the-server]__46e00e59._.js +1 -1
  73. package/app/.next/server/chunks/[root-of-the-server]__49ea8f9d._.js +1 -1
  74. package/app/.next/server/chunks/[root-of-the-server]__54fdae92._.js +1 -1
  75. package/app/.next/server/chunks/[root-of-the-server]__55469489._.js +1 -1
  76. package/app/.next/server/chunks/[root-of-the-server]__60f5aa24._.js +1 -1
  77. package/app/.next/server/chunks/[root-of-the-server]__620cd5d6._.js +1 -1
  78. package/app/.next/server/chunks/[root-of-the-server]__6cea0a3b._.js +1 -1
  79. package/app/.next/server/chunks/[root-of-the-server]__75958ae6._.js +1 -1
  80. package/app/.next/server/chunks/[root-of-the-server]__7ace0fcd._.js +1 -1
  81. package/app/.next/server/chunks/[root-of-the-server]__81696045._.js +1 -1
  82. package/app/.next/server/chunks/[root-of-the-server]__81cb2f10._.js +1 -1
  83. package/app/.next/server/chunks/[root-of-the-server]__82a16e48._.js +1 -1
  84. package/app/.next/server/chunks/[root-of-the-server]__85486e23._.js +1 -1
  85. package/app/.next/server/chunks/[root-of-the-server]__863ba23a._.js +1 -1
  86. package/app/.next/server/chunks/[root-of-the-server]__90ac0c12._.js +2 -2
  87. package/app/.next/server/chunks/[root-of-the-server]__929e2a6f._.js +1 -1
  88. package/app/.next/server/chunks/[root-of-the-server]__976c4cd3._.js +1 -1
  89. package/app/.next/server/chunks/[root-of-the-server]__98bcfee2._.js +2 -2
  90. package/app/.next/server/chunks/[root-of-the-server]__a32d3818._.js +1 -1
  91. package/app/.next/server/chunks/[root-of-the-server]__b756cf74._.js +1 -1
  92. package/app/.next/server/chunks/[root-of-the-server]__ba461ded._.js +1 -1
  93. package/app/.next/server/chunks/[root-of-the-server]__bfaa196f._.js +3 -3
  94. package/app/.next/server/chunks/[root-of-the-server]__cd397a19._.js +1 -1
  95. package/app/.next/server/chunks/[root-of-the-server]__d36f8208._.js +1 -1
  96. package/app/.next/server/chunks/[root-of-the-server]__d68b1385._.js +1 -1
  97. package/app/.next/server/chunks/[root-of-the-server]__d8230cae._.js +2 -2
  98. package/app/.next/server/chunks/[root-of-the-server]__ee20f39d._.js +1 -1
  99. package/app/.next/server/chunks/[root-of-the-server]__f1f0a45a._.js +1 -1
  100. package/app/.next/server/chunks/[root-of-the-server]__f46235a5._.js +1 -1
  101. package/app/.next/server/chunks/[root-of-the-server]__f894811a._.js +1 -1
  102. package/app/.next/server/chunks/[root-of-the-server]__fadc6492._.js +1 -1
  103. package/app/.next/server/chunks/_05c48915._.js +1 -1
  104. package/app/.next/server/chunks/_06515a8a._.js +1 -1
  105. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  106. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  107. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  108. package/app/.next/server/chunks/_68683848._.js +1 -1
  109. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  110. package/app/.next/server/chunks/ssr/[root-of-the-server]__9ef96d20._.js +1 -1
  111. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  112. package/app/.next/server/pages/500.html +2 -2
  113. package/app/.next/server/server-reference-manifest.js +1 -1
  114. package/app/.next/server/server-reference-manifest.json +1 -1
  115. package/app/.next/static/chunks/{fcf7178f8caed48a.js โ†’ b9e44dba32828555.js} +1 -1
  116. package/app/README.md +107 -0
  117. package/app/docs/i18n/ar/README.md +168 -30
  118. package/app/docs/i18n/bg/README.md +168 -30
  119. package/app/docs/i18n/da/README.md +168 -30
  120. package/app/docs/i18n/de/README.md +168 -30
  121. package/app/docs/i18n/es/README.md +168 -30
  122. package/app/docs/i18n/fi/README.md +168 -30
  123. package/app/docs/i18n/fr/README.md +168 -30
  124. package/app/docs/i18n/he/README.md +168 -30
  125. package/app/docs/i18n/hu/README.md +168 -30
  126. package/app/docs/i18n/id/README.md +168 -30
  127. package/app/docs/i18n/in/README.md +168 -30
  128. package/app/docs/i18n/it/README.md +168 -30
  129. package/app/docs/i18n/ja/README.md +168 -30
  130. package/app/docs/i18n/ko/README.md +168 -30
  131. package/app/docs/i18n/ms/README.md +168 -30
  132. package/app/docs/i18n/nl/README.md +168 -30
  133. package/app/docs/i18n/no/README.md +168 -30
  134. package/app/docs/i18n/phi/README.md +168 -30
  135. package/app/docs/i18n/pl/README.md +168 -30
  136. package/app/docs/i18n/pt/README.md +168 -30
  137. package/app/docs/i18n/pt-BR/README.md +168 -30
  138. package/app/docs/i18n/ro/README.md +168 -30
  139. package/app/docs/i18n/ru/README.md +168 -30
  140. package/app/docs/i18n/sk/README.md +168 -30
  141. package/app/docs/i18n/sv/README.md +168 -30
  142. package/app/docs/i18n/th/README.md +168 -30
  143. package/app/docs/i18n/uk-UA/README.md +168 -30
  144. package/app/docs/i18n/vi/README.md +168 -30
  145. package/app/docs/i18n/zh-CN/README.md +168 -30
  146. package/app/docs/openapi.yaml +1 -1
  147. package/app/package-lock.json +2 -2
  148. package/app/package.json +1 -1
  149. package/app/src/lib/apiBridgeServer.ts +2 -0
  150. package/app/src/shared/utils/apiAuth.ts +6 -1
  151. package/app/tests/integration/integration-wiring.test.mjs +4 -4
  152. package/package.json +1 -1
  153. /package/app/.next/static/{lM78WtVwkrUDAIJYkWgbP โ†’ 6GZ871m6mzG0Q0bvGX2dT}/_buildManifest.js +0 -0
  154. /package/app/.next/static/{lM78WtVwkrUDAIJYkWgbP โ†’ 6GZ871m6mzG0Q0bvGX2dT}/_clientMiddlewareManifest.json +0 -0
  155. /package/app/.next/static/{lM78WtVwkrUDAIJYkWgbP โ†’ 6GZ871m6mzG0Q0bvGX2dT}/_ssgManifest.js +0 -0
@@ -4,6 +4,7 @@
4
4
 
5
5
  ---
6
6
 
7
+
7
8
  ### Never stop coding. Smart routing to **FREE & low-cost AI models** with automatic fallback.
8
9
 
9
10
  _Your universal API proxy โ€” one endpoint, 67+ providers, zero downtime. Now with **MCP & A2A** agent orchestration._
@@ -30,6 +31,30 @@ _Your universal API proxy โ€” one endpoint, 67+ providers, zero downtime. Now wi
30
31
 
31
32
  ---
32
33
 
34
+ ## Breaking Change: Unified Logging Upgrade
35
+
36
+ > [!WARNING]
37
+ > **This release changes both the on-disk request log layout and the logging environment variables.**
38
+ >
39
+ > If you are upgrading an existing instance:
40
+ >
41
+ > - Request logs now live in `DATA_DIR/call_logs/YYYY-MM-DD/` as **one JSON artifact per request**.
42
+ > - The old `DATA_DIR/logs/` session folders and `DATA_DIR/log.txt` summary file are removed.
43
+ > - On the first startup after upgrading, OmniRoute creates a safety backup at `DATA_DIR/log_archives/*.zip` before removing the deprecated request log layout.
44
+ > - Legacy logging env vars such as `LOG_TO_FILE`, `LOG_FILE_PATH`, `LOG_MAX_FILE_SIZE`, `LOG_RETENTION_DAYS`, `LOG_LEVEL`, `LOG_FORMAT`, `ENABLE_REQUEST_LOGS`, `CALL_LOGS_MAX`, `CALL_LOG_PAYLOAD_MODE`, and `PROXY_LOG_MAX_ENTRIES` are no longer supported.
45
+ > - Use the new env model instead:
46
+ > - `APP_LOG_TO_FILE`
47
+ > - `APP_LOG_FILE_PATH`
48
+ > - `APP_LOG_MAX_FILE_SIZE`
49
+ > - `APP_LOG_RETENTION_DAYS`
50
+ > - `APP_LOG_LEVEL`
51
+ > - `APP_LOG_FORMAT`
52
+ > - `CALL_LOG_RETENTION_DAYS`
53
+ >
54
+ > For release details and upgrade notes, see the [CHANGELOG](CHANGELOG.md).
55
+
56
+ ---
57
+
33
58
  ## ๐Ÿ†• What's New in v3.0.0
34
59
 
35
60
  > **Upgrading from v2.9.5?** โ€” See the [full CHANGELOG](CHANGELOG.md#300--2026-03-22-release-candidate--not-yet-merged-to-main) for all changes.
@@ -203,7 +228,7 @@ When opening an issue, please run the system-info command and attach the generat
203
228
  npm run system-info
204
229
  ```
205
230
 
206
- This generates a `system-info.txt` with your Node.js version, OmniRoute version, OS details, installed CLI tools (iflow, gemini, claude, codex, antigravity, droid, etc.), Docker/PM2 status, and system packages โ€” everything we need to reproduce your issue quickly. Attach the file directly to your GitHub issue.
231
+ This generates a `system-info.txt` with your Node.js version, OmniRoute version, OS details, installed CLI tools (qoder, gemini, claude, codex, antigravity, droid, etc.), Docker/PM2 status, and system packages โ€” everything we need to reproduce your issue quickly. Attach the file directly to your GitHub issue.
207
232
 
208
233
  ---
209
234
 
@@ -229,7 +254,7 @@ This generates a `system-info.txt` with your Node.js version, OmniRoute version,
229
254
  โ”‚ โ†“ budget limit
230
255
  โ”œโ”€โ†’ [Tier 3: CHEAP] GLM ($0.6/1M), MiniMax ($0.2/1M)
231
256
  โ”‚ โ†“ budget limit
232
- โ””โ”€โ†’ [Tier 4: FREE] iFlow, Qwen, Kiro (unlimited)
257
+ โ””โ”€โ†’ [Tier 4: FREE] Qoder, Qwen, Kiro (unlimited)
233
258
 
234
259
  Result: Never stop coding, minimal cost
235
260
  ```
@@ -296,7 +321,7 @@ Not everyone can pay $20โ€“200/month for AI subscriptions. Students, devs from e
296
321
 
297
322
  **How OmniRoute solves it:**
298
323
 
299
- - **Free Tier Providers Built-in** โ€” Native support for 100% free providers: iFlow (5 unlimited models via OAuth: kimi-k2-thinking, qwen3-coder-plus, deepseek-r1, minimax-m2, kimi-k2), Qwen (4 unlimited models: qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next, vision-model), Kiro (Claude + AWS Builder ID for free), Gemini CLI (180K tokens/month free)
324
+ - **Free Tier Providers Built-in** โ€” Native support for 100% free providers: Qoder (5 unlimited models via OAuth: kimi-k2-thinking, qwen3-coder-plus, deepseek-r1, minimax-m2, kimi-k2), Qwen (4 unlimited models: qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next, vision-model), Kiro (Claude + AWS Builder ID for free), Gemini CLI (180K tokens/month free)
300
325
  - **Ollama Cloud** โ€” Cloud-hosted Ollama models at `api.ollama.com` with free "Light usage" tier; use `ollamacloud/<model>` prefix
301
326
  - **Free-Only Combos** โ€” Chain `gc/gemini-3-flash โ†’ if/kimi-k2-thinking โ†’ qw/qwen3-coder-plus` = $0/month with zero downtime
302
327
  - **NVIDIA NIM Free Access** โ€” ~40 RPM dev-forever free access to 70+ models at build.nvidia.com (transitioning from credits to pure rate limits)
@@ -360,7 +385,7 @@ Claude Code, Codex, Gemini CLI, Copilot โ€” all use OAuth 2.0 with expiring toke
360
385
  **How OmniRoute solves it:**
361
386
 
362
387
  - **Auto Token Refresh** โ€” OAuth tokens refresh in background before expiration
363
- - **OAuth 2.0 (PKCE) Built-in** โ€” Automatic flow for Claude Code, Codex, Gemini CLI, Copilot, Kiro, Qwen, iFlow
388
+ - **OAuth 2.0 (PKCE) Built-in** โ€” Automatic flow for Claude Code, Codex, Gemini CLI, Copilot, Kiro, Qwen, Qoder
364
389
  - **Multi-Account OAuth** โ€” Multiple accounts per provider via JWT/ID token extraction
365
390
  - **OAuth LAN/Remote Fix** โ€” Private IP detection for `redirect_uri` + manual URL mode for remote servers
366
391
  - **OAuth Behind Nginx** โ€” Uses `window.location.origin` for reverse proxy compatibility
@@ -413,7 +438,7 @@ Installing, configuring, and maintaining an AI proxy across different environmen
413
438
  - **Electron Desktop App** โ€” Native app for Windows/macOS/Linux with system tray, auto-start, offline mode
414
439
  - **Split-Port Mode** โ€” API and Dashboard on separate ports for advanced scenarios (reverse proxy, container networking)
415
440
  - **Cloud Sync** โ€” Config synchronization across devices via Cloudflare Workers
416
- - **DB Backups** โ€” Automatic backup, restore, export and import of all settings
441
+ - **DB Backups** โ€” Automatic backup, restore, export and import of all settings, with `DISABLE_SQLITE_AUTO_BACKUP` for externally managed backups
417
442
 
418
443
  </details>
419
444
 
@@ -737,7 +762,7 @@ Outcome: deep fallback depth for deadline-critical workloads
737
762
  | Step | Action | Providers Unlocked |
738
763
  | ---- | -------------------------------------------------- | ------------------------------------------------------------------ |
739
764
  | 1 | Connect **Kiro** (AWS Builder ID OAuth) | Claude Sonnet 4.5, Haiku 4.5 โ€” **unlimited** |
740
- | 2 | Connect **iFlow** (Google OAuth) | kimi-k2-thinking, qwen3-coder-plus, deepseek-r1... โ€” **unlimited** |
765
+ | 2 | Connect **Qoder** (Google OAuth) | kimi-k2-thinking, qwen3-coder-plus, deepseek-r1... โ€” **unlimited** |
741
766
  | 3 | Connect **Qwen** (Device Code) | qwen3-coder-plus, qwen3-coder-flash... โ€” **unlimited** |
742
767
  | 4 | Connect **Gemini CLI** (Google OAuth) | gemini-3-flash, gemini-2.5-pro โ€” **180K/mo free** |
743
768
  | 5 | `/dashboard/combos` โ†’ **Free Stack ($0)** template | Round-robin all free providers automatically |
@@ -838,6 +863,113 @@ npm install
838
863
  PORT=20128 DASHBOARD_PORT=20129 NEXT_PUBLIC_BASE_URL=http://localhost:20129 npm run dev
839
864
  ```
840
865
 
866
+ <details>
867
+ <summary><b>Void Linux (`xbps-src` template)</b></summary>
868
+
869
+ For Void Linux users, you can build a native package using `xbps-src`. Save this block as `srcpkgs/omniroute/template`:
870
+
871
+ ```bash
872
+ # Template file for 'omniroute'
873
+ pkgname=omniroute
874
+ version=3.4.1
875
+ revision=1
876
+ hostmakedepends="nodejs python3 make"
877
+ depends="openssl"
878
+ short_desc="Universal AI gateway with smart routing for multiple LLM providers"
879
+ maintainer="zenobit <zenobit@disroot.org>"
880
+ license="MIT"
881
+ homepage="https://github.com/diegosouzapw/OmniRoute"
882
+ distfiles="https://github.com/diegosouzapw/OmniRoute/archive/refs/tags/v${version}.tar.gz"
883
+ checksum=009400afee90a9f32599d8fe734145cfd84098140b7287990183dde45ae2245b
884
+ system_accounts="_omniroute"
885
+ omniroute_homedir="/var/lib/omniroute"
886
+ export NODE_ENV=production
887
+ export npm_config_engine_strict=false
888
+ export npm_config_loglevel=error
889
+ export npm_config_fund=false
890
+ export npm_config_audit=false
891
+
892
+ do_build() {
893
+ # Determine target CPU arch for node-gyp
894
+ local _gyp_arch
895
+ case "$XBPS_TARGET_MACHINE" in
896
+ aarch64*) _gyp_arch=arm64 ;;
897
+ armv7*|armv6*) _gyp_arch=arm ;;
898
+ i686*) _gyp_arch=ia32 ;;
899
+ *) _gyp_arch=x64 ;;
900
+ esac
901
+
902
+ # 1) Install all deps โ€“ skip scripts (no network in do_build, native modules
903
+ # compiled separately below; better-sqlite3 is serverExternalPackage so
904
+ # Next.js does not execute it during next build)
905
+ NODE_ENV=development npm ci --ignore-scripts
906
+
907
+ # 2) Build the Next.js standalone bundle
908
+ npm run build
909
+
910
+ # 3) Copy static assets into standalone
911
+ cp -r .next/static .next/standalone/.next/static
912
+ [ -d public ] && cp -r public .next/standalone/public || true
913
+
914
+ # 4) Compile better-sqlite3 native binding for the target architecture.
915
+ # Use node-gyp directly so CC/CXX from xbps-src cross-toolchain are used
916
+ # without npm altering them.
917
+ local _node_gyp=/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js
918
+ (cd node_modules/better-sqlite3 && node "$_node_gyp" rebuild --arch="$_gyp_arch")
919
+
920
+ # 5) Place the compiled binding into the standalone bundle
921
+ local _bs3_release=.next/standalone/node_modules/better-sqlite3/build/Release
922
+ mkdir -p "$_bs3_release"
923
+ cp node_modules/better-sqlite3/build/Release/better_sqlite3.node "$_bs3_release/"
924
+
925
+ # 6) Remove arch-specific sharp bundles โ€“ upstream sets images.unoptimized=true
926
+ # so sharp is not used at runtime; x64 .so files would break aarch64 strip
927
+ rm -rf .next/standalone/node_modules/@img
928
+
929
+ # 7) Copy pino runtime deps omitted by Next.js static analysis:
930
+ # pino-abstract-transport โ€“ required by pino's worker thread
931
+ # split2 โ€“ dep of pino-abstract-transport
932
+ # process-warning โ€“ dep of pino itself
933
+ for _mod in pino-abstract-transport split2 process-warning; do
934
+ cp -r "node_modules/$_mod" .next/standalone/node_modules/
935
+ done
936
+ }
937
+
938
+ do_check() {
939
+ npm run test:unit
940
+ }
941
+
942
+ do_install() {
943
+ vmkdir usr/lib/omniroute/.next
944
+
945
+ vcopy .next/standalone/. usr/lib/omniroute/.next/standalone
946
+
947
+ # Prevent removal of empty Next.js app router dirs by the post-install hook
948
+ for _d in \
949
+ .next/standalone/.next/server/app/dashboard \
950
+ .next/standalone/.next/server/app/dashboard/settings \
951
+ .next/standalone/.next/server/app/dashboard/providers; do
952
+ touch "${DESTDIR}/usr/lib/omniroute/${_d}/.keep"
953
+ done
954
+
955
+ cat > "${WRKDIR}/omniroute" <<'EOF'
956
+ #!/bin/sh
957
+ export PORT="${PORT:-20128}"
958
+ export DATA_DIR="${DATA_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/omniroute}"
959
+ export LOG_TO_FILE="${LOG_TO_FILE:-false}"
960
+ mkdir -p "${DATA_DIR}"
961
+ exec node /usr/lib/omniroute/.next/standalone/server.js "$@"
962
+ EOF
963
+ vbin "${WRKDIR}/omniroute"
964
+ }
965
+
966
+ post_install() {
967
+ vlicense LICENSE
968
+ }
969
+ ```
970
+
971
+ </details>
972
+
841
973
  ---
842
974
 
843
975
  ## ๐Ÿณ Docker
@@ -886,6 +1018,7 @@ Notes:
886
1018
 
887
1019
  - Quick Tunnel URLs are temporary and change after every restart.
888
1020
  - Managed install currently supports Linux, macOS, and Windows on `x64` / `arm64`.
1021
+ - Docker images bundle system CA roots and pass them to managed `cloudflared`, which avoids TLS trust failures when the tunnel bootstraps inside the container.
889
1022
  - Set `CLOUDFLARED_BIN=/absolute/path/to/cloudflared` if you want OmniRoute to use an existing binary instead of downloading one.
890
1023
 
891
1024
  **Using Docker Compose with Caddy (HTTPS Auto-TLS):**
@@ -983,7 +1116,7 @@ When minimized, OmniRoute lives in your system tray with quick actions:
983
1116
  | | MiniMax M2.1 | $0.2/1M | 5-hour rolling | Cheapest option |
984
1117
  | | Kimi K2.5 (Moonshot API) ๐Ÿ†• | Pay-per-use | None | Direct Moonshot API access |
985
1118
  | | Kimi K2 | $9/mo flat | 10M tokens/mo | Predictable cost |
986
- | **๐Ÿ†“ FREE** | iFlow | **$0** | Unlimited | 5 models unlimited |
1119
+ | **๐Ÿ†“ FREE** | Qoder | **$0** | Unlimited | 5 models unlimited |
987
1120
  | | Qwen | **$0** | Unlimited | 4 models unlimited |
988
1121
  | | Kiro | **$0** | Unlimited | Claude Sonnet/Haiku (AWS Builder) |
989
1122
  | | LongCat Flash-Lite ๐Ÿ†• | **$0** (50M tok/day ๐Ÿ”ฅ) | 1 RPS | Largest free quota on Earth |
@@ -998,7 +1131,7 @@ When minimized, OmniRoute lives in your system tray with quick actions:
998
1131
  ```
999
1132
  # ๐Ÿ†“ Ultimate Free Stack 2026 โ€” 11 Providers, $0 Forever
1000
1133
  Kiro (kr/) โ†’ Claude Sonnet/Haiku UNLIMITED
1001
- iFlow (if/) โ†’ kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED
1134
+ Qoder (if/) โ†’ kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED
1002
1135
  LongCat Lite (lc/) โ†’ LongCat-Flash-Lite โ€” 50M tokens/day ๐Ÿ”ฅ
1003
1136
  Pollinations (pol/) โ†’ GPT-5, Claude, DeepSeek, Llama 4 โ€” no key needed
1004
1137
  Qwen (qw/) โ†’ qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next UNLIMITED
@@ -1028,7 +1161,7 @@ Cerebras (cerebras/) โ†’ Llama/Qwen world-fastest โ€” 1M tok/day
1028
1161
  | `claude-haiku-4.5` | `kr/` | **Unlimited** | No reported daily cap |
1029
1162
  | `claude-opus-4.6` | `kr/` | **Unlimited** | Latest Opus via Kiro |
1030
1163
 
1031
- ### ๐ŸŸข IFLOW MODELS (Free OAuth โ€” No Credit Card)
1164
+ ### ๐ŸŸข QODER MODELS (Free OAuth โ€” No Credit Card)
1032
1165
 
1033
1166
  | Model | Prefix | Limit | Rate Limit |
1034
1167
  | ------------------ | ------ | ------------- | --------------- |
@@ -1127,7 +1260,7 @@ Available free: `qwen3-235b-a22b-instruct-2507` (Qwen3 235B!), `llama-3.1-70b-in
1127
1260
  >
1128
1261
  > ```
1129
1262
  > Kiro (kr/) โ†’ Claude Sonnet/Haiku UNLIMITED
1130
- > iFlow (if/) โ†’ kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED
1263
+ > Qoder (if/) โ†’ kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED
1131
1264
  > LongCat Lite (lc/) โ†’ LongCat-Flash-Lite โ€” 50M tokens/day ๐Ÿ”ฅ
1132
1265
  > Pollinations (pol/) โ†’ GPT-5, Claude, DeepSeek, Llama 4 โ€” no key needed
1133
1266
  > Qwen (qw/) โ†’ qwen3-coder models UNLIMITED
@@ -1279,21 +1412,22 @@ OmniRoute v2.0 is built as an operational platform, not just a relay proxy.
1279
1412
 
1280
1413
  ### โ˜๏ธ Deployment & Platform
1281
1414
 
1282
- | Feature | What It Does |
1283
- | ----------------------------- | --------------------------------------------------------- |
1284
- | ๐ŸŒ **Deploy Anywhere** | Localhost, VPS, Docker, Cloud environments |
1285
- | ๐Ÿš‡ **Cloudflare Tunnel** ๐Ÿ†• | One-click Quick Tunnel integration from the dashboard |
1286
- | ๐Ÿ’พ **Cloud Sync** | Configuration sync via cloud worker |
1287
- | ๐Ÿ”„ **Backup/Restore** | Export/import and disaster recovery flows |
1288
- | ๐Ÿง™ **Onboarding Wizard** | First-run guided setup |
1289
- | ๐Ÿ”ง **CLI Tools Dashboard** | One-click setup for popular coding tools |
1290
- | ๐ŸŽฎ **Model Playground** | Test any provider/model/endpoint from the dashboard |
1291
- | ๐Ÿ” **CLI Fingerprint Toggle** | Per-provider fingerprint matching in Settings > Security |
1292
- | ๐ŸŒ **i18n (30 languages)** | Full dashboard + docs language support with RTL coverage |
1293
- | ๐Ÿงน **Clear All Models** | One-click model list clearing in provider details |
1294
- | ๐Ÿ‘๏ธ **Sidebar Controls** ๐Ÿ†• | Hide components and integrations from Appearance Settings |
1295
- | ๐Ÿ“‹ **Issue Templates** | Standardized GitHub templates for bugs and features |
1296
- | ๐Ÿ“‚ **Custom Data Directory** | `DATA_DIR` override for storage location |
1415
+ | Feature | What It Does |
1416
+ | ------------------------------ | --------------------------------------------------------------------- |
1417
+ | ๐ŸŒ **Deploy Anywhere** | Localhost, VPS, Docker, Cloud environments |
1418
+ | ๐Ÿš‡ **Cloudflare Tunnel** ๐Ÿ†• | One-click Quick Tunnel integration from the dashboard |
1419
+ | ๐Ÿ”‘ **API Key Model Filtering** | Native /v1/models response filtered via assigned Bearer context roles |
1420
+ | โšก **Smart Cache Bypass** | Configurable TTL heuristics and forced refetch controls |
1421
+ | ๐Ÿ”„ **Backup/Restore** | Export/import and disaster recovery flows |
1422
+ | ๐Ÿง™ **Onboarding Wizard** | First-run guided setup |
1423
+ | ๐Ÿ”ง **CLI Tools Dashboard** | One-click setup for popular coding tools |
1424
+ | ๐ŸŽฎ **Model Playground** | Test any provider/model/endpoint from the dashboard |
1425
+ | ๐Ÿ” **CLI Fingerprint Toggle** | Per-provider fingerprint matching in Settings > Security |
1426
+ | ๐ŸŒ **i18n (30 languages)** | Full dashboard + docs language support with RTL coverage |
1427
+ | ๐Ÿงน **Clear All Models** | One-click model list clearing in provider details |
1428
+ | ๐Ÿ‘๏ธ **Sidebar Controls** ๐Ÿ†• | Hide components and integrations from Appearance Settings |
1429
+ | ๐Ÿ“‹ **Issue Templates** | Standardized GitHub templates for bugs and features |
1430
+ | ๐Ÿ“‚ **Custom Data Directory** | `DATA_DIR` override for storage location |
1297
1431
 
1298
1432
  ### Feature Deep Dive
1299
1433
 
@@ -1545,6 +1679,8 @@ Models:
1545
1679
 
1546
1680
  **Models:** Access 100+ models from all major providers through a single API key.
1547
1681
 
1682
+ **Dashboard behavior:** OpenRouter models are managed from **Available Models**. Manual add, import, and auto-sync all update the same list.
1683
+
1548
1684
  </details>
1549
1685
 
1550
1686
  <details>
@@ -1587,11 +1723,11 @@ Models:
1587
1723
  <details>
1588
1724
  <summary><b>๐Ÿ†“ FREE Providers (Emergency Backup)</b></summary>
1589
1725
 
1590
- ### iFlow (5 FREE models via OAuth)
1726
+ ### Qoder (5 FREE models via OAuth)
1591
1727
 
1592
1728
  ```bash
1593
- Dashboard โ†’ Connect iFlow
1594
- โ†’ iFlow OAuth login
1729
+ Dashboard โ†’ Connect Qoder
1730
+ โ†’ Qoder OAuth login
1595
1731
  โ†’ Unlimited usage
1596
1732
 
1597
1733
  Models:
@@ -1789,7 +1925,7 @@ opencode
1789
1925
 
1790
1926
  - Check usage stats in Dashboard โ†’ Costs
1791
1927
  - Switch primary model to GLM/MiniMax
1792
- - Use free tier (Gemini CLI, iFlow) for non-critical tasks
1928
+ - Use free tier (Gemini CLI, Qoder) for non-critical tasks
1793
1929
 
1794
1930
  **Dashboard/API ports are wrong**
1795
1931
 
@@ -1811,7 +1947,9 @@ opencode
1811
1947
 
1812
1948
  **No request logs**
1813
1949
 
1814
- - Set `ENABLE_REQUEST_LOGS=true` in `.env`
1950
+ - Request artifacts are written to `DATA_DIR/call_logs/` as one JSON file per request
1951
+ - Enable pipeline capture from Dashboard โ†’ Logs โ†’ Request Logs if you need detailed per-stage payloads
1952
+ - Set `APP_LOG_TO_FILE=true` if you also want application console logs in `logs/application/app.log`
1815
1953
 
1816
1954
  **Connection test shows "Invalid" for OpenAI-compatible providers**
1817
1955
 
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OmniRoute API
4
- version: 3.3.11
4
+ version: 3.4.1
5
5
  description: |
6
6
  OmniRoute is a local-first AI API proxy router. It provides an OpenAI-compatible
7
7
  endpoint that routes requests to multiple AI providers with load balancing,
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.4.0",
3
+ "version": "3.4.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omniroute",
9
- "version": "3.4.0",
9
+ "version": "3.4.1",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.4.0",
3
+ "version": "3.4.1",
4
4
  "description": "Smart AI Router with auto fallback โ€” route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -26,6 +26,8 @@ const OPENAI_COMPAT_PATHS = [
26
26
  /^\/responses(?:\?|$)/,
27
27
  /^\/models(?:\?|$)/,
28
28
  /^\/codex(?:\/|\?|$)/,
29
+ /^\/api\/oauth(?:\/|$)/,
30
+ /^\/callback(?:\?|$)/,
29
31
  ];
30
32
 
31
33
  function isOpenAiCompatiblePath(pathname: string): boolean {
@@ -149,8 +149,13 @@ export async function isAuthRequired(): Promise<boolean> {
149
149
  // reset-password CLI tool (bin/reset-password.mjs).
150
150
  if (!settings.password && !process.env.INITIAL_PASSWORD) return false;
151
151
  return true;
152
- } catch {
152
+ } catch (error: any) {
153
153
  // On error, require auth (secure by default)
154
+ // Log the error so failures (e.g., SQLITE_BUSY) aren't silent 401s
155
+ console.error(
156
+ "[API_AUTH_GUARD] isAuthRequired failed, defaulting to true:",
157
+ error?.message || error
158
+ );
154
159
  return true;
155
160
  }
156
161
  }
@@ -256,11 +256,11 @@ describe("DashboardLayout Integration", () => {
256
256
  });
257
257
  });
258
258
 
259
- describe("Page Integration โ€” usage page wiring", () => {
260
- const src = readProjectFile("src/app/(dashboard)/dashboard/usage/page.tsx");
259
+ describe("Page Integration โ€” logs page wiring", () => {
260
+ const src = readProjectFile("src/app/(dashboard)/dashboard/logs/page.tsx");
261
261
 
262
- it("should wire segmented usage tabs", () => {
263
- assert.ok(src, "src/app/(dashboard)/dashboard/usage/page.tsx should exist");
262
+ it("should wire segmented log tabs", () => {
263
+ assert.ok(src, "src/app/(dashboard)/dashboard/logs/page.tsx should exist");
264
264
  assert.match(src, /SegmentedControl/);
265
265
  assert.match(src, /RequestLoggerV2/);
266
266
  assert.match(src, /ProxyLogger/);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "3.4.0",
3
+ "version": "3.4.1",
4
4
  "description": "Smart AI Router with auto fallback โ€” route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {