Environment Variables Reference (Deutsch)

June 1, 2026 · View on GitHub

🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 es · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇺 hu · 🇮🇩 id · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇮🇳 mr · 🇲🇾 ms · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN


Complete reference for every environment variable recognized by OmniRoute. For a quick-start template, see .env.example.


Table of Contents


1. Required Secrets

These must be set before the first run. Without them, the application will either refuse to start or operate with insecure defaults.

VariableRequiredDefaultSource FileDescription
JWT_SECRETYes(none)src/lib/authSigns/verifies all dashboard session cookies (JWT). Generate with openssl rand -base64 48.
API_KEY_SECRETYes(none)src/lib/db/apiKeys.tsAES encryption key for API key values at rest in SQLite. Generate with openssl rand -hex 32.
INITIAL_PASSWORDYes123456Bootstrap scriptSets the initial admin dashboard password. Change before first use. After login, change via Dashboard → Settings → Security.

Generation Commands

# Generate all three secrets at once:
echo "JWT_SECRET=$(openssl rand -base64 48)"
echo "API_KEY_SECRET=$(openssl rand -hex 32)"
echo "INITIAL_PASSWORD=$(openssl rand -base64 16)"

Caution

Never commit .env files with real secrets to version control. The .gitignore already excludes .env, but verify before pushing.


2. Storage & Database

OmniRoute uses SQLite (via better-sqlite3) for all persistence. These variables control data location, encryption, and lifecycle.

VariableDefaultSource FileDescription
DATA_DIR~/.omniroute/src/lib/db/core.tsRoot directory for SQLite DB, backups, and data files. Override for Docker volumes or custom paths.
STORAGE_ENCRYPTION_KEY(empty = disabled)src/lib/db/encryption.tsAES key for full SQLite database encryption at rest. Generate with openssl rand -hex 32.
STORAGE_ENCRYPTION_KEY_VERSIONv1scripts/bootstrap-env.mjs, electron/main.jsVersion label for the encryption key. Increment when performing key rotation to support decryption of old backups.
DISABLE_SQLITE_AUTO_BACKUPfalsesrc/lib/db/backup.tsWhen true, skips the automatic database backup that runs before migrations on every startup.
OMNIROUTE_CRYPT_KEY(unset)src/lib/db/encryption.tsLegacy alias for STORAGE_ENCRYPTION_KEY. Accepted as a fallback when the primary variable is absent.
OMNIROUTE_API_KEY_BASE64(unset)src/lib/db/encryption.tsLegacy alias (Base64-encoded form) accepted as a fallback. Decoded automatically before use.

Scenarios

ScenarioConfiguration
Local developmentLeave all defaults. DB lives at ~/.omniroute/omniroute.db.
DockerDATA_DIR=/data + mount a volume at /data.
Encrypted at restSet STORAGE_ENCRYPTION_KEY + keep backups of the key! Losing it = losing data.
CI/TestingDATA_DIR=/tmp/omniroute-test — ephemeral, no encryption needed.

3. Network & Ports

