Never stop coding. Free MIT AI gateway: one endpoint, 350 providers (90+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax.
Overview
— up to with signup credits — aggregated across the free tiers, plus a long tail of permanently-free, no-cap providers, and the compression above stretches every one further. (how we count →) ⭐ Star the repo if OMNIROUTE helped you save money and make your work easier. 🌐 In 42+ languages 🇺🇸 🇧🇷 🇵🇹 🇪🇸 🇫🇷 🇮🇹 🇩🇪 🇳🇱 🇷🇺 🇺🇦 🇵🇱 🇨🇿 🇸🇰 🇷🇴 🇭🇺 🇧🇬 🇩🇰 🇫🇮 🇳🇴 🇸🇪 🇨🇳 🇹🇼 🇯🇵 🇰🇷 🇹🇭 🇻🇳 🇮🇩 🇲🇾 🇵🇭 🇮🇳 🇮🇳 🇮🇳 🇮🇳 🇮🇳 🇮🇳 🇧🇩 🇵🇰 🇮🇷 🇸🇦 🇮🇱 🇹🇷 🇦🇿 🇹🇿 Stacking free tiers by hand is painful — dozens of SDKs, dozens of rate limits, and no idea how much you actually have. OmniRoute aggregates the free tiers of into one honest number and shows it live on the dashboard (/dashboard/free-tiers). - (steady) — and with signup credits. - — we count each shared free pool , so the headline isn't inflated by rate-limit ceilings the way multi-billion competitor claims are. (Counting every rate limit 24/7 would read ~10B; we don't publish that.
README
Bring your own provider accounts. This is an estimated aggregate across separately eligible third-party free tiers, not a token grant from OmniRoute. Sign up, obtain credentials where required, and connect the providers you can use; each provider controls its limits, availability, and terms.
Stacking free tiers by hand is painful — dozens of SDKs, dozens of rate limits, and no idea how much you actually have. OmniRoute catalogs 484 free-tier entries across 34 recurring pool keys and computes the token headline from the 17 pools with a published positive monthly budget plus five per-model Groq caps, deduplicated by shared pool. Quotas that only open after a regional identity check (today: ModelScope) are shown apart, +~6M behind regional identity verification, and never summed into the headline. The result stays visible on the dashboard (
/dashboard/free-tiers).
Animated summary of the live
/dashboard/free-tierspage. Full methodology (pool dedupe, credit tiers, provider terms): docs/reference/FREE_TIERS.md.These figures are re-audited every two weeks against the live catalog and move both ways — a provider ends a free tier and the number drops; a new one lands and it climbs. We publish what the catalog actually computes, never a rounded-up best case.
🧩 Available
# After connecting a provider, copy your OmniRoute key from Dashboard → Endpoints:
curl http://localhost:20128/v1/chat/completions \
-H "Authorization: Bearer YOUR_OMNIROUTE_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"Hello!"}]}'
auto needs an eligible route. A fresh installation can have no eligible keyless targets, and a keyless provider may reject third-party clients. Providers marked tos: avoid, including Kiro, are excluded from automatic routing by default; connecting an account does not override that setting. See the Free Tiers Guide before choosing a provider.
📦 Copy-paste quickstart scripts for Python, Node.js, PHP, and cURL → examples/quickstart/
Want to join as an Open Source Friend? These are the companies that back open source and help keep OmniRoute moving — and we say publicly where every token they give us goes. Reach out: [email protected]
Links tagged aff=omniroute are partner links. They fund the project at no extra cost to you.
A combo is a chain of models OmniRoute routes across automatically. If quota runs out, a provider fails, or costs spike, the combo can move to the next eligible healthy model. 🛡️
⚡ Zero-config — just use auto
No combo to create. Set your model to auto (or a variant) and OmniRoute builds a virtual combo from your connected providers, scored live:
🔀 Or build your own — 20 routing strategies
All 20 strategies — mix & match per combo step:
The Auto-Combo engine scores every candidate on 16 factors (health, quota, cost, latency, task fit, quality, session availability…) — see docs/routing/AUTO-COMBO.md.
🧱 Resilience is built in (3 independent layers)
📖 Auto-Combo Engine · Resilience Guide
📊 Full methodology & per-feature detail vs 9router, OpenRouter, CLIProxyAPI & LiteLLM → docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md
💚 Support OmniRoute
OmniRoute is MIT-licensed and maintained in the open. If it saves you time or money, here’s how to keep it independent — pick whatever fits you. Sponsorship never affects routing priority; it buys visibility, not ranking.
🇧🇷 PIX — instant, no fees (Brazil)
Key (random): 5d865059-bc44-483a-962d-43ceb80126eb
Pix copia-e-cola:
00020101021126580014br.gov.bcb.pix01365d865059-bc44-483a-962d-43ceb80126eb5204000053039865802BR5922OMNIROUTE CONTRIBUICAO6006BRASIL62070503***630475DD
🐛 Found a bug or have feedback? Open a Discussion.
Developer notes: The project may generate a local .env file during npm install/postinstall for developer convenience. This file is intentionally ignored via .gitignore (see .gitignore) and must never be committed — if accidentally committed, rotate any exposed secrets and remove the file from history. See docs/DEVELOPER-ENVIRONMENT.md for guidance on managing local environment files and secrets.
📡 OmniRoute Radar
The main free-tier headline remains ~1.62B tokens/month from the documented, pool-deduplicated catalog above. Temporary provider signup credits can separately lift the first month to ~2.22B. Radar is an optional, signed catalog overlay for people who want fresher free-model availability between OmniRoute releases; the community catalog and every existing free feature remain free.
Supporters can receive the live catalog and additional provider opportunities. Its separate, mutable ceiling is approximately 3B tokens/month at most, depending on provider availability. That ceiling is not a guarantee: providers can change quotas, eligibility, models, or regions at any time.
Radar is opt-in and GET-only. The OmniRoute client does not upload prompts, traffic, provider configuration, usage telemetry, or local announcement-dismiss state. Learn about eligibility and the current catalog at radar.omniroute.online/planos.
Recent highlights from v3.8.20 → v3.8.53. Full history in
CHANGELOG.md.
- ⚖️
quota-weightedrouting — the 20th combo strategy skips exhausted accounts, then draws among the rest in proportion to leftover quota ÷ in-flight load, keeping existing conversations pinned. → Auto-Combo - 🧰 Headless mode —
omniroute serve --headless(orOMNIROUTE_HEADLESS=1) runs only the/v1/*proxy engine, with the dashboard and dashboard-only subsystems off. → Headless Mode - 🔎 Model discovery —
/v1/modelsfilters by capability, context, kind and text, andPOST /v1/models/queryreturns a short deterministic shortlist with the same per-key visibility. → API Reference - 🔑 Per-key routing control — pin an API key to one model or combo with
forcedModel, and add or remove a key’s models and combos atomically (/api/keys/{id}/access). → API Reference · OpenAPI - 🛡️ Finer PII controls — per-type selection, up to 20 validated custom masking patterns and per-type detection counters; masking itself stays opt-in. → Guardrails
- 🌍 67 languages — dashboard, docs mirrors and CLI, with
npm run i18n:add-localeadding a language everywhere in one command. → i18n Guide - 🎛️ OmniConductor — inbound A2A delegation to your agent fleet, Conductor skills on the Agent Card, and a dashboard panel with Faro push-to-talk voice chat. → A2A Server
- 🛂 Adaptive admission & overload protection — heavyweight chat requests queue instead of 503ing, with atomic RPM rolling leases per connection. → Resilience Guide
- 🗂️ Canonical
/v1/modelsordering — one contiguous provider-grouped block per provider (combos pinned first), stable across every catalog source. → API Reference - 🗜️ Compression hardening — default-on inflation guard, Caveman packs for DE / FR / JA + Chinese (wényán), RTK filters for Gradle & .NET. → Compression
- 💸 Honest flat-rate cost — subscription / coding-plan providers read $0 in cost analytics; budget, quota & routing keep estimating. → API Reference
- ⚖️ Quota-Share routing — split a shared account’s quota fairly across pooled keys, work-conserving so idle slices are lent out. → Resilience Guide
- 🤖 One-command CLI/agent setup — 15 registered
setup-*commands;omniroute runlaunches 7 CLIs (Claude Code, Codex, Aider, Goose, OpenCode, Qwen Code, Gemini CLI);omniroute configuresupports 11 targets with an interactive provider+model picker and per-context favorites. → CLI Integrations - 🛰️ Remote mode — drive a remote OmniRoute with scoped tokens (
connect/contexts/tokens) + anantigravityOAuth helper for VPS installs. → Remote Mode - 🧭 Smarter auto-routing —
auto/:combos, Fusion (model panel + judge), task-aware routing, per-request model / mode / USD-budget overrides. → Auto-Combo - 🗜️ Pluggable compression — 12 composable engines + Compression Studios: LLMLingua-2, two-tier Ultra, omniglyph, per-step fidelity gate, GCF v3.2, drag-reorder editor. → Compression
- 🕵️ Transparent MITM decrypt (TPROXY) — capture CLIs that ignore proxy env vars, with a per-SNI CA + trust-store installer. → MITM/TPROXY
- 💸 Cost telemetry everywhere —
X-OmniRoute-*cost/usage headers on every endpoint, cache-HIT savings header, per-key USD spend quotas. → API Reference - 🧠 Memory you control — off by default, opt-in int8 vector quantization + typed decay, per-request
x-omniroute-no-memory. → Memory - 🛡️ Security — prompt-injection guard on every LLM route (red-team suite), opt-in credential-masking guardrail (redacts leaked API keys/secrets in both directions), free DuckDuckGo last-resort web search, and an optional OIDC login gate for the dashboard (password login always stays available). → Guardrails
- 🖼️ New endpoints —
/v1/ocr(Mistral OCR) and/v1/audio/translations(Whisper-style) round out the media surface. → API Reference - 🎨 Image / video / audio generation — one API for media: xAI Grok Imagine & Novita AI video, ComfyUI, Magnific, Adobe Firefly, Segmind, and speech providers such as ElevenLabs. → API Reference
- 🌍 Deployment & ops — reverse-proxy
basePath, browser-language auto-detect, per-key device tracking, root-less MITM trust, zh-TW localization. → Environment - 🤝 More providers & agents — cloud agents (Codex Cloud, Cursor, Devin, Jules), Grok Build (xAI) with browser + OAuth login, Ollama first-class card, Claude Opus 5 & Sonnet 5, Kimi official partnership (Code/Web/Moonshot), Zed, Requesty, SenseNova, Yuanbao, Agnes AI… and a refreshed 377-provider catalog. → Providers
- 📡 Routing transparency — every response carries an
X-OmniRoute-Decisionheader naming the strategy/provider/latency that served it, a newcache-optimizedcombo strategy + Auto-CombocacheAffinityfactor route repeat requests back to the connection holding the cached prefix, and a read-only/v1/auto-combo/{channel}/candidatesendpoint exposes anauto/*channel’s live candidate pool. → Auto-Combo - ⚡ Local performance & infra — one-click local Redis, Cloudflare Workers / Deno Deploy relay deployers, Bifrost & Mux as supervised embedded services. → Embedded Services
- 🧩 Also in the box — plugin framework + marketplace, Omni/Agent/GitHub skills frameworks, Obsidian vault integration (22 MCP tools), OpenAI-compatible Batch & Files APIs, semantic response cache, gamification with leaderboards, ACP agent discovery (15 built-in agents), scheduled log export to BigQuery,
auto/chaosparallel multi-model fan-out, a Telegram bot bridge, an in-app version manager and LMArena-ELO free-provider rankings. → Docs
📖 Per-tool setup for all 39 tools (28 CLI Code’s + 11 CLI Agents) → docs/reference/CLI-TOOLS.md · 🧩 OpenCode plugin → @omniroute/opencode-provider
Launch any supported CLI through OmniRoute in one command — no config files written, credentials injected per process, Qwen/Gemini get a throwaway isolated home:
omniroute run claude --model openai/gpt-5.4 # Claude Code
omniroute run codex --model glm/glm-5.2 # OpenAI Codex CLI
omniroute run aider --model glm/glm-5.2 -- --message "reply OK"
omniroute run goose --model glm/glm-5.2
omniroute run opencode --model glm/glm-5.2 -- run "reply OK"
omniroute run qwen --model glm/glm-5.2 -- -p "reply OK"
omniroute run gemini --model glm/glm-5.2 -- --skip-trust -p "reply OK"
# Or pick provider+model interactively and write the tool's own config:
omniroute configure codex # also: claude opencode qwen aider goose gemini cline continue kilo 5dive
Every command honors the active remote context (omniroute connect ), --dry-run
previews the exact env/args without executing, and --api-key-env NAME keeps secrets out
of your shell history. → CLI Integrations
377 registered providers across the canonical chat, media, search, local, cloud-agent and system collections, including 153 carrying
hasFree: truediscovery metadata. The chat model registry covers 239 providers / 3,059 distinct provider-model pairs / 1,475 raw model IDs; the separate free-budget catalog has 471 per-model rows, 34 recurring pools and 52 recurring/keyless free-forever providers. These are different denominators by design; definitions and pool-deduped calculations live in the Provider Reference and Free Tiers.
Same app, your machine, your rules. From a global npm install to your phone via Termux.
📖 Docker Guide · Desktop · Menu-bar tray · Termux · PWA · OpenCode
No new sidebar, no new chat UI — every model OmniRoute serves shows up right in the Copilot Chat model picker you already use. Since VS Code 1.122, provider models work without a GitHub sign-in or a Copilot subscription — agent mode, tool calling and vision, for free.
Install the OmniCopilot extension, point it
at your OmniRoute server (defaults to localhost:20128), then open Copilot Chat → model picker
→ Manage Models… → OmniRoute.
From inside the editor: open the Extensions view, search “OmniRoute”, click Install — works the same way on both stores. Source, issues and the publishing runbook live at diegosouzapw/OmniCopilot.
📖 VS Code Copilot Chat guide — setup, what the picker shows, dashboard-in-a-tab, troubleshooting
omniroute serveis happiest when it’s always on. OmniRouteTray turns that into a set-and-forget menu-bar app for macOS: it starts the server, keeps it alive across reboots, updates it in place, and puts your live token budget one click away — no terminal window left open, nonpm install -g omnirouteto babysit.
Built with Tauri v2 (a Rust core the size of a rounding error), it ships
its own signed Node 24 runtime and manages an app-owned OmniRoute install, so it never fights your
global node/bun. It shares your existing ~/.omniroute/ config and database — so it’s the
same OmniRoute you already run, just with a hat on. 🎩
brew install --cask zoispag/tap/omniroute-tray
Prefer a download? Grab the latest .dmg from Releases. Source, issues and build docs live at zoispag/omniroute-tray. 💛 A community project by @zoispag — not an official OmniRoute release.
📖 Authorization · Guardrails · Compliance
Beyond the server, OmniRoute is a full command-line cockpit with 80+ commands, plus open agent protocols so an AI agent can drive it on its own.
⌨️ A real CLI (not just start)
omniroute # serve gateway + dashboard (port 20128)
omniroute chat # interactive TUI chat client (slash: /model /combo /skill /memory)
omniroute setup # guided first-run wizard
omniroute doctor # diagnose providers, ports, native deps
🛰️ Remote mode — run the CLI here, OmniRoute on a VPS
OmniRoute on a server? Drive it from your laptop with the same CLI. Log in once with a scoped access token; every command then targets the remote.
omniroute connect 192.168.0.15 # password → scoped token, saved as a context
omniroute models # ← runs against the REMOTE server
omniroute configure codex # ← picks a remote model, writes a local Codex profile
omniroute tokens create --name ci --scope read # mint narrower tokens for other machines
omniroute contexts use default # ← switch back to the local server
Tokens are scoped read / write / admin; process-spawning routes stay loopback-only.
📖 Remote Mode
🤝 Connect an agent — and it controls OmniRoute itself
Expose OmniRoute over MCP, A2A, a REST API, webhooks or a remote CLI — any capable agent (or your own code) gets the keys to the whole gateway: routing, providers, combos, cache, compression, memory — autonomously. HTTP endpoints below are served under http://localhost:20128.
# Give Claude Code the full OmniRoute toolset over MCP:
claude mcp add-server omniroute --type http --url http://localhost:20128/api/mcp/stream
📖 MCP Server · A2A Server · Agent Protocols
📖 How it works — pipeline, architecture & savings math
Default stacked combo runs RTK → Caveman. When both act on the same tool/context payload, savings compound:
combined = 1 − (1 − RTK) × (1 − Caveman_input)
average = 1 − (1 − 0.80) × (1 − 0.46) = 89.2%
range = 78.4 – 94.6%
Code blocks, URLs, JSON and structured data are always protected by the preservation engine.
Why use many tokens when few tokens do the trick? Every request passes through OmniRoute’s compression pipeline transparently — no client changes. It’s now a stack of 12 composable engines that run in order and mix & match per routing combo — building on ideas from RTK, Caveman (⭐ 90K+), LLMLingua-2, and Troglodita (PT-BR).
🧱 The 12-engine stack
Engines run in pipeline order; each is independently toggleable and configurable per combo:
Code blocks, URLs and structured data are always preserved byte-perfect. One-click presets combine the engines:
Real example — Standard mode:
Before (69 tokens): “The reason your React component is re-rendering is likely because you’re creating a new object reference on each render cycle. When you pass an inline object as a prop, React’s shallow comparison sees it as a different object every time, which triggers a re-render. I would recommend using useMemo to memoize the object.”
After (19 tokens): “New object ref each render. Inline object prop = new ref = re-render. Wrap in useMemo.”
Same answer. 72% fewer tokens. Zero accuracy loss. ✅
PT-BR example — Troglodita mode:
Antes (42 tokens): “O problema é que o componente está re-renderizando porque uma nova referência de objeto está sendo criada em cada ciclo de renderização. Eu recomendaria usar useMemo.”
Depois (12 tokens): “Re-render: ref nova cada ciclo (objeto inline recriado). Usar
useMemo.”Mesma resposta. ~70% menos tokens. Precisão técnica intacta. ✅
🎚️ Beyond the engines — output styles, the adaptive dial & per-request control
The 12 engines above shrink what goes in. Three more layers shape how, when, and what comes out:
- 🪄 Output Styles (output-axis steering) — inject deterministic, cache-safe response-shaping instructions; combinable, each at
lite/full/ultraintensity. Adding a style is a one-line registry entry:- Terse prose — drop filler / articles / hedging; keep technical substance exact.
- Less code — “lazy senior dev” YAGNI: smallest working change, no unrequested scaffolding.
- Ponytail (lazy senior dev) — climb the YAGNI ladder, fix the root cause, smallest working diff.
- I have ADHD (action-first) — next action leads, steps numbered, one concrete next step, no preamble.
- Terse CJK (文言) — classical-Chinese ultra-terse style (locale-gated to
zh).
- 🎯 Adaptive context-budget (the dial) — instead of one on/off token threshold, escalate the cheapest, most-lossless engines only as far as needed to fit the model’s context window. Policy:
reserve-output(default, model-aware) ·percentage·absolute. Mode:floor(guarantee fit) ·replace-autotrigger(your explicit choice wins) ·off(legacy threshold). - 🎛️ Where compression is decided (precedence, high → low) — per-request
x-omniroute-compressionheader › routing-combo override › active named profile › adaptive / auto-trigger › panel default › off. The applied plan echoes back in theX-OmniRoute-Compression: ; source=response header.
Auto-trigger by token threshold, flip on the adaptive dial, pin a named profile, set a one-off per request, or assign a pipeline per routing combo — whichever fits the workload. An opt-in offline eval harness (npm run eval:compression) scores fidelity vs. savings on a pinned corpus before you promote a change.
📖 COMPRESSION_GUIDE.md · RTK_COMPRESSION.md · COMPRESSION_ENGINES.md
1) Install & run
npm install -g omniroute
omniroute
💡 See
npm warn ERESOLVEor peer-dep warnings? They’re harmless. Using npm 11 or later? npm may block package lifecycle scripts unless they are allowed. OmniRoute’spostinstall(node scripts/build/postinstall.mjs) is required to prepare its native runtime files. Allow the packages named in npm’s warning when installing globally. For the package set reported by OmniRoute 3.8.53:npm install -g --allow-scripts=omniroute,keytar,onnxruntime-node,@parcel/watcher,@swc/core,protobufjs,esbuild omnirouteTo reuse this allowlist for future global installs, configure it once, then install normally:
npm config set allow-scripts=omniroute,keytar,onnxruntime-node,@parcel/watcher,@swc/core,protobufjs,esbuild --location=user npm install -g omnirouteThe dependency list can change between releases; if npm reports a different list, use the package names from that warning. Allowing a package permits its install scripts to run. Using Gemini Web or another web-cookie provider? The npm package includes Playwright but not its Chromium binary. See the Playwright Chromium setup note before making the first web-provider request.
Dashboard at http://localhost:20128 · API at http://localhost:20128/v1.
2) Connect an eligible provider using your own account
Dashboard → Providers → choose a provider whose current terms and quota fit your use case → add its API key or complete its account flow. Free tiers may require signup, approval, or a payment method. Review the Free Tiers Guide; keyless availability is not guaranteed, and providers marked tos: avoid are excluded from auto by default.
3) Point your coding tool
Base URL: http://localhost:20128/v1
API Key: [copy from Dashboard → Endpoints]
Model: auto (routes among eligible connections — or choose provider/model)
4) Verify it’s working
curl http://localhost:20128/v1/models -H "Authorization: Bearer YOUR_KEY"
You should see your connected models listed. 🎉 That’s it — start coding, and OmniRoute auto-routes & falls back for you.
If your client cannot send custom headers, OmniRoute also exposes tokenized compatibility aliases:
OpenAI catalog: http://localhost:20128/vscode/YOUR_KEY/
OpenAI models: http://localhost:20128/vscode/YOUR_KEY/models
OpenAI chat: http://localhost:20128/vscode/YOUR_KEY/chat/completions
OpenAI responses: http://localhost:20128/vscode/YOUR_KEY/responses
Ollama chat: http://localhost:20128/vscode/YOUR_KEY/api/chat
Ollama tags: http://localhost:20128/vscode/YOUR_KEY/api/tags
Use these only for clients that cannot attach Authorization: Bearer .... Header auth remains the preferred mode.
📦 More install methods — Docker, source, pnpm, Arch
🐳 Docker
docker run -d --name omniroute --restart unless-stopped --stop-timeout 40 \
-p 127.0.0.1:20128:20128 -v omniroute-data:/app/data diegosouzapw/omniroute:latest
:latest follows the highest published stable SemVer. It does not track git main. Pin :X.Y.Z for GitOps. See Docker Release Channels.The image pins OMNIROUTE_MEMORY_MB=1024. That is enough for the dashboard and a light chat. Coding agents (POST /v1/responses from Claude Code, Codex, Grok, …) need a much larger V8 heap or the process FATAL ERRORs at ~12 GiB under two overlapping long contexts. Size the container above the heap (native buffers sit outside V8):
| Workload | Heap (-e OMNIROUTE_MEMORY_MB) |
Container (--memory) |
|---|---|---|
| Dashboard / light chat | 1024 (image default) |
≥2 g |
| One coding agent | 8192 |
≥10 g |
Two concurrent long /v1/responses |
10240–12288 |
≥12–16 g |
docker run -d --name omniroute --restart unless-stopped --stop-timeout 40 \
-e OMNIROUTE_MEMORY_MB=8192 --memory=10g \
-p 127.0.0.1:20128:20128 -v omniroute-data:/app/data diegosouzapw/omniroute:latest
Full table: Docker Guide — runtime RAM.
Pre-release Docker channel:
diegosouzapw/omniroute:nextanddiegosouzapw/omniroute:next-webfollow the current defaultrelease/v*branch. These mutable tags are intended only for testing unreleased fixes and are not supported for production. See Docker Release Channels.
🥟 Bun
Standard bun install and global installation (bun install -g omniroute) are supported via Bun runtime detection:
- Built-in
bun:sqlite: OmniRoute uses Bun’s built-inbun:sqlitedriver when running under Bun, falling back tobetter-sqlite3on Node.js orsql.js. - Automatic Webpack bundler selection in dev: Development (
bun run dev) automatically detects Bun and disables Turbopack in favor of Webpack to prevent native V8 binding incompatibilities. Production builds (bun run build) followOMNIROUTE_USE_TURBOPACKexactly as on Node: Turbopack by default,OMNIROUTE_USE_TURBOPACK=0to build with Webpack (Dockerfile.bunexposes it as a--build-arg). - Dedicated Bun Dockerfile: Multi-stage
Dockerfile.bunfor native Bun production deployments (docker build -f Dockerfile.bun -t omniroute:bun .).
# Install and run with Bun
bun install
bun run dev
🛠️ From source
cp .env.example .env && npm install
PORT=20128 npm run dev
📦 pnpm
pnpm add -g omniroute@latest --allow-build=better-sqlite3 --allow-build=@swc/core && omniroute
🐧 Arch Linux (AUR)
yay -S omniroute-bin && systemctl --user enable --now omniroute.service
🔧 Nix (Flake)
# Using Nix flakes
nix develop
npm run dev
# Or using devbox
devbox run npm run dev
📖 Docker Guide — Compose profiles, Caddy HTTPS, Cloudflare tunnels.
🦭 Podman
# 1. Prepare the bind-mounted data directory
mkdir -p data
# 2. Linux + local rootless Podman only (never a remote Podman Machine client):
podman unshare chown 1000:1000 ./data
# 3. Set the runtime hint, build the local Compose image, and start
echo "CONTAINER_HOST=podman" >> .env
podman compose --profile base up -d --build
On macOS or Windows, Podman uses a remote Podman Machine: skip podman unshare and
follow the topology-specific data directory guidance.
📖 Podman Guide — Compose builds, Podman Machine, and Linux/systemd Quadlet setup.
⚡ Faster / leaner install (skip the native build)
The native SQLite engine (better-sqlite3) is an optional dependency, so a global
install never blocks on compiling from source: it uses a prebuilt binary when one matches
your platform/Node, and otherwise falls back transparently to a pure-JS engine
(node:sqlite on Node 22+, else the bundled sql.js WASM) — no build tools required.
To skip the post-install native warm-up entirely (CI, headless, or slow machines).
Note: this only skips the native SQLite warm-up step (scripts/postinstall.mjs); the
binary-copy/repair hook (scripts/build/postinstall.mjs) still runs normally:
OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute # CI=1 also skips it
For the fastest installs prefer pnpm (content-addressed store + hard links — see above).
For a dashboard-free, headless runtime use the Docker base profile (above) or the
Termux guide. The CLI and the web dashboard are served by the
same process on one port, so there is no separate CLI-only package today.
📹 Video Guides
Ranking completo (URLs canônicas deduplicadas, v > 0, maior alcance):
| #1 | #2 | #3 | #4 | #5 |
|---|---|---|---|---|
| nick_saraev — Instagram — 3,042,474 | nnapier7 — Instagram — 1,454,535 | Amidia AI & Tech — YouTube — 794,974 | theopenstack — Instagram — 692,419 | migue.baena — TikTok — 685,788 |
| #6 | #7 | #8 | #9 | #10 |
|---|---|---|---|---|
| milesreevesai — TikTok — 620,400 | nikothetech — TikTok — 610,803 | Vaibhav Sisinty — YouTube — 509,281 | buildwithai.club — Instagram — 347,652 | nivedan.ai — Instagram — 331,973 |
Métricas canônicas em 2026-10-18: 1.976 vídeos únicos · 20.220.289 visualizações conhecidas (v > 0) · 1.210 canais/perfis por rede. O painel bruto contém 1.976 linhas (YouTube 1.352 = 740 longos + 612 Shorts · TikTok 334 · Instagram 290); nenhuma duplicata restou após a normalização pela URL canônica, que mantém a maior contagem por vídeo. A coleta do YouTube está congelada em 2026-10-13 (quota da API esgotada de 14 a 18/10) e TikTok/Instagram desde 2026-09-02 (sem créditos de coleta); 76 vídeos ainda não têm contagem de views.
🎬 Made a video about OmniRoute? Open an issue or discussion with the link — we’ll feature it here.
📘 Getting Started
🔧 Operations & Deployment
🧠 Features & Architecture
🤖 Protocols & APIs
📋 Project & Quality
💖 Sponsors
Audited on 2026-10-18 at live release/v3.8.52 tip ad160ab2d1 (6,826 commits): 993 normalized human Git identities — 707 appear as commit authors (including the maintainer) and 286 only in explicit Co-authored-by trailers. The census applies .mailmap, compares e-mail addresses case-insensitively, joins numeric and plain GitHub noreply addresses only when they encode the same handle, excludes 26 bot/agent/service/placeholder identities, and does not merge ordinary e-mail addresses merely because their display names match. The 2026-08-24 audit published 639; this method re-run on that audit’s base ac02c5b42f gives 619, so the increase comes from new contributors, not from a looser method.
How to Contribute
- Fork the repository
- Branch from the active
release/vX.Y.Ztip (notmain) — see Branching & Release Model - Create your feature branch (
git checkout -b feat/amazing-feature) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feat/amazing-feature) - Open a Pull Request with base = that
release/vX.Y.Zbranch
See CONTRIBUTING.md for detailed guidelines.
Releasing a New Version
# Create a release — npm publish happens automatically
VERSION=x.y.z
gh release create "v${VERSION}" --title "v${VERSION}" --generate-notes
OmniRoute stands on the shoulders of giants. It started as a fork of 9router and a TypeScript port of the Go project CLIProxyAPI — and from there, every subsystem below was inspired by an open-source project that got there first. Each one shaped a concrete piece of OmniRoute. This is our thank-you to all of them. 🙏
⭐ star counts verified from GitHub’s REST API on October 18, 2026 — go give these projects a star. Counts are an exact dated snapshot and will naturally change.
🧬 Lineage & gateway
🗜️ Context & token compression — engines
🧩 Compact formats, token research & code-aware tooling
🧠 Memory & RAG
🛰️ Traffic inspection, MITM & transparent proxy
📚 Model data, observability & UI
🛡️ Security
🧭 Complementary tools
📄 License
MIT License - see LICENSE for details.
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add diegosouzapw/omniroute