@askalf/dario

中文文档
6.23.1发布于 2026/11/08MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 1.4万

Use your Claude and ChatGPT subscriptions in Cursor, Cline, Aider, Claude Code and the Agent SDK at subscription pricing, not per-token API bills. One local Anthropic + OpenAI-compatible endpoint: either plan answers either wire shape, opt-in failover whe

原始使用文档
文档目录16 节
  1. Your Claude and ChatGPT subscriptions each live inside thei…
  2. Start in 60 seconds
  3. Why people pick it
  4. What it does with a request
  5. Watch it work
  6. Will my account get suspended?
  7. Reference
  8. Trust & transparency
  9. Deep dives
  10. Contributing
  11. Disclaimers
  12. License
  13. Own Your Stack
  14. Built by Thomas Sprayberry
  15. Sponsors
  16. Star history
dario routes every AI tool you use to the subscriptions you already pay for. Claude Code, Cursor, Cline, Aider, Codex CLI and the Agent SDK send requests to dario at localhost:3456, which forwards each one to your Claude plan or your ChatGPT plan and, with a fallback chain configured, fails over between them on a 429.

dario

Your Claude and ChatGPT subscriptions each live inside their own apps.
dario makes them work everywhere, spends the plan before the meter, and keeps the receipt.

npm version Downloads CI CI measured OpenSSF Scorecard License

One local endpoint. Every AI tool you own. Your Claude seats first, your ChatGPT plan and a metered key as the rungs you chain behind them, and a ledger of who paid for what.

In plain words: dario is a proxy you run on your own machine that answers your coding tools' API requests with the plans you already pay for. Each Claude or ChatGPT plan account it holds is a seat.

npm i -g @askalf/dario or brew install askalf/tap/dario · 0 runtime deps · SLSA-attested every release · nothing phones home · ~45k lines of TypeScript across 88 files · independent, unofficial, third-party (DISCLAIMER.md)

Start · Why dario · Routing · Risk · Reference · Trust · Coming back after a while?


You already pay for Claude,[^plans] for ChatGPT, or both. Each plan spends through its own runtime: Claude Code and the Agent SDK on one side, the ChatGPT app and Codex CLI on the other. Cursor, Aider, Cline, Continue, Zed and your own scripts want a base URL and an API key instead, and an API key is a meter: every token billed again, or, on a Max plan since October 2026, a monthly credit balance that stops when it runs out, while the seat's own windows sit idle.

dario is one local endpoint that puts all of it behind one URL. Point any Anthropic- or OpenAI-compatible tool at http://localhost:3456 and you're done. Each request goes to a seat with headroom. Chain the rest with --pool-fallback and the other plan takes the request when one hits its window, with a metered backend as the last rung if you add one; without a chain, a drained pool returns its honest 429. The ledger prices every request at API rates and shows what each plan absorbed, in the TUI, the dashboard and /metrics.

Start in 60 seconds