VariableDefaultSource FileDescription
PORT20128src/lib/runtime/ports.tsPrimary port for both Dashboard UI and API endpoints (single-port mode).
API_PORT(unset)src/lib/runtime/ports.tsWhen set, serves the /v1/* proxy API on this separate port.
API_HOST0.0.0.0src/lib/runtime/ports.tsBind address for the API port.
DASHBOARD_PORT(unset)src/lib/runtime/ports.tsWhen set, serves the Dashboard UI on this separate port.
PROD_DASHBOARD_PORT20130docker-compose.prod.ymlHost-side published port for the Dashboard in Docker production mode.
PROD_API_PORT20131docker-compose.prod.ymlHost-side published port for the API in Docker production mode.
OMNIROUTE_PORT(unset)src/lib/runtime/ports.tsTakes precedence over PORT when running inside Electron or other wrappers.
NODE_ENVproductionNext.js coreControls logging verbosity, caching, error detail exposure, and Next.js optimizations.

Port Modes

┌─────────────────────────── Single Port (default) ──────────────────────────┐
│  PORT=20128                                                                 │
│  → Dashboard: http://localhost:20128                                        │
│  → API:       http://localhost:20128/v1/chat/completions                    │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────── Split Ports ─────────────────────────────────────┐
│  DASHBOARD_PORT=20128                                                       │
│  API_PORT=20129                                                             │
│  API_HOST=0.0.0.0                                                           │
│  → Dashboard: http://localhost:20128                                        │
│  → API:       http://0.0.0.0:20129/v1/chat/completions                     │
│  Use case: Expose API to LAN while restricting Dashboard to localhost.      │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────── Docker Production ──────────────────────────────┐
│  PROD_DASHBOARD_PORT=443   PROD_API_PORT=8443                              │
│  → Maps container ports to host ports in docker-compose.prod.yml.          │
└─────────────────────────────────────────────────────────────────────────────┘

4. Security & Authentication

VariableDefaultSource FileDescription
MACHINE_ID_SALTendpoint-proxy-saltsrc/lib/authSalt combined with hardware identifiers for machine fingerprinting. Change per-deployment for isolation.
AUTH_COOKIE_SECUREfalsesrc/lib/authSets the Secure flag on session cookies. Must be true when running behind HTTPS.
REQUIRE_API_KEYfalseAPI middlewareWhen true, all /v1/* proxy requests must include a valid API key.
ALLOW_API_KEY_REVEALfalseDashboard providers pageAllows revealing full API key values in the Dashboard UI. Security risk on shared instances.
NO_LOG_API_KEY_IDS(empty)src/lib/compliance/index.tsComma-separated API key IDs that bypass request logging (GDPR compliance).
MAX_BODY_SIZE_BYTES10485760 (10 MB)src/shared/middleware/bodySizeGuard.tsMaximum allowed request body size. Rejects payloads exceeding this limit.
CORS_ORIGIN*Next.js middlewareCORS Access-Control-Allow-Origin value. Restrict for production.
OUTBOUND_SSRF_GUARD_ENABLEDtruesrc/shared/network/outboundUrlGuard.tsBlock provider calls targeting private/loopback/link-local IP ranges. Disable only in isolated test envs.

Hardening Checklist

# Production security minimum:
AUTH_COOKIE_SECURE=true        # Requires HTTPS
REQUIRE_API_KEY=true           # Authenticate all proxy calls
ALLOW_API_KEY_REVEAL=false     # Never expose keys in UI
CORS_ORIGIN=https://your.domain.com
MAX_BODY_SIZE_BYTES=5242880    # 5 MB limit

5. Input Sanitization & PII Protection

OmniRoute provides a two-layer defense: request-side injection scanning and response-side PII stripping.

Request-Side: Prompt Injection Guard

VariableDefaultSource FileDescription
INPUT_SANITIZER_ENABLEDfalsesrc/middleware/promptInjectionGuard.tsEnable scanning of incoming messages for prompt injection patterns.
INPUT_SANITIZER_MODEwarnsrc/middleware/promptInjectionGuard.tswarn = log only, block = reject request with 400, redact = strip suspicious patterns.
INJECTION_GUARD_MODE(unset)src/middleware/promptInjectionGuard.tsLegacy alias for INPUT_SANITIZER_MODE — same behavior.
PII_REDACTION_ENABLEDfalsesrc/middleware/promptInjectionGuard.tsDetect PII (emails, phones, SSNs) in incoming requests.

Response-Side: PII Sanitizer

VariableDefaultSource FileDescription
PII_RESPONSE_SANITIZATIONfalsesrc/lib/piiSanitizer.tsScan LLM responses for leaked PII before returning to client.
PII_RESPONSE_SANITIZATION_MODEredactsrc/lib/piiSanitizer.tsredact = mask PII, warn = log only, block = drop entire response.

Scenarios

ScenarioConfiguration
Enterprise complianceINPUT_SANITIZER_ENABLED=true, INPUT_SANITIZER_MODE=block, PII_REDACTION_ENABLED=true, PII_RESPONSE_SANITIZATION=true
Monitoring onlyINPUT_SANITIZER_ENABLED=true, INPUT_SANITIZER_MODE=warn — logs but never blocks
Personal useLeave all disabled — zero overhead

6. Tool & Routing Policies

VariableDefaultSource FileDescription
TOOL_POLICY_MODEdisabledsrc/lib/toolPolicy.tsControls LLM tool/function-calling access. allowlist = only listed tools, denylist = all except listed, disabled = no restrictions.

7. URLs & Cloud Sync

VariableDefaultSource FileDescription
BASE_URLhttp://localhost:20128src/lib/cloudSync.tsServer-side URL for internal sync jobs to call /api/sync/cloud.
CLOUD_URL(empty)src/lib/cloudSync.tsCloud relay endpoint URL (premium feature).
CLOUD_SYNC_TIMEOUT_MS12000src/lib/cloudSync.tsHTTP timeout for cloud sync requests.
NEXT_PUBLIC_BASE_URLhttp://localhost:20128OAuth, Dashboard, syncPublic-facing URL for OAuth redirect_uri, Dashboard links. Must match your public URL behind reverse proxy.
NEXT_PUBLIC_CLOUD_URL(empty)Client-sideClient-side mirror of CLOUD_URL.
NEXT_PUBLIC_APP_URL(unset)src/shared/services/cloudSyncScheduler.tsLegacy fallback for NEXT_PUBLIC_BASE_URL.

Important

When deploying behind a reverse proxy (nginx, Caddy), NEXT_PUBLIC_BASE_URL must be set to your public URL (e.g., https://omniroute.example.com). Without this, OAuth callbacks will fail because the redirect_uri won't match.


8. Outbound Proxy

Route upstream LLM provider calls through an HTTP or SOCKS5 proxy for egress control, geo-routing, or IP masking.

VariableDefaultSource FileDescription
ENABLE_SOCKS5_PROXYtrueopen-sse/executorsEnable SOCKS5 proxy agent for upstream calls.
NEXT_PUBLIC_ENABLE_SOCKS5_PROXYtrueClient-sideClient-side awareness of SOCKS5 availability.
HTTP_PROXY(unset)Node.js standardHTTP proxy for upstream calls.
HTTPS_PROXY(unset)Node.js standardHTTPS proxy for upstream calls.
ALL_PROXY(unset)Node.js standardUniversal proxy (supports socks5://).
NO_PROXY(unset)Node.js standardComma-separated hostnames/IPs to bypass the proxy.
ENABLE_TLS_FINGERPRINTfalseopen-sse/executorsSpoof TLS fingerprint using wreq-js (mimics Chrome 124). Counters JA3/JA4 blocking.

Scenarios

ScenarioConfiguration
SOCKS5 through SSH tunnelALL_PROXY=socks5://127.0.0.1:7890, ENABLE_SOCKS5_PROXY=true
Corporate HTTP proxyHTTP_PROXY=http://proxy.corp.com:3128, HTTPS_PROXY=http://proxy.corp.com:3128, NO_PROXY=localhost,internal.corp.com
Anti-fingerprintENABLE_TLS_FINGERPRINT=true — requires wreq-js (included)

9. CLI Tool Integration

Controls how OmniRoute discovers and launches CLI sidecars (Claude Code, Codex, etc.).

VariableDefaultSource FileDescription
CLI_MODEautosrc/shared/services/cliRuntime.tsauto = search system PATH; manual = use explicit paths only.
CLI_EXTRA_PATHS(unset)src/shared/services/cliRuntime.tsAdditional PATH entries for CLI binary discovery (colon-separated).
CLI_CONFIG_HOME(unset)src/shared/services/cliRuntime.tsOverride home directory for reading CLI configs (~/.claude, ~/.codex).
CLI_ALLOW_CONFIG_WRITESfalsesrc/shared/services/cliRuntime.tsAllow OmniRoute to write CLI config files (token refresh, session data).
CLI_CLAUDE_BINclaudesrc/shared/services/cliRuntime.tsCustom path to Claude CLI binary.
CLI_CODEX_BINcodexsrc/shared/services/cliRuntime.tsCustom path to Codex CLI binary.
CLI_DROID_BINdroidsrc/shared/services/cliRuntime.tsCustom path to Droid CLI binary.
CLI_OPENCLAW_BINopenclawsrc/shared/services/cliRuntime.tsCustom path to OpenClaw CLI binary.
CLI_CURSOR_BINagentsrc/shared/services/cliRuntime.tsCustom path to Cursor agent binary.
CLI_CLINE_BINclinesrc/shared/services/cliRuntime.tsCustom path to Cline CLI binary.
CLI_CONTINUE_BINcnsrc/shared/services/cliRuntime.tsCustom path to Continue CLI binary.
CLI_QODER_BINqodersrc/shared/services/cliRuntime.tsCustom path to Qoder CLI binary.

Docker Example

# Mount host binaries into the container and tell OmniRoute where they are:
CLI_EXTRA_PATHS=/host-cli/bin
CLI_CONFIG_HOME=/root
CLI_ALLOW_CONFIG_WRITES=true
CLI_CLAUDE_BIN=/host-cli/bin/claude

10. Internal Agent & MCP Integrations

VariableDefaultSource FileDescription
OMNIROUTE_BASE_URLauto-detectopen-sse/mcp-server/server.tsExplicit URL for MCP/A2A tools to reach OmniRoute. Overrides localhost auto-detection.
OMNIROUTE_API_KEY(unset)MCP/A2A modulesAPI key for internal MCP tool and A2A skill calls.
OMNIROUTE_API_KEY_ID(unset)open-sse/mcp-server/audit.tsKey ID for MCP audit log attribution.
ROUTER_API_KEY(unset)LegacyLegacy alias for OMNIROUTE_API_KEY.
OMNIROUTE_MCP_ENFORCE_SCOPESfalseopen-sse/mcp-server/server.tsEnforce scope-based access control on MCP tool calls.
OMNIROUTE_MCP_SCOPES(all)open-sse/mcp-server/server.tsComma-separated scopes: admin, combos, health, models, routing, budget, metrics, pricing, memory, skills.
MODEL_SYNC_INTERVAL_HOURS24src/shared/services/modelSyncScheduler.tsModel catalog sync interval in hours.
PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES70src/server-init.tsProvider rate-limit and quota polling interval.
OMNIROUTE_DISABLE_BACKGROUND_SERVICESfalsesrc/instrumentation-node.tsDisable all background services (sync, pricing, model refresh). Useful for CI/test.
OMNIROUTE_BOOTSTRAPPEDfalsesrc/app/(dashboard)/dashboard/page.tsxSet true by bootstrap script after initial setup. Controls setup wizard visibility.
OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE0open-sse/executors/antigravity.tsEscape hatch: allow request body to override the Antigravity project field.

OAuth CLI Bridge (Internal)

VariableDefaultSource FileDescription
OMNIROUTE_SERVERauto-detectsrc/lib/oauth/config/index.tsServer URL for CLI↔OmniRoute auth bridge.
OMNIROUTE_TOKEN(unset)src/lib/oauth/config/index.tsAuth token for CLI bridge.
OMNIROUTE_USER_IDclisrc/lib/oauth/config/index.tsUser ID for CLI bridge sessions.
SERVER_URL(unset)src/lib/oauth/config/index.tsLegacy alias for OMNIROUTE_SERVER.
CLI_TOKEN(unset)src/lib/oauth/config/index.tsLegacy alias for OMNIROUTE_TOKEN.
CLI_USER_ID(unset)src/lib/oauth/config/index.tsLegacy alias for OMNIROUTE_USER_ID.

11. OAuth Provider Credentials

Built-in credentials for localhost development. For remote deployments, register your own at each provider's developer console.

VariableProviderNotes
CLAUDE_OAUTH_CLIENT_IDClaude Code (Anthropic)Public client — no secret needed.
CLAUDE_CODE_REDIRECT_URIClaude CodeOverride redirect URI. Default: https://platform.claude.com/oauth/code/callback
CODEX_OAUTH_CLIENT_IDCodex / OpenAIPublic client.
GEMINI_OAUTH_CLIENT_IDGemini (Google)Requires matching _SECRET.
GEMINI_OAUTH_CLIENT_SECRETGemini (Google)
GEMINI_CLI_OAUTH_CLIENT_IDGemini CLIUsually same as Gemini.
GEMINI_CLI_OAUTH_CLIENT_SECRETGemini CLI
QWEN_OAUTH_CLIENT_IDQwen (Alibaba)Public client.
KIMI_CODING_OAUTH_CLIENT_IDKimi Coding (Moonshot)Public client.
ANTIGRAVITY_OAUTH_CLIENT_IDAntigravity (Google)Requires matching _SECRET.
ANTIGRAVITY_OAUTH_CLIENT_SECRETAntigravity (Google)
GITHUB_OAUTH_CLIENT_IDGitHub CopilotPublic client.
QODER_OAUTH_CLIENT_SECRETQoder
QODER_OAUTH_AUTHORIZE_URLQoderSet to enable Qoder OAuth.
QODER_OAUTH_TOKEN_URLQoder
QODER_OAUTH_USERINFO_URLQoder
QODER_OAUTH_CLIENT_IDQoder
QODER_PERSONAL_ACCESS_TOKENQoderDirect API key fallback (bypasses OAuth).
QODER_CLI_WORKSPACEQoderWorkspace ID for Qoder CLI.
OMNIROUTE_QODER_WORKSPACEQoderAlias for QODER_CLI_WORKSPACE.

Warning

Google OAuth (Antigravity, Gemini CLI) credentials only work on localhost. For remote servers:

  1. Go to Google Cloud Console → Credentials
  2. Create an OAuth 2.0 Client ID (type: "Web application")
  3. Add your server URL as Authorized redirect URI
  4. Replace the credential values in .env.

12. Provider User-Agent Overrides

Override the User-Agent header sent to each upstream provider. This is dynamically resolved at runtime by the executor base class:

process.env[`${PROVIDER_ID}_USER_AGENT`]

Source: open-sse/executors/base.tsbuildHeaders()

VariableDefault ValueWhen to Update
CLAUDE_USER_AGENTclaude-cli/2.1.145 (external, cli)When Anthropic releases a new CLI version
CODEX_USER_AGENTcodex-cli/0.132.0 (Windows 10.0.26200; x64)When OpenAI updates the Codex CLI
CODEX_CLIENT_VERSION0.131.0Override Codex client version independently of full UA string
GITHUB_USER_AGENTGitHubCopilotChat/0.45.1When GitHub Copilot Chat updates
ANTIGRAVITY_USER_AGENTantigravity/2.0.1 darwin/arm64When Antigravity IDE updates
KIRO_USER_AGENTAWS-SDK-JS/3.0.0 kiro-ide/1.0.0When Kiro IDE updates
QODER_USER_AGENTQoder-CliWhen Qoder CLI updates
QWEN_USER_AGENTQwenCode/0.15.11 (linux; x64)When Qwen Code updates
CURSOR_USER_AGENTconnect-es/1.6.1When Cursor updates
GEMINI_CLI_USER_AGENTgoogle-api-nodejs-client/10.3.0When Google API client updates

Tip

You can add User-Agent overrides for any provider using the pattern {PROVIDER_ID}_USER_AGENT. The executor dynamically constructs the env var name.


13. CLI Fingerprint Compatibility

When enabled, OmniRoute reorders HTTP headers and JSON body fields to match the exact signature of official CLI tools. This reduces the risk of account flagging while preserving your proxy IP.

Source: open-sse/config/cliFingerprints.ts, open-sse/executors/base.ts

Per-Provider

VariableEffect
CLI_COMPAT_CODEX=1Mimics Codex CLI request signature
CLI_COMPAT_CLAUDE=1Mimics Claude Code request signature
CLI_COMPAT_GITHUB=1Mimics GitHub Copilot request signature
CLI_COMPAT_ANTIGRAVITY=1Mimics Antigravity request signature
CLI_COMPAT_KIRO=1Mimics Kiro IDE request signature
CLI_COMPAT_CURSOR=1Mimics Cursor request signature
CLI_COMPAT_KIMI_CODING=1Mimics Kimi Coding request signature
CLI_COMPAT_KILOCODE=1Mimics Kilo Code request signature
CLI_COMPAT_CLINE=1Mimics Cline request signature
CLI_COMPAT_QWEN=1Mimics Qwen Code request signature

Global

VariableEffect
CLI_COMPAT_ALL=1Enable fingerprint compatibility for all providers at once.

Note

This feature works alongside the User-Agent overrides (§12). The fingerprint system handles header ordering and body field ordering, while User-Agent overrides handle the specific UA string. Both can be enabled independently.


14. API Key Providers

API keys for providers that use direct authentication. Preferred setup: Dashboard → Providers → Add API Key.

Setting via environment variables is an alternative for Docker or headless deployments.

Recognized pattern: {PROVIDER_ID}_API_KEY

VariableProvider
DEEPSEEK_API_KEYDeepSeek
GROQ_API_KEYGroq
XAI_API_KEYxAI (Grok)
MISTRAL_API_KEYMistral AI
PERPLEXITY_API_KEYPerplexity
TOGETHER_API_KEYTogether AI
FIREWORKS_API_KEYFireworks AI
CEREBRAS_API_KEYCerebras
COHERE_API_KEYCohere
NVIDIA_API_KEYNVIDIA NIM
NEBIUS_API_KEYNebius (embeddings)

Tip

Keys set via the Dashboard are stored encrypted in SQLite and take precedence over environment variables.


15. Timeout Settings

All values are in milliseconds. Centralized resolution in src/shared/utils/runtimeTimeouts.ts.

Timeout Hierarchy

REQUEST_TIMEOUT_MS (global override)
├─→ FETCH_TIMEOUT_MS (upstream provider calls, default: 600000)
│   ├─→ FETCH_HEADERS_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS)
│   ├─→ FETCH_BODY_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS)
│   ├─→ TLS_CLIENT_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS)
│   ├── FETCH_CONNECT_TIMEOUT_MS (independent, default: 30000)
│   └── FETCH_KEEPALIVE_TIMEOUT_MS (independent, default: 4000)
├─→ STREAM_IDLE_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 600000)
└─→ API_BRIDGE_PROXY_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 600000)
    ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (derived, default: 600000)
    ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (default: 60000)
    ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (default: 5000)
    └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (default: 0 = disabled)
VariableDefaultDescription
REQUEST_TIMEOUT_MS(unset)Global shortcut — overrides both FETCH_TIMEOUT_MS and STREAM_IDLE_TIMEOUT_MS defaults.
FETCH_TIMEOUT_MS600000Total HTTP request timeout for upstream provider calls.
STREAM_IDLE_TIMEOUT_MS600000Max silence between SSE chunks before aborting. Extended-thinking models rarely pause >90s.
FETCH_HEADERS_TIMEOUT_MS= FETCH_TIMEOUT_MSTime to receive response headers.
FETCH_BODY_TIMEOUT_MS= FETCH_TIMEOUT_MSTime to receive the full response body.
FETCH_CONNECT_TIMEOUT_MS30000TCP connection establishment timeout.
FETCH_KEEPALIVE_TIMEOUT_MS4000Keep-alive socket idle timeout.
TLS_CLIENT_TIMEOUT_MS= FETCH_TIMEOUT_MSTLS fingerprint proxy (wreq-js) timeout.
API_BRIDGE_PROXY_TIMEOUT_MS600000Proxy hop timeout for /v1 bridge requests.
API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS600000Overall server request timeout for the bridge.
API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS60000Time to send response headers via the bridge.
API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS5000Bridge keep-alive idle timeout.
API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS0Raw socket timeout (0 = disabled).
SHUTDOWN_TIMEOUT_MS30000Grace period on SIGTERM/SIGINT before force-exit.

Scenarios

ScenarioConfiguration
Long-running code generationREQUEST_TIMEOUT_MS=900000 (15 min)
Fast-fail for production APIAPI_BRIDGE_PROXY_TIMEOUT_MS=10000
Extended thinking modelsSTREAM_IDLE_TIMEOUT_MS=300000 (5 min between chunks)

16. Logging

The logging system writes to both stdout and rotated log files. All configuration is read by src/lib/logEnv.ts.

VariableDefaultDescription
APP_LOG_LEVELinfoMinimum log level: debug, info, warn, error.
APP_LOG_FORMATtextOutput format: text (human-readable) or json (structured).
APP_LOG_TO_FILEtrueWrite logs to file alongside stdout.
APP_LOG_FILE_PATHlogs/application/app.logLog file path (relative to project root or DATA_DIR).
APP_LOG_MAX_FILE_SIZE50MMax file size before rotation. Accepts: 50M, 1G, 512K, or plain bytes.
APP_LOG_RETENTION_DAYS7Days to keep rotated application log files.
APP_LOG_MAX_FILES20Maximum rotated log file backups.
CALL_LOG_RETENTION_DAYS7Days to keep request/call log entries in the database.
CALL_LOG_MAX_ENTRIES10000Max call log entries in the in-memory buffer.
CALL_LOGS_TABLE_MAX_ROWS100000Max rows in the call_logs SQLite table before pruning.
PROXY_LOGS_TABLE_MAX_ROWS100000Max rows in the proxy_logs SQLite table before pruning.

17. Memory Optimization

VariableDefaultDescription
OMNIROUTE_MEMORY_MB512Runtime V8 heap limit. Docker standalone and omniroute serve use it to set --max-old-space-size.
PROMPT_CACHE_MAX_SIZE50Max cached system prompt entries.
PROMPT_CACHE_MAX_BYTES2097152 (2 MB)Max total prompt cache size.
PROMPT_CACHE_TTL_MS300000 (5 min)Prompt cache entry TTL.
SEMANTIC_CACHE_MAX_SIZE100Max cached temperature=0 responses.
SEMANTIC_CACHE_MAX_BYTES4194304 (4 MB)Max total semantic cache size.
SEMANTIC_CACHE_TTL_MS1800000 (30 min)Semantic cache entry TTL.
STREAM_HISTORY_MAX50Max recent stream events in the Dashboard live view buffer.
CONTEXT_LENGTH_DEFAULT128000Global fallback max context length for models without explicit config.
USAGE_TOKEN_BUFFER100Extra token headroom reserved when tracking usage quotas.

Low-RAM Docker Example

OMNIROUTE_MEMORY_MB=128
PROMPT_CACHE_MAX_SIZE=20
PROMPT_CACHE_MAX_BYTES=524288        # 512 KB
SEMANTIC_CACHE_MAX_SIZE=25
SEMANTIC_CACHE_MAX_BYTES=1048576     # 1 MB
STREAM_HISTORY_MAX=10

18. Pricing Sync

Automatic model pricing data synchronization from external sources.

VariableDefaultSource FileDescription
PRICING_SYNC_ENABLEDfalsesrc/lib/pricingSync.tsOpt-in periodic pricing sync.
PRICING_SYNC_INTERVAL86400 (24h)src/lib/pricingSync.tsSync interval in seconds.
PRICING_SYNC_SOURCESlitellmsrc/lib/pricingSync.tsComma-separated data sources.

19. Model Sync (Dev)

VariableDefaultSource FileDescription
MODELS_DEV_SYNC_INTERVAL86400 (24h)src/lib/modelsDevSync.tsDevelopment-time model catalog sync interval in seconds.

20. Provider-Specific Settings

VariableDefaultSource FileDescription
OPENROUTER_CATALOG_TTL_MS86400000 (24h)src/lib/catalog/openrouterCatalog.tsOpenRouter model catalog cache TTL.
NANOBANANA_POLL_TIMEOUT_MS120000open-sse/handlers/imageGeneration.tsMax wait for NanoBanana image generation jobs.
NANOBANANA_POLL_INTERVAL_MS2500open-sse/handlers/imageGeneration.tsNanoBanana job polling frequency.
CLOUDFLARE_ACCOUNT_ID(unset)open-sse/executors/cloudflare-ai.tsAccount ID for Cloudflare Workers AI.
CLOUDFLARED_BINauto-detectsrc/lib/cloudflaredTunnel.tsCustom path to cloudflared binary.
SEARCH_CACHE_TTL_MS300000 (5 min)open-sse/services/searchCache.tsTTL for search API (Perplexity, Brave, etc.) response caching.
ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODEfalsesrc/app/api/providers/route.tsAllow multiple simultaneous connections per OpenAI-compatible provider.
ENABLE_CC_COMPATIBLE_PROVIDERfalsesrc/shared/utils/featureFlags.tsEnable experimental Claude Code compatible provider endpoint.
CLIPROXYAPI_HOST127.0.0.1open-sse/executors/cliproxyapi.tsCLIProxyAPI bridge host (legacy integration).
CLIPROXYAPI_PORT5544open-sse/executors/cliproxyapi.tsCLIProxyAPI bridge port.
CLIPROXYAPI_CONFIG_DIR~/.cli-proxy-apisrc/lib/versionManager/processManager.tsCLIProxyAPI config directory.
LOCAL_HOSTNAMES(empty)open-sse/config/providerRegistry.tsComma-separated additional hostnames treated as "local" (Docker service names, etc.).

21. Proxy Health

VariableDefaultSource FileDescription
PROXY_FAST_FAIL_TIMEOUT_MS2000src/lib/proxyHealth.tsFast-fail health check timeout.
PROXY_HEALTH_CACHE_TTL_MS30000src/lib/proxyHealth.tsHealth check result cache TTL.
RATE_LIMIT_MAX_WAIT_MS120000 (2 min)open-sse/services/rateLimitManager.tsMax time to wait on a 429 before failing the request.
REQUEST_RETRY2src/sse/services/cooldownAwareRetry.tsNumber of automatic retries on model-scoped cooldown responses before returning error to client.
MAX_RETRY_INTERVAL_SEC30src/sse/services/cooldownAwareRetry.tsMax backoff interval (seconds) between cooldown retries. Capped by this value regardless of upstream Retry-After.

22. Debugging

Caution

These variables produce verbose output and may leak sensitive data. Never enable in production.

VariableDefaultSource FileDescription
CURSOR_PROTOBUF_DEBUG(unset)open-sse/utils/cursorProtobuf.tsSet 1 to dump Cursor protobuf decode/encode details.
CURSOR_STREAM_DEBUG(unset)open-sse/executors/cursor.tsSet 1 to dump raw Cursor SSE stream data.
DEBUG_RESPONSES_SSE_TO_JSON(unset)open-sse/handlers/responseTranslator.tsSet true to log Responses API SSE→JSON translation details.
NEXT_PUBLIC_OMNIROUTE_E2E_MODE(unset)E2E test harnessSet true to enable E2E test mode (relaxed auth, test hooks).

23. GitHub Integration

Allow users to report issues directly from the Dashboard.

VariableDefaultSource FileDescription
GITHUB_ISSUES_REPO(unset)src/app/api/v1/issues/report/route.tsRepository in owner/repo format.
GITHUB_ISSUES_TOKEN(unset)src/app/api/v1/issues/report/route.tsGitHub Personal Access Token with issues:write scope.

Deployment Scenarios

Minimal Local Development

JWT_SECRET=$(openssl rand -base64 48)
API_KEY_SECRET=$(openssl rand -hex 32)
INITIAL_PASSWORD=dev123
PORT=20128
NODE_ENV=development

Docker Production

JWT_SECRET=<generated>
API_KEY_SECRET=<generated>
INITIAL_PASSWORD=<generated>
STORAGE_ENCRYPTION_KEY=<generated>
DATA_DIR=/data
PORT=20128
API_PORT=20129
NODE_ENV=production
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=true
NEXT_PUBLIC_BASE_URL=https://omniroute.example.com
BASE_URL=http://localhost:20128
OMNIROUTE_MEMORY_MB=512
CORS_ORIGIN=https://your-frontend.example.com

Air-Gapped / CI

JWT_SECRET=test-jwt-secret-for-ci
API_KEY_SECRET=test-api-key-secret-for-ci
INITIAL_PASSWORD=testpass
NODE_ENV=production
OMNIROUTE_DISABLE_BACKGROUND_SERVICES=true
APP_LOG_TO_FILE=false

VPS with Reverse Proxy (nginx + Cloudflare)

JWT_SECRET=<generated>
API_KEY_SECRET=<generated>
STORAGE_ENCRYPTION_KEY=<generated>
PORT=20128
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=true
NEXT_PUBLIC_BASE_URL=https://omniroute.example.com
BASE_URL=http://127.0.0.1:20128
CORS_ORIGIN=https://omniroute.example.com
ENABLE_TLS_FINGERPRINT=true
CLI_COMPAT_ALL=1

Audit: Removed / Dead Variables

The following variables appeared in previous versions of .env.example but have no runtime references in the current codebase. They have been removed:

VariableReason
STORAGE_DRIVER=sqliteNever read by any source file. SQLite is the only supported driver — no selection needed.
INSTANCE_NAME=omniroutePresent in old docs/env templates but unused at runtime. May return in a future multi-instance feature.
SQLITE_MAX_SIZE_MB=2048Not referenced in source code. Database size is not artificially limited.
SQLITE_CLEAN_LEGACY_FILES=trueNot referenced in source code. Legacy cleanup was likely removed.
CLI_ROO_BINNot registered in src/shared/services/cliRuntime.ts.
CLI_KIMI_CODING_BINNot registered in src/shared/services/cliRuntime.ts (Kimi Coding uses OAuth, not a CLI binary).
IFLOW_OAUTH_CLIENT_ID / IFLOW_OAUTH_CLIENT_SECRETNot referenced anywhere in source code.

Default Value Corrections

VariableOld .env.example ValueActual Code DefaultFixed
APP_LOG_RETENTION_DAYS907✅ Removed misleading value; documented 7 as default
CALL_LOG_RETENTION_DAYS907✅ Removed misleading value; documented 7 as default