You open Cursor and paste an OpenAI key. Then Claude Code wants Anthropic. OpenCode wants something else. Switch models for a week and you're editing three config files and hoping you didn't leave a key in a screenshot.
I wanted one address on my own machine that every OpenAI-compatible client could talk to, with the provider keys staying on disk. That's WowRouter.
What it actually is
WowRouter is a local AI router. It listens only on this computer:
| What | Address |
|---|---|
| Web panel | http://127.0.0.1:8787 |
| OpenAI-compatible API | http://127.0.0.1:8787/v1 |
You add provider keys in the panel, turn models on, create a router key (shown once, starts with sk-airoute-), and point Cursor or any OpenAI client at that base URL with the router key.
A public model id looks like openai/gpt-4o-mini. You can also set the model to auto (or auto/cheap, auto/fast, auto/coding) and let the router pick among the chat models you turned on. Named combos use ids like fallback/daily and fall through when a model fails.
Provider keys are encrypted with a local secret. Router keys are stored as hashes — the panel cannot show a router key again after you leave the create screen. The server rejects a listen address that isn't loopback (127.0.0.1, localhost, or ::1).
Install
Node.js 20 or newer:
npm install -g wowrouter wowrouter npm install -g airoute is the same program. Desktop builds for Windows, macOS and Linux are attached to each GitHub release. Docker works too, still bound to this computer:
docker run -d --name wowrouter \ -p 127.0.0.1:8787:8787 \ -v wowrouter:/data \ foisalislambd/wowrouter:latest First setup
- Open the panel.
- Providers — save an API key (GitHub Enterprise Copilot uses Sign in with GitHub; Copilot Web asks for a bearer token). Rows marked Unsupported have no stable API.
- Turn on the models you want. A model that is off is not offered to clients.
- API keys — create a router key.
- In Cursor (or any OpenAI client): base URL
http://127.0.0.1:8787/v1, API key = that router key.
Chat calls need three things at once: a saved provider key, the model switched on, and a router key on the request. Password / OIDC on the panel are off by default. Leave them off on your own computer. Turn one on before you publish the port (for example from Docker on a VPS).
Some providers ship with an empty model list. Load models on that provider's page fills it from the provider.
What's in the panel
Overview, Providers, Routing (auto presets and named fallbacks), API keys, Playground, Activity (each gateway call with request/response), Clients (copy-paste setup plus a confirmed one-click writer for Claude Code, OpenCode and Codex), Usage (calls by model, 14-day chart, estimated cost), Memory (optional notes prepended to chat), and Settings.
Closing the browser tab does not stop the router.
Stack and license
Go server and SQLite, React panel, native desktop wrapper, npm CLI that launches the server. MIT. Current release is v1.5.5. Repo: github.com/foisalislambd/wowrouter.
Honest limits
- It's young. The repo started in October 2026. I'm one person.
- Some providers are marked Unsupported. Decision models use
POST /v1/systemone, not chat completions. - If you expose the port past loopback without a panel password or OIDC, that's on you — the README is clear about locking it first.
- I have not counted how many providers the catalog currently lists; open the Providers page after install rather than trusting a number from a blog post.
If you try it and something breaks, open an issue on the repo. If your setup is "three agents, five keys, one laptop", I'd like to know whether one local endpoint actually helped.
— foisal