mrkeyoor.com_
Sat 17 Oct 13:34 UTC
LLM Toolsevaluationupdated 01 Sept 2026

9router review

9Router is a self-hosted traffic switchboard for AI coding clients such as Claude Code, Codex, and Cursor. It translates client formats, tracks provider quotas, compresses tool output, and can fall back across subscriptions, paid APIs, free tiers, or local models when a route stops working.

+303stars / 7d
Verdict

Our 9Router run installed 871 packages in 99 seconds, occupied 680 MB, and built in 80 seconds, while npm audit found 2 moderate vulnerabilities and no test target ran. That result supports a local trial for a technical user juggling several coding subscriptions or free tiers. Keep it away from shared or public infrastructure until you have reviewed the open authentication and request-routing work for the exact revision you deploy.

We ran it

Lab card: what happened when we ran 9routerScreenshot of 9router (9router.com)
Install✓ · 84s888 packages · 708 MB
Build✓ · 96s
Testsn/ano test script
Known vulns90 critical · 7 high · 2 moderate · 0 low (npm audit)
Repo1768 files~213,032 lines of source · 14.3 MB · 3 CI workflows · Dockerfile · tests dir

Answers from our run

Does 9router build from source?

Dependencies installed in 84 seconds (888 packages), and the build succeeded in 96 seconds. We cloned commit ce4460e into a clean Debian container with 3 CPUs and no project-specific setup.

Does 9router have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does 9router have known vulnerabilities in its dependencies?

npm audit flagged 9 known advisories in the dependency tree at the time of our run.

Who should not use 9router?

Operators planning to publish the dashboard directly on the internet: the README defaults REQUIRE_API_KEY and AUTH_COOKIE_SECURE to false, while open pull requests 3497 and 3503 add SSRF and endpoint-auth protections.

What are the alternatives to 9router?

LiteLLM, Portkey AI Gateway, CLIProxyAPI. Our 9Router run installed 871 packages in 99 seconds, occupied 680 MB, and built in 80 seconds, while npm audit found 2 moderate vulnerabilities and no test target ran.

Setup3/5Build passed; 871 packages and provider credentials add weight
Docs3/5Detailed setup is undercut by conflicting free-tier claims
Community3/5Fresh pushes, 26,865 stars, and an enormous open queue
Maturity2/5v0.5.59 still has open auth and client-compatibility work

Who it’s for

Developers using several AI coding clients or providers who want one local OpenAI-compatible endpoint.
Solo self-hosters willing to manage OAuth tokens, API keys, SQLite backups, and provider limits.
Teams that need quota-aware fallback and can test every client, model, and tool-call path they rely on.
Claude Code and MCP users prepared to keep the gateway private while checking its integration routes.

Who it’s NOT for

Operators planning to publish the dashboard directly on the internet: the README defaults REQUIRE_API_KEY and AUTH_COOKIE_SECURE to false, while open pull requests 3497 and 3503 add SSRF and endpoint-auth protections.
Claude Code users who depend on session restore after a fallback to a non-Anthropic model: open issue 3692 reports that the returned provider name can break restore.
Anyone buying the promise of unlimited free access: the README caps Kiro at about 50 credits a month, says OpenCode's free model list changes, and gives Vertex credits a 90-day life.
Teams requiring a standard root test gate: our measured checkout had a tests directory, yet exposed no test script or target for the lab to run.
Organizations that cannot centralize provider OAuth sessions, API keys, and a Google service-account JSON in one community-run gateway.

Setup reality

Our sandbox installed 871 npm packages in 99 seconds and used 680 MB on disk. The build succeeded in 80 seconds. Tests were skipped because the repository exposed no test script or target, despite having a tests directory. Npm audit reported 2 moderate vulnerabilities, with 0 critical, 0 high, and 0 low findings.

Source use needs Node.js 20 or newer, a copied environment file, persistent SQLite storage, and at least one provider connection. Depending on the route, that means an OAuth login, API key, local model endpoint, or Google service-account JSON. Clients then need the API key generated by 9Router.

A local trial is easier than a public deployment. The README's VPS example binds to 0.0.0.0, while API-key enforcement and secure cookies default to false. Set explicit secrets, put TLS and access control in front, and back up the data directory before trusting it with paid accounts.

More than 40 providers feed one local endpoint

9Router documents more than 40 providers behind a local OpenAI-compatible address used by Claude Code, Codex, Cursor, Cline, and other coding clients. It translates between OpenAI, Anthropic, Gemini, and several provider-specific formats. A combo can try a subscription first, move to a cheaper API, and then use a free tier. The dashboard also tracks quotas, rotates multiple accounts, records usage, and can compress tool results before forwarding a request.

That scope makes 9Router much larger than a small proxy. Our measured checkout contained 1,506 files, about 168,992 lines of source, and occupied 11.3 MB before installation. It includes a Next.js dashboard, a custom server, SQLite state, OAuth flows, API-key handling, format translators, fallback policy, MCP plugin routes, Docker assets, and cloud-sync hooks. Each part may be reasonable alone, but together they make this a credential-holding application that deserves the same review as any internal gateway.

What happened when we ran it

