{"_id":"9router-backend","_rev":"2-3550e206375b61a4c0e601a80345d746","name":"9router-backend","dist-tags":{"latest":"0.6.256"},"versions":{"0.6.227":{"name":"9router-backend","version":"0.6.227","_id":"9router-backend@0.6.227","maintainers":[{"name":"fsrouter","email":"nexusrouters@gmail.com"}],"bin":{"amrouter":"bin/cli.cjs"},"dist":{"shasum":"e9bed76ceb9ed81185b50626f1f1d519a5e5170f","tarball":"https://registry.npmjs.org/9router-backend/-/9router-backend-0.6.227.tgz","fileCount":5262,"integrity":"sha512-FFmZirVwB8CczaGHJRShasljrze+VfM19NQbIprZ1aFWfNS0vLjDgjdYG/4+1zB6vda7zSY+jj0KKhhlv0WX4A==","signatures":[{"sig":"MEQCIBRqBz439fZoIE3Wlb87hSRWTcg8IaYQu3vw1QRxlLBvAiAQgUFlR4ZjVlmIOAEjHoh+d0+PnbbNowAkMfeQrIpZXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126295563},"main":"src/server.ts","type":"module","imports":{"@/*":"./dist/*","open-sse":"./open-sse/index.js","open-sse/*":"./open-sse/*"},"scripts":{"dev":"tsx watch src/server.ts","build":"node bin/rewriteSseImports.js && tsc --project tsconfig.json || true && node bin/copyJs.js","start":"node dist/server.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fsrouter","email":"nexusrouters@gmail.com"},"_npmVersion":"10.9.8","description":"9Router v2 — Express Backend (API, SSE, DB, Auth, MITM)","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"3.25.76","cors":"^2.8.5","hono":"^4.12.31","jose":"^6.1.3","uuid":"^11.1.0","helmet":"^8.1.0","marked":"^15.0.12","sql.js":"^1.14.1","undici":"^7.10.0","confbox":"^0.2.4","express":"^5.1.0","bcryptjs":"^3.0.3","node-forge":"^1.3.3","selfsigned":"^5.5.0","cookie-parser":"^1.4.7","puppeteer-core":"^25.3.0","fast-deep-equal":"^3.1.3","node-machine-id":"^1.1.12","@hono/node-server":"^2.0.11","socks-proxy-agent":"^8.0.5"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.4","typescript":"^5.8.3","@types/cors":"^2.8.17","@types/node":"^24.0.0","@types/express":"^5.0.3","@types/bcryptjs":"^2.4.6","@types/cookie-parser":"^1.4.8","@types/better-sqlite3":"^7.6.13","@modelcontextprotocol/sdk":"^1.29.0"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"_npmOperationalInternal":{"tmp":"tmp/9router-backend_0.6.227_1784916119747_0.5028403597983664","host":"s3://npm-registry-packages-npm-production"}},"0.6.256":{"name":"9router-backend","version":"0.6.256","type":"module","description":"9Router v2 — Express Backend (API, SSE, DB, Auth, MITM)","main":"src/server.ts","bin":{"amrouter":"bin/cli.cjs","fsrouter":"bin/cli.cjs"},"scripts":{"dev":"tsx watch src/server.ts","start":"node dist/server.js","build":"node bin/rewriteSseImports.js && tsc --project tsconfig.json || true && node bin/copyJs.js","typecheck":"tsc --noEmit"},"dependencies":{"@hono/node-server":"^2.0.11","bcryptjs":"^3.0.3","confbox":"^0.2.4","cookie-parser":"^1.4.7","cors":"^2.8.5","express":"^5.1.0","fast-deep-equal":"^3.1.3","helmet":"^8.1.0","hono":"^4.12.31","jose":"^6.1.3","marked":"^15.0.12","node-forge":"^1.3.3","node-machine-id":"^1.1.12","puppeteer-core":"^25.3.0","selfsigned":"^5.5.0","socks-proxy-agent":"^8.0.5","sql.js":"^1.14.1","undici":"^7.10.0","uuid":"^11.1.0","zod":"3.25.76","chalk":"^4.1.2","ora":"^5.4.1","@modelcontextprotocol/sdk":"^1.29.0"},"imports":{"@/*":"./dist/*","open-sse":"./open-sse/index.js","open-sse/*":"./open-sse/*"},"devDependencies":{"@modelcontextprotocol/sdk":"^1.29.0","@types/bcryptjs":"^2.4.6","@types/better-sqlite3":"^7.6.13","@types/cookie-parser":"^1.4.8","@types/cors":"^2.8.17","@types/express":"^5.0.3","@types/node":"^24.0.0","tsx":"^4.19.4","typescript":"^5.8.3"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"_id":"9router-backend@0.6.256","_nodeVersion":"22.23.0","_npmVersion":"10.9.8","dist":{"integrity":"sha512-iZl4Am2hleKo/l0Y2g4B1opAf7CPvjZW1x46azJ9mOL+DjudWzpOQf/6OMtLRWIxdhvQGQcZ8E+iLAs/Hr8uPg==","shasum":"d1242fec877c83fed0b428362cd57f118ce9ded4","tarball":"https://registry.npmjs.org/9router-backend/-/9router-backend-0.6.256.tgz","fileCount":1351,"unpackedSize":20509596,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD2o1YNskk/B08gGbMFTTyZjo43KlU5YFscICkoOywNTgIgHaF0JvJ5GlFK7c4wbe3sIHNvuGA10x3UgmW63B+kguE="}]},"_npmUser":{"name":"fsrouter","email":"nexusrouters@gmail.com"},"directories":{},"maintainers":[{"name":"fsrouter","email":"nexusrouters@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/9router-backend_0.6.256_1785165522873_0.49296640969264693"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-24T18:01:59.711Z","modified":"2026-07-27T15:18:43.339Z","0.6.227":"2026-07-24T18:02:00.777Z","0.6.256":"2026-07-27T15:18:43.184Z"},"description":"9Router v2 — Express Backend (API, SSE, DB, Auth, MITM)","maintainers":[{"name":"fsrouter","email":"nexusrouters@gmail.com"}],"readme":"# FSRouter\n\n> A self-hosted AI gateway — one endpoint, many providers, auto-fallback.\n\nFSRouter is a decoupled rewrite of 9Router with a clean separation between a dedicated **Express backend** and a **Vite + React frontend**. It exposes an OpenAI-compatible REST API that proxies requests across dozens of AI providers with automatic load balancing, fallback, and key rotation.\n\n---\n\n## Screenshots\n\n| Login Page | Quota Tracker |\n|:---:|:---:|\n| ![Login Page](docs/screnshoot/login-page.png) | ![Quota Tracker](docs/screnshoot/quota-tracker.png) |\n\n---\n\n## Features\n\n- **OpenAI-compatible API** — works with any client that supports `/v1/chat/completions`, `/v1/images/generations`, `/v1/audio/speech`, `/v1/embeddings`, etc.\n- **Multi-provider routing** — Cloudflare Workers AI, OpenAI, Anthropic, Gemini, Groq, and many more\n- **Cloudflare Workers AI Automation** — automates account registration and API key extraction with Playwright + 2Captcha + FSMail temp mail\n- **Dashboard UI** — manage providers, connections, proxy pools, CLI tools, and automation from a modern dark-mode interface\n- **OIDC / Password authentication** — single sign-on or local credentials\n- **Agent Skills** — ready-to-use SKILL.md files for Claude, Gemini, Codex, and other AI coding agents\n- **SQLite backend** — zero-dependency local database, no external services required\n\n---\n\n## Architecture\n\n```\nFSRouter/\n├── backend/          # Express server (port 3001)\n│   └── src/\n│       ├── routes/   # Auto-routed endpoints (/v1, /api, /auth, ...)\n│       ├── db/       # SQLite via better-sqlite3\n│       └── automation/ # Playwright automation scripts\n├── frontend/         # Vite + React SPA (port 5177)\n│   └── src/\n│       ├── pages/    # Dashboard pages\n│       └── shared/   # Components, hooks, constants\n└── skills/           # Agent SKILL.md files\n```\n\n---\n\n## Quick Start\n\n### Requirements\n\n- Node.js 20+\n- Python 3.10+ (for automation features)\n- Chromium (for Playwright automation)\n\n### Install\n\n```bash\ngit clone https://github.com/nexusrouters/fsrouter.git\ncd FSRouter\nnpm install\n```\n\n### Development\n\n```bash\nnpm run dev          # Start both backend + frontend concurrently\nnpm run backend      # Backend only (port 3001)\nnpm run frontend     # Frontend only (port 5177)\n```\n\n### Environment Variables\n\nCopy and configure the backend environment:\n\n```bash\ncp backend/.env.template backend/.env\n```\n\nKey variables:\n\n| Variable | Description |\n|---|---|\n| `PORT` | Backend server port (default: `3001`) |\n| `REQUIRE_LOGIN` | Enable authentication (`true`/`false`) |\n| `JWT_SECRET` | Secret for JWT signing |\n| `ADMIN_PASSWORD` | Dashboard admin password |\n\n---\n\n## Production Deployment\n\n### 1. Build Frontend\n\n```bash\ncd frontend && npm run build\n```\n\n### 2. Start Backend\n\n```bash\ncd backend && npm start\n```\n\n### 3. Nginx Reverse Proxy\n\nUse the included `nginx.conf` to proxy `/api` and `/v1` to the backend while serving the built frontend statically. See `docs/deployment-linux.md` for a full Linux deployment guide.\n\n---\n\n## Cloudflare Workers AI Automation\n\nThe automation module automatically registers Cloudflare Workers AI accounts:\n\n1. Configure **FSMail** temp mail credentials in Dashboard → Automation → Settings\n2. Add a **2Captcha** API key for Turnstile solving\n3. Add email accounts in the Automation tab and click **Run**\n4. API keys are extracted and added to FSRouter automatically\n\n---\n\n## Agent Skills\n\nSkills are SKILL.md files for AI coding agents. Paste the entry skill URL into your AI:\n\n```\nRead this skill and use it:\nhttps://raw.githubusercontent.com/nexusrouters/fsrouter/refs/heads/main/skills/fsrouter/SKILL.md\n```\n\nBrowse all skills in the Dashboard → Skills page or in the [`skills/`](./skills/) directory.\n\n---\n\n## API Reference\n\n| Endpoint | Description |\n|---|---|\n| `GET /api/health` | Health check |\n| `GET /v1/models` | List available chat/LLM models |\n| `POST /v1/chat/completions` | Chat completions (streaming supported) |\n| `POST /v1/images/generations` | Image generation |\n| `POST /v1/audio/speech` | Text-to-speech |\n| `POST /v1/audio/transcriptions` | Speech-to-text |\n| `POST /v1/embeddings` | Text embeddings |\n| `GET /v1/search` | Web search |\n\n---\n\n## License\n\nMIT — see [LICENSE](./LICENSE)\n\n---\n\n## Acknowledgements\n\n> 🙏 **Thanks to [FSRouter](https://github.com/decolua/9router)** — this project is a fork and architectural rewrite of the original FSRouter monolith. The core routing logic, provider integrations, and many features were inspired by and built upon the excellent work of the FSRouter project.\n","readmeFilename":"README.md"}