npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@askalf/dario

v6.13.18

Published

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, with automatic fa

Readme

dario

Your Claude and ChatGPT subscriptions each work in exactly one place.dario makes them work everywhere, at subscription pricing, not per-token API bills.

npm i -g @askalf/dario · 0 runtime deps · SLSA-attested every release · nothing phones home · ~41k lines you can read in a weekend · independent, unofficial, third-party (DISCLAIMER.md)

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


You're already paying $20, $100 or $200 a month for Claude,[^plans] or for a ChatGPT plan. Then Cursor wants an API key. Aider wants an API key. Cline, Continue, Zed, your own scripts: every one of them bills you again, per token, while the plan you bought sits idle in the one app it shipped with.

dario is one local endpoint that routes all of them through the plans you already pay for. Point any Anthropic- or OpenAI-compatible tool at http://localhost:3456 and you're done. No per-tool config, no second bill, and when one plan hits its limit the other one takes the request.

Start in 60 seconds

npm install -g @askalf/dario
dario login      # your Claude plan (Pro, Max 5x or Max 20x); `dario login --manual` for SSH / headless
dario proxy      # leave it running, then point any tool at http://localhost:3456 with key `dario`

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.

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 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. No per-tool keys and no second bill: anything with a base-URL setting runs on the plan you already pay for. Per-tool setup
  • Either plan, either wire shape. Your ChatGPT plan behind Claude Code and the Anthropic SDKs; Codex CLI on your Claude plan. Two plans
  • Failover that finishes the answer. A 429 on one plan is re-served by the other, and a stream that dies mid-answer is completed on the same model first. Failover
  • Many seats, one endpoint. 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 and expiring-first spends the seat whose weekly window resets soonest. The active strategy shows in the startup banner, GET /status, dario doctor and dario accounts list. The pool
  • One key per developer. Named keys with a preferred seat, a model allowlist and a daily budget. Keys
  • Knows what it saved you. A ledger prices every request at API rates; see it in the TUI, /analytics, Prometheus /metrics and a per-request timing split. Analytics
  • Tracks Claude Code on its own. Eleven unattended watchers catch wire-shape drift and ship the fix, usually the same day. Drift
  • Stops before it costs you. The overage guard halts the proxy the moment a response bills outside your subscription. Guardrails
  • Your traffic as the benchmark. Shadow-compare any request against another model and read the results with dario compare. Shadow compare

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 speaks | Model | Routes to | What happens | |---|---|---|---| | Anthropic Messages | claude-* / opus / sonnet / haiku | Claude pool | OAuth swap + Claude Code template, then api.anthropic.com | | Anthropic Messages | a slug your ChatGPT account lists | Codex engine | Messages→Responses translation, subscription auth | | Anthropic Messages | gpt-4o, llama-*, any name no plan lists | Refused | 400 + 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-compat backend | Auth swap, body forwarded byte-for-byte | | OpenAI Chat | a slug your ChatGPT account lists | Codex engine | chat/completions→Responses translation, subscription auth | | OpenAI Chat | claude-* | Claude pool | OpenAI→Anthropic translation, then the Claude path | | Either | <provider>:<model> | Forced by prefix | Explicit 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.

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

| Signal | Status | |---|---| | Source | ~41k lines of TypeScript across 79 files, auditable in a weekend. One credential path since v5: the pool. | | Dependencies | 0 runtime. Verify: npm ls --production | | Provenance | Every release SLSA-attested via GitHub Actions + Sigstore, published with OIDC trusted publishing: no long-lived npm token exists to leak | | Scanning | CodeQL on every push to master, every PR and weekly · ClusterFuzzLite fuzzes the SSE translator, the rejection parsers and the cch stamper weekly · OpenSSF Scorecard and Best Practices badges above are live | | Tests | 241 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 | | Credentials | Your own subscription tokens, never logged, redacted from errors, 0600 on disk in 0700 dirs | | Network | Binds 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 | | Telemetry | None. No analytics, no tracking, nothing phones home | | Overhead | Measured 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 README | CI 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       # 241 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.

Contributors

| Who | Contributions | |---|---| | @GodsBoy | Proxy auth, token redaction, error sanitization (#2) | | @belangertrading | Billing-classification investigation (#4, #6, #7, #12, #23), multi-agent billing FAQ (#27) | | @wysie | ESM require crash in dario login (#15), OAuth for Max-plan accounts (#18) | | @earlvanze | OpenClaw tool mappings (#19), OAuth manual override (#47), HTTPS warning (#53) | | @nathan-widjaja | README positioning structure: the promise → who → first use → why-switch spine the page still runs on (#21) | | @trinhnvgem | OAuth login failures on first release (#22), container and headless callback binding (#28) | | @adubkov | The container / headless-SSH case behind the manual OAuth code paste (#28) | | @iNicholasBE | macOS keychain credential detection (#30) | | @boeingchoco | Reverse tool-param translation (#29), SSE framing regression catch, hybrid-tool motivation (#33, #36) | | @tetsuco | Scrubber path corruption (#35), OpenClaw reverse-mapping collisions (#37), 20x-tier report (#42) | | @mikelovatt | Silent subscription-drain surfaced via friendly billing buckets (#34) | | @ringge | --no-auto-detect for text-tool auto-preserve (#40) | | @rustanacexd | Cursor BYOK routing for Claude, and --effort=max (#190) | | @daimonbot | Official multi-arch Docker image on GHCR (#199) | | @Saik0s | Wildcard CORS allow-headers, Opus 4.7 catalog entry (#222) | | @lwsh123k | cch anchored to the billing tag instead of first match (#528) | | @boredland | Time-to-reset in dario doctor --usage (#550) | | @pnewell | --preserve-output-format for structured-output SDKs (#583) | | @matteo-rama | Headless admin bootstrap (#599), Analytics NaN and per-account rate-limit rows (#600), pool-aware /status and /health (#636), version on both (#640), Accounts TUI reads the live pool (#641) | | @miklisanton | Mid-session /model switch 400 (#744), empty-turn guards behind the subagent 400s (#1033, #1117), named keys, per-key token counts and per-key daily budgets (#1318) | | @p-i- | Independent wire-fidelity audit with a re-runnable harness; version-blind bun-match, and the correction to the packet-identical claim (#813) | | @jerzydziewierz | TUI Config tab clipping and scrolling (#861) | | @ramarro123 | Admin bulk re-auth (#913), shared state across instances (#993), prompt-cache behaviour under litellm (#1018), parked-seat and shared-window reporting (#1244), the configurable headroom floor (#1333), Prometheus /metrics and the timing split (#1341) | | @zytegalaxy | The ChatGPT/Codex engine and dario add altman (#1009) | | @chaogebaba | Auto-release must never fire from a fork (#1029) | | @robincle | Utilisation freshness: lastObservedAt / utilAgeMs on /accounts (#1032), the documented way out of a parked pool (#1282) | | @anupamme | Refresh-lock ownership by server-issued lock id (#1059) | | @LiveNathan | Never send or stamp empty text blocks (#1067), empty final user turn from CC's stream-interruption retry (#1092, as @NathanLively) |

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.

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 · ownyourstack.sprayberrylabs.com

[^plans]: Pro at $20 a month, Max 5x at $100, Max 20x at $200, as listed on claude.com/pricing on 2026-09-06. Annual billing is cheaper; check the page for what's current.