npm install -g @askalf/dario      # or: brew install askalf/tap/dario
dario login --no-proxy   # your Claude plan (Pro, Max 5x or Max 20x); add --manual for SSH / headless
dario proxy              # leave it running, then point any tool at http://localhost:3456 with key `dario`
Terminal: npm install -g @askalf/dario, dario login (Opening browser to sign in… Login successful!), dario proxy (dario — http://localhost:3456. Your Claude subscription is now an API. Usage: ANTHROPIC_BASE_URL=http://localhost:3456, ANTHROPIC_API_KEY=dario. OAuth healthy, Model passthrough, Pool: 1 account), then export the two variables and run aider --model sonnet.

Anthropic-shaped tools: export ANTHROPIC_BASE_URL=http://localhost:3456 ANTHROPIC_API_KEY=dario. OpenAI-shaped tools use OPENAI_BASE_URL=http://localhost:3456/v1 instead, same key. Every tool that honors those env vars now runs on your subscription.

Check it answers, from a second terminal:

curl http://localhost:3456/v1/messages \
  -H "Content-Type: application/json" -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-fable-5","max_tokens":64,"messages":[{"role":"user","content":"Hello"}]}'

Add your ChatGPT plan as a second seat with dario add altman.

What dario does with your login, plainly.

  • It uses the Claude login already on this machine: Claude Code's own store (~/.claude/.credentials.json, or the macOS keychain) or the one dario login saves under ~/.dario/. It refreshes that token when it expires. If this proxy serves only your ChatGPT plan or an API key, start it with --no-claude-auth so it never touches a Claude token that Claude Code here also uses.
  • It sends each Claude request in the shape Claude Code sends, which is what keeps it billing to your plan. --strict-tls and --stealth go further and match Claude Code's TLS handshake and request timing.
  • It talks only to the backends you set up, and reports nothing anywhere. Claude and ChatGPT traffic goes over HTTPS; a backend you add with dario backend add uses whatever its base URL says, so an http:// URL there is sent unencrypted, key included.
  • Whether this use fits each plan's terms is for you and the provider to decide: Anthropic's consumer terms, and the terms of your ChatGPT plan. The longer answer: Will my account get suspended?

Works with: Claude Code, Cursor, Aider, Cline, Roo Code, Kilo Code, Continue.dev, Zed, OpenHands, OpenClaw, Hermes, Codex CLI, the Claude Agent SDK, the Anthropic and OpenAI SDKs, curl, your own scripts. Per-tool setup →

Prefer Homebrew? brew install askalf/tap/dario installs the same npm release through a formula that follows the registry (tap); upgrade with brew upgrade dario. Prefer Docker? ghcr.io/askalf/dario:latest, multi-arch (amd64 + arm64), published from the same workflow as every npm release (guide). Something off? dario doctor prints one paste-ready health report.

Why people pick it

  • Every tool, one URL, either plan. No per-tool keys and no second bill: anything with a base-URL setting runs on the plan you already pay for, your ChatGPT plan behind Claude Code and the Anthropic SDKs, Codex CLI on your Claude plan. Per-tool setup · Two plans
  • Spends the plan before the meter, and finishes the answer. Seats with headroom first, then the --pool-fallback chain you configure: the other plan on a 429, a metered rung last (your Max plan's API credits through a Console key, or an openai-compat backend). No chain means no substitution: a drained pool returns its honest 429. When one model family is parked but the seat still has room, --family-fallback=fable=claude-opus-5-5 serves it as another Claude model instead of a 429 (how). A stream that dies mid-answer is completed on the same model first, chain or not. Nothing is swapped silently: every substituted response says so in a header. Failover
  • Knows who paid, and stops before it costs you. A ledger prices every request at API rates and splits it by plan, by key and by model: what the seats absorbed, what went to extra usage or an API key. In the TUI, the dashboard at /analytics/ui, /analytics, Prometheus /metrics and dario usage (analytics). The overage guard halts the proxy the moment a response bills outside your subscription (guardrails), and shadow compare benchmarks your own traffic against another model, read with dario compare (shadow compare).
  • Many seats, one key per developer. Per-model headroom routing, session-sticky prompt cache, in-flight 429 failover across every seat you hold. New conversations go to the seat with the most headroom by default; --pool-strategy=fill-first fills seats in alias order, expiring-first spends the seat whose weekly window resets soonest, and headroom-by-plan counts each seat's headroom by its plan size, shown in the startup banner, GET /status, dario doctor and dario accounts list (the pool). Named keys carry a preferred seat, a model allowlist and a daily budget; a CI job or a sandboxed agent can be a key with no secret to hold, through --key-socket (key sockets, keys).
  • Tracks Claude Code on its own. Ten unattended watchers run on a schedule: six watch what Claude Code sends, its remote config, how it bills and how it behaves at run time, and four watch the ChatGPT backend, Anthropic's prices, whether the running deploy matches the release, and the watchers themselves. The fix usually ships the same day. Drift
One key per developer. Every seat behind one endpoint. Keys alice ($5 a day), bob (Sonnet only) and ci (2M tokens a day) go through dario at localhost:3456, which sends each new conversation to the seat with the most headroom: Claude Max 20x, Claude Max 5x or a ChatGPT plan.

What it does with a request

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 speaksModelRoutes toWhat happens
Anthropic Messagesclaude-* / opus / sonnet / haikuClaude poolOAuth swap + Claude Code template, then api.anthropic.com
Anthropic Messagesa slug your ChatGPT account listsCodex engineMessages→Responses translation, subscription auth
Anthropic Messagesgpt-4o, llama-*, any name no plan listsRefused400 + x-dario-upstream-rejection: model_unroutable; reach an API-key backend from this shape with a provider prefix
OpenAI Chatgpt-* / o1-* / o3-* / o4-*OpenAI-compat backendAuth swap, body forwarded byte-for-byte
OpenAI Chata slug your ChatGPT account listsCodex enginechat/completions→Responses translation, subscription auth
OpenAI Chatclaude-*Claude poolOpenAI→Anthropic translation, then the Claude path
Either<provider>:<model>Forced by prefixExplicit override

The tool doesn't know. The backend doesn't know. dario is the seam.

The full Claude lineup, shortcuts, the live model catalog and when a name is refused: routing.md.

Watch it work

The dario dashboard on sample data: a hero figure of what today's requests would have cost at API list prices and the share the seats absorbed, a KPI row (requests, pool headroom, error rate, latency, cached prompt, in flight), four seats with 5h and 7d meters and reset timers, a routing bar of who paid for the last hour with burn rates, the live request tail and the request timing split.

Every proxy serves a dashboard at http://localhost:3456/analytics/ui: the seats and their headroom, who paid for the last hour, the live request tail, what the ledger says your plans absorbed, 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 above, rendered from the shipped page; served by a running proxy it goes live with the analytics token or an API key. Analytics

Will my account get suspended?

The most common question about dario, and it deserves a straight answer: 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.

Reference

Trust & transparency

Everything inside the box labeled your machine: the tools and dario. Only two lines leave it, to the Claude plan and the ChatGPT plan, through a padlock. Pills read 0 deps, no telemetry, MIT.
SignalStatus
Source~45k lines of TypeScript across 88 files. One credential path since v5: the pool.
Dependencies0 runtime. Verify: npm ls --production
ProvenanceEvery release SLSA-attested via GitHub Actions + Sigstore, published with OIDC trusted publishing: no long-lived npm token exists to leak
ScanningCodeQL on every push to master, every PR and weekly · ClusterFuzzLite fuzzes the SSE translator, the rejection parsers and the cch stamper weekly · the OpenSSF Scorecard badge above and the Best Practices entry are live
Tests289 test files run in parallel by npm test on Node 18, 20 and 22; the live e2e / compat / stealth suites have their own entry points. Green on every release
CredentialsYour own subscription tokens, never logged, redacted from errors, 0600 on disk in 0700 dirs
NetworkBinds 127.0.0.1 by default; upstream only to configured backends over HTTPS; hardcoded SSRF allow-list; refuses a non-loopback bind without DARIO_API_KEY; refuses cross-origin and DNS-rebound browser requests
TelemetryNone. No analytics, no tracking, nothing phones home
OverheadMeasured in the open on every PR: scripts/bench-overhead.mjs runs a real proxy against an instant upstream beside a bare http server serving the same bytes. On loopback dario adds no measurable p50 wall time over that floor; the CPU per request is the number to watch, and the per-request timing split shows it live
This READMECI fails if the line count above drifts from src/ or a link or anchor here stops resolving (check-readme-line-count.mjs, check-readme-links.mjs); the TUI screenshots are rendered from the real TUI and the diagrams are briefed art, not screenshots (how)
npm audit signatures
npm view @askalf/dario dist.integrity
cd $(npm root -g)/@askalf/dario && npm ls --production

Security reports go to [email protected], not a public issue: SECURITY.md. API stability commitments (@stable / @experimental / @deprecated, deprecation cycles): STABILITY.md.

Deep dives

Contributing

PRs welcome. Small TypeScript codebase, zero runtime deps. Architecture, file-by-file map and the review bar in CONTRIBUTING.md; release mechanics in RELEASING.md.

git clone https://github.com/askalf/dario && cd dario
npm install
npm run dev    # tsx, no build step
npm test       # 289 files in parallel via test/all.test.mjs
npm run e2e    # live proxy + OAuth (needs a working Claude backend)

Drift and audit runners, none of them part of npm test:

npm run drift:wire     # compare a live Claude Code capture against the baked template
npm run drift:sdk      # Agent SDK / Stainless pin drift
npm run audit:tui      # drives the real TUI through a fake TTY at 12 geometries
npm run check:overage  # overage-classifier check against live headers
npm run stress         # concurrency / queue behaviour under load
npm run cch:calibrate  # re-derive the billing-tag cch seed for a new Claude Code build
npm run readme:assets  # regenerate the diagrams and TUI screenshots (README + docs/)

Two easy ways to help beyond code: star the repo, the clearest signal this is useful, and file drift: open an issue when a rate-limit header flips or a tool that worked yesterday breaks today, and it gets documented in public alongside the fix. Follow @ask_alf for drift bulletins as they land.

Everyone whose issue, pull request or audit shaped dario is credited in CONTRIBUTORS.md.

Disclaimers

dario is an independent, unofficial, third-party project. Not affiliated with, endorsed by, or sponsored by Anthropic, OpenAI, or any vendor referenced here. Provided as-is, no warranty. You are solely responsible for compliance with your subscription's terms, the security of your credentials, and the content you send through the proxy. Not for safety-critical, regulated, or production environments without your own review. Full text: DISCLAIMER.md.

License

MIT. See LICENSE and DISCLAIMER.md. The embedded README font is Space Mono under the SIL Open Font License.

Own Your Stack

dario is the routing layer of Own Your Stack, open tools for owning your AI infrastructure instead of renting it by the token. One subscription. Your box. Your terms.

Built by Thomas Sprayberry

dario is part of Own Your Stack, the open toolkit behind Sprayberry Labs, the software studio with one human on staff, run by askalf, the AI operation these tools are part of.

Built in the open, scars included. Follow the build: @ask_alf

Sponsors

dario is funded by its users through GitHub Sponsors: the live-test seats it is checked against before every release are the biggest line item. Sponsors at $25/month and up are listed here.

This block and the thank-you in each release's notes come from scripts/sponsors.mjs, which reads the public sponsor list; sponsors-readme.yml opens a PR when it changes. Private sponsors are never named.

Star history

Star history of askalf/dario

[^plans]: Pro, Max 5x or Max 20x; the current prices are on claude.com/pricing.

版本与发布记录

@askalf/dario 共发布 703 个版本,首次发布于 2026/04/09;过去 12 个月发布了 703 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
6.23.1latest2026/11/08今天
6.23.02026/11/07今天
6.22.32026/11/07今天
6.22.22026/11/07今天
6.22.12026/11/071 天前
6.22.02026/11/061 天前

关于 @askalf/dario 的常见问题

@askalf/dario 是什么?

Use your Claude and ChatGPT subscriptions in Cursor, Cline, Aider, Claude Code and the Agent SDK at subscription pricing, not per-token API bills. One local Anthropic + OpenAI-compatible endpoint: either plan answers either wire shape, opt-in failover whe

如何安装 @askalf/dario?

在项目目录运行 npm install @askalf/dario,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 dario,可以用 npx dario 直接运行。

@askalf/dario 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@askalf/dario 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@askalf/dario 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@askalf/dario 可以商用吗?

@askalf/dario 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@askalf/dario 的下载量有多少?

根据 npm 官方下载统计,@askalf/dario 在 2026/10/07 – 2026/11/05 这 30 天内被下载 13,662 次,日均约 455 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@askalf/dario 还在维护吗?

最新版本 6.23.1 发布于 2026/11/08(今天);至今共发布 703 个版本,其中过去 12 个月发布了 703 个;首次发布于 2026/04/09。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。