Your Claude and ChatGPT subscriptions each live inside their own apps. dario makes them work everywhere, and keeps the receipt.
Point Claude Code, Cursor, Aider, Cline, Codex CLI, the SDKs and anything with a base-URL setting at localhost:3456. Each request goes to a seat with headroom; with a fallback chain the other plan takes it when one hits its window; and the ledger prices every request at API rates so you can see what each plan absorbed.
$ npm install -g @askalf/dario # or: brew install askalf/tap/dario $ dario login # your Claude plan: Pro, Max 5x or Max 20x Login successful. $ dario proxy # leave it running dario · http://localhost:3456 Your Claude subscription is now an API. Pool: 1 account · OAuth healthy · Model passthrough
Two base URLs, one key, every tool
You already pay for Claude, for ChatGPT, or both, and each plan spends through its own runtime: Claude Code and the Agent SDK, the ChatGPT app and Codex CLI. The tools that want a base URL and an API key get a meter instead: per token, or a monthly credit balance that stops when it runs out, while the seat's own windows sit idle. dario is the seam: install it, log in once, point everything at it, and the seat is spent first.
export ANTHROPIC_BASE_URL=http://localhost:3456 export ANTHROPIC_API_KEY=dario # claude, aider --model sonnet, the Anthropic SDKs
export OPENAI_BASE_URL=http://localhost:3456/v1 export OPENAI_API_KEY=dario # Codex CLI, the OpenAI SDKs, chat/completions and Responses
Works with every tool that honors those variables or has a Base URL field. Per-tool setup, with the gotchas each one has:
A dashboard at /analytics/ui
The ledger prices every request at API rates and says which plan absorbed it. Every proxy serves the page: the seats and their headroom, who paid for the last hour, the live request tail, the keys and their budgets, and the overage halt with a Resume button. Nothing loads from outside the proxy, light and dark follow your system, every chart has a table view, and it reads on a phone or a wall display.

Sample data, rendered from the shipped page opened from disk. Served by a running proxy it goes live, with the analytics token or an API key.
- Knows what it saved youA ledger prices every request at API list rates and keeps the number across restarts: today, 7 days, 30 days, all time; per model and per consumer, covered by a seat vs metered.
- The same numbers everywhereThe TUI,
/analytics, Prometheus/metrics, the per-request timing split anddario usage --cardread the same ledger and the same window. - Yours to readOne file served by the proxy, no library, no font, no analytics. What each route carries
Routing, failover, a pool, a ledger, a guard
Failover that finishes the answer
With a --pool-fallback chain, a 429 on one plan is re-served by the other. A stream that dies mid-answer is completed on the same model first, chain or not.
Many seats, one endpoint
Per-model headroom routing, a session-sticky prompt cache and in-flight 429 failover across every seat you hold. New conversations go to the seat with the most headroom; fill-first, expiring-first and headroom-by-plan are a flag away.
Stops before it costs you
The overage guard halts the proxy the moment a response bills outside your subscription, and tells you why. Resume from the dashboard, the API or the CLI.
Guardrails
Tracks Claude Code on its own
Ten unattended watchers catch wire-shape drift and ship the fix, usually the same day. Every change is published as a feed you can subscribe to.
How dario tracks Claude Code · the wire-drift feedEvery tool, one URL
No per-tool keys and no second bill: anything with a base-URL setting runs on the plan you already pay for.
Per-tool setupEither plan, either wire shape
Your ChatGPT plan behind Claude Code and the Anthropic SDKs; Codex CLI on your Claude plan. Messages, chat/completions and Responses, translated once at the front door.
Two plansOne key per developer
Named keys with a preferred seat, a model allowlist and a daily budget in dollars or tokens. A key can also be a unix socket, so a CI job holds no secret. The ledger and the dashboard split spend by key.
Keys and budgetsKnows what it saved you
A ledger prices every request at API rates; the TUI, the dashboard, /analytics and Prometheus /metrics all read it.
Your traffic as the benchmark
Shadow-compare any request against another model and read the results with dario compare.
Runs where you run
A laptop, a server, Docker, Kubernetes, a Pi in a closet. Binds loopback by default and refuses a public bind without a key. Replicas share seats through one lock service, with --pool-shared-state their rate-limit readings and sticky bindings too, and with --pool-shared-accounts one account list, so a new replica starts with its peers' accounts.
The tool doesn't know. The backend doesn't know.
You point every tool at one URL. dario reads each request, decides which plan or backend owns it, and forwards it in that backend's native protocol.
| Client speaks | Model | Routes to | What happens |
|---|---|---|---|
| Anthropic Messages | claude-* / opus / sonnet / haiku | Claude pool | OAuth swap and the Claude Code template, then api.anthropic.com |
| Anthropic Messages | a slug your ChatGPT account lists | Codex engine | Messages to Responses translation, subscription auth |
| Anthropic Messages | gpt-4o, llama-*, any name no plan lists | Refused | 400 with x-dario-upstream-rejection: model_unroutable; reach an API-key backend from this shape with a provider prefix |
| OpenAI Chat | gpt-* / o1-* / o3-* / o4-* | OpenAI-compatible backend | Auth swap, body forwarded byte-for-byte |
| OpenAI Chat | a slug your ChatGPT account lists | Codex engine | chat/completions to Responses translation, subscription auth |
| OpenAI Chat | claude-* | Claude pool | OpenAI to Anthropic translation, then the Claude path |
| Either | <provider>:<model> | Forced by prefix | Explicit override |
dario is the seam. The full lineup, shortcuts, the live model catalog and when a name is refused
Will my account get suspended?
I can't promise you won't be actioned, and I'd be skeptical of anyone who does. Only Anthropic decides how it enforces its terms. What I can do is lay out exactly how dario works, so you can weigh the risk yourself instead of taking anyone's word for it.
dario runs entirely on your machine, authenticates as you with your own Claude login, sends requests in the shape the official client sends, and reports nothing anywhere. What it adds is letting tools other than Claude Code use that subscription, and whether that falls within your plan's terms is Anthropic's call. The full answer, including the billing-split contingency dario is built for.
Small enough to read, checked in the open
npm ls --production.DARIO_API_KEY.0600 on disk.npm audit signatures npm view @askalf/dario dist.integrity cd $(npm root -g)/@askalf/dario && npm ls --production
Security reports go to security@askalf.org, not a public issue: SECURITY.md. API stability commitments: STABILITY.md. The measured overhead of the proxy on every PR: bench-overhead.mjs.
The docs
- Per-tool setup: Codex CLI, Claude Code, Cursor, Cline / Roo / Kilo, Aider, Continue, Zed, OpenHands, OpenClaw, the SDKs, curl, Docker (the source doc)
- Routing and the model lineup
- Two plans: your ChatGPT plan on both endpoints, failover between subscriptions, shadow compare
- Seats, keys and analytics: the pool, named keys and budgets, the TUI, the ledger,
/metrics - Analytics routes and API-equivalent spend
- How dario tracks Claude Code: the watchers, their live status, what they caught
- Guardrails: the overage guard and the billing split
- Will my account get suspended? · Who it's for, and how it compares
- Commands and endpoints · every flag · env vars · SDK examples
- FAQ · Docker · Coming back after a while?
- Contributing: architecture, the file-by-file map and the review bar · Changelog
- Discussions: dario vs LiteLLM / OpenRouter / Kong, template replay, rate-limit headers