Observed since 20 Oct, 21:40 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
9Router CLI - Start and manage 9Router server
Never stop coding. Save 20-40% tokens with RTK + auto-fallback to FREE & cheap AI models.
Connect All AI Code Tools (Claude Code, Cursor, Antigravity, Copilot, Codex, Gemini, OpenCode, Cline, OpenClaw...) to 40+ AI Providers & 100+ Models.
Stop wasting money, tokens and hitting limits:
9Router solves this:
Option 1 — npm (recommended for desktop):
npm install -g 9router
9router
# Or run directly with npx
npx 9router
Option 2 — Docker (server/VPS):
docker run -d --name 9router -p 20128:20128 \
-v "$HOME/.9router:/app/data" -e DATA_DIR=/app/data \
decolua/9router:latest
Published images: Docker Hub • GHCR (multi-platform amd64/arm64).
🎉 Dashboard opens at http://localhost:20128
2. Connect a FREE provider (no signup needed):
Dashboard → Providers → Connect Kiro AI (free Claude unlimited) or OpenCode Free (no auth) → Done!
3. Use in your CLI tool:
Claude Code/Codex/OpenClaw/Cursor/Cline Settings:
Endpoint: http://localhost:20128/v1
API Key: [copy from dashboard]
Model: kr/claude-sonnet-4.5
That's it! Start coding with FREE AI models.
9router # Start with default settings
9router --port 8080 # Custom port
9router --no-browser # Don't open browser
9router --skip-update # Skip auto-update check
9router --help # Show all options
Dashboard: http://localhost:20128/dashboard
Already running 9Router on another machine (e.g. a team server on your LAN)? Point this machine's CLI tools at it — no local server is started:
npx 9router connect http://<server-host>:20128 # pick tools interactively
npx 9router connect http://<server-host>:20128 --tools claude,codex # or choose up front
npx 9router connect --reset --tools claude,codex # undo
It logs in with the dashboard password (hidden prompt), reuses or creates an API key named cli-<hostname>, and writes each tool's config (backing up the original once as *.bak-9router).
Supported tools: claude, codex, opencode, droid, crush, kilo, cline, pi, omp, or all.
Models come from the server's own CLI-tools configuration, so a client gets whatever the operator already picked on the dashboard. Nothing is hardcoded.
| Tool | Model taken from (first match wins) |
|---|---|
claude | tier flag (--opus …) → server's Claude tier → left unset (Claude Code's own default) |
| others | --model → that tool's own model on the server → server's OpenCode model → tool skipped |
kilo has no readable model on the server, so it always uses --model or the OpenCode model. omp (Oh My Pi) needs no model: it uses proxy discovery, so every server model appears under 9router in /model. A Claude tier the server doesn't set is removed from your config rather than kept from an earlier run. A skipped tool makes the command exit 1.
# One Claude tier; the other tiers still come from the server
npx 9router connect http://<server-host>:20128 --tools claude --sonnet cc/claude-sonnet-5-5
# Every Claude tier
npx 9router connect http://<server-host>:20128 --tools claude \
--fable cc/claude-fable-5-1 --opus cc/claude-opus-5-5 \
--sonnet cc/claude-sonnet-5-5 --haiku cc/claude-haiku-4-5-20251001
# All non-Claude tools at once
npx 9router connect http://<server-host>:20128 --tools codex,opencode,kilo --model ocg/deepseek-flash
# Claude and other tools in one run
npx 9router connect http://<server-host>:20128 --tools claude,codex --opus cc/claude-opus-5-5 --model gpt-6
# A different model per tool: --model covers every non-Claude tool in a run, so run once per tool
npx 9router connect http://<server-host>:20128 --tools codex --model gpt-6
npx 9router connect http://<server-host>:20128 --tools opencode --model ocg/glm-5.3
A model the server doesn't list is still written, with a not listed by server warning. To see the ids it serves: curl http://<server-host>:20128/v1/models -H "Authorization: Bearer <your key>".
9router show prints what each CLI tool on this machine is currently set to — base URL, masked API key and models. It only reads local files and never contacts a server.
npx 9router show # every supported tool
npx 9router show claude # one tool
npx 9router show claude codex # several
npx 9router show claude --json # machine-readable (key still masked)
✅ Claude Code
File: ~/.claude/settings.json
Base URL: http://<server-host>:20128/v1
API key: sk-a1b…9f3c
Models:
fable cc/claude-fable-5-1
opus cc/claude-opus-5-5
sonnet cc/claude-sonnet-5-5
Tools not pointed at 9router are listed as not configured. For Codex, OpenCode and Cline it also warns when a 9router entry exists but another provider is the active one.
| Option | Purpose |
|---|---|
--password <pw> | Dashboard password (or NINE_ROUTER_PASSWORD); prompted if omitted — preferred, keeps it out of shell history |
--save | After a successful login, save the password for this server to ~/.9router/connect.env (plain text, mode 600) so later runs skip the prompt. Delete the file to forget it |
--api-key <key> | Use this key and skip login. The server's models can't be read without a login, so pass model flags |
--key-name <name> | API key name to reuse/create (default cli-<hostname>) |
--print-env | Also print OPENAI_BASE_URL / OPENAI_API_KEY for other CLIs |
--reset | Remove the 9router settings from the selected tools |
See 9router connect --help for the full list.
⚠️ Over plain
http://the password and API key are sent unencrypted — use a trusted LAN/VPN or put HTTPS in front. The API key is stored in each tool's config file.
Claude-Code • OpenClaw • Codex • OpenCode • Cursor • Antigravity • Cline • Continue • Droid • Roo • Copilot • Kilo Code • Gemini CLI • Qwen Code • iFlow • Crush • Crusher • Aider
Any tool supporting OpenAI/Claude-compatible API works.
~/.9router/db/data.sqlite%APPDATA%/9router/db/data.sqlite/app/data/db/data.sqlite (mount $HOME/.9router to persist)Full docs, advanced setup, video tutorials & development guide:
MIT License - see LICENSE for details.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.5.25 | 10 Jul 2026 | 7 | |
| 0.5.20 | 7 Jul 2026 | 7 | |
| 0.5.18 | 3 Jul 2026 | 7 | |
| 0.5.15 | 29 Jun 2026 | 7 | |
| 0.5.12 | 26 Jun 2026 | 7 | |
| 0.5.8 | 21 Jun 2026 | 7 | |
| 0.5.4 | 18 Jun 2026 | 7 | |
| 0.5.3 | 18 Jun 2026 | 7 | |
| 0.5.2 | 17 Jun 2026 | 7 | |
| 0.4.80 | 13 Jun 2026 | 7 | |
| 0.4.71 | 6 Jun 2026 | 7 | |
| 0.4.66 | 29 May 2026 | 7 | |
| 0.4.63 | 26 May 2026 | 7 | |
| 0.4.62 | 26 May 2026 | 7 | |
| 0.4.59 | 21 May 2026 | 7 | |
| 0.4.58 | 21 May 2026 | 7 | |
| 0.4.55 | 18 May 2026 | 7 | |
| 0.4.52 | 17 May 2026 | 7 | |
| 0.4.50 | 16 May 2026 | 7 | |
| 0.4.49 | 16 May 2026 | 7 |
9Router has an Authentication Bypass in Public LLM API via Spoofable X-9r-Real-Ip Header
Source record9router: Login brute-force protection bypass via spoofed X-Forwarded-For header
Source record9router's Hardcoded Default fallback JWT Secret Allows Authentication Bypass
Source record9router /v1 APIs has unauthenticated access via reverse proxy locality collapse
Source record9router: Image prefetch DNS rebinding allows SSRF to internal services
Source record9router: Unauthenticated LLM proxy access via /codex rewrite authorization bypass
Source record9router: Unauthenticated Remote Code Execution via unprotected MCP custom plugin routes
Source record9router: Unauthenticated `/v1` proxy access via `Host`-header spoofing → open AI relay + SSRF
Source record9Router has a Login Brute-Force Lockout Bypass via Spoofable X-9r-Real-Ip Header
Source record9router has unauthenticated CRUD on /api/providers and Full API Key Leak via /api/usage/stats
Source recordMatched to the package identity. Affected version ranges have not been evaluated.
Observed since 20 Oct, 21:40 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:2dea08eb1fa18b2db1d86a0922ff2606352f28cf4bf4f4838e6610f40ef2db8b