Our sandbox installed 871 npm packages in 99 seconds and used 680 MB on disk. The production build then succeeded in 80 seconds. Npm audit reported 2 known vulnerabilities, both moderate, with 0 critical, 0 high, and 0 low findings. Those results came from commit 90b52e0 in a fresh unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node.js 22, and no secrets.

The repository exposed no test script or target to our harness, so we skipped tests. That gap matters because the same checkout had a tests directory, 2 CI workflow files, a Dockerfile, and a Compose file. We did not connect a provider, send model traffic, or measure token compression. The 99-second install and 80-second build prove that this revision installed and compiled in our box; they do not prove that every translated tool call survives a fallback.

Two open Claude Code reports show the fallback boundary

Open issues 3692 and 3690 describe specific Claude Code failures in version 0.5.59. Issue 3692 says a fallback to a non-Anthropic provider can stamp the upstream model name into the response, which then prevents Claude Code from restoring that session normally. Issue 3690 reports that the client's [1m] model suffix is rejected as an invalid model format. Both concern the translation layer that makes 9Router useful, rather than an optional dashboard detail.

A codebase of roughly 168,992 source lines can support many integrations, yet size also gives provider changes more places to land. The safe adoption test is a recorded task set covering streaming, images, tool calls, reasoning settings, retries, and session resume for each client-provider pair you intend to use. Automatic fallback is valuable only when the replacement route preserves the request and response details the client needs. A successful HTTP response can still carry the wrong model identity or omit a field.

Three permissive defaults turn a VPS install into a hardening job

The README lists INITIAL_PASSWORD=123456, REQUIRE_API_KEY=false, and AUTH_COOKIE_SECURE=false as defaults, while its VPS example binds the server to 0.0.0.0. It does tell operators to set secrets, and the dashboard blocks some remote use of the default password. Even so, a copied deployment can hold OAuth refresh tokens, API keys, provider usage data, and local routing policy. Keep it on loopback until TLS, authentication, backups, and log handling are deliberate.

Open pull requests 3497, 3498, 3502, and 3503 address SSRF checks, MCP endpoint authentication, provider-data access, and operational control routes. They were still unmerged when fetched on September 1, 2026. Our npm audit's 2 moderate findings cover installed package advisories, not these application-level reports. Do not combine those signals into one vulnerability count. Review the chosen commit and the status of each patch before exposing a port or importing valuable credentials.

Free routes have quotas, expiring credits, and changing model lists

The free story needs a careful read. The README describes Kiro as roughly 50 credits per month, says OpenCode's free model list can change without notice, and limits the cited Vertex credit to new accounts for 90 days. A later Kiro setup block calls usage unlimited, which conflicts with the earlier cap. 9Router can move between available routes, but it cannot guarantee that another company's free allowance, model catalog, or OAuth policy will remain available.

Running the switchboard also has a local cost before any model answers. Our install added 871 packages and 680 MB to an 11.3 MB checkout. SQLite keeps provider connections, combos, aliases, keys, settings, and usage history in the data directory, so backup and file permissions matter. Full request logging is optional and should stay off unless you need it, because prompts, tool output, and provider responses can contain repository data that does not belong in a long-lived log.

1,027 open issues make current activity a mixed signal

GitHub showed 26,865 stars, 1,027 open issues, and 864 open pull requests on September 1, 2026. The last push was August 29, and new issues arrived on September 1, so the project is plainly active. Its latest GitHub release was v0.5.35 on July 16, while the measured source package identified itself as v0.5.59. The older release tag is no abandonment signal, though the enormous queue makes it harder to tell which reports have maintainer attention.

A personal gateway is the sensible starting point. The 80-second successful build makes a trial easy enough, but the missing test target leaves our run without regression evidence for a system that rewrites model traffic. Use expendable credentials, pin the revision, keep the listener private, and replay real coding tasks before moving a paid account behind it. If you only use one API provider, 871 packages and a 680 MB install buy more control surface than most people need.

Alternatives

ProjectWhat it isPick it when
LiteLLM gh↗A Python gateway and SDK for routing requests across many model APIs with budgets, logging, and load balancing.pick this instead when a multi-user service gateway matters more than a desktop dashboard for coding subscriptions.
Portkey AI GatewayA TypeScript gateway centered on model routing and guardrails across API providers.pick this instead when application traffic and policy controls are the job, rather than pooling coding-tool accounts.
CLIProxyAPI gh↗A Go service that exposes Claude Code, Codex, Grok Build, and Antigravity accounts through compatible APIs.pick this instead when you want a narrower CLI-account proxy without 9Router's large Next.js dashboard and token tools.

What people are saying

  1. [github-trending] decolua/9router

Sources

  1. 9Router repository and README
  2. Measured commit 90b52e0
  3. 9Router v0.5.35 release
  4. Claude Code session restore issue 3692
  5. Claude Code 1M model suffix issue 3690
  6. Open SSRF protection pull request 3497
  7. Open operational endpoint auth pull request 3503

More llm tools reviews

GLM-5.3-Flash-EXL3-2x-DGX-Sparks-TensorFold · livenerf · scion · opencode2api · IQuest-Q1 · iCode · the whole board →