by askalf
A local OpenAI- and Anthropic-compatible proxy that brings your Claude Pro/Max subscription to Cursor, Cline, Aider, and the Agent SDK. Session-affinity routing, multi-account pooling, and live drift detection keep long agent runs stable across tools.
# Add to your Claude Code skills
git clone https://github.com/askalf/darioLast scanned: 6/14/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-06-14T08:16:31.447Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}dario is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by askalf. A local OpenAI- and Anthropic-compatible proxy that brings your Claude Pro/Max subscription to Cursor, Cline, Aider, and the Agent SDK. Session-affinity routing, multi-account pooling, and live drift detection keep long agent runs stable across tools. It has 320 GitHub stars.
Yes. dario passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/askalf/dario" and add it to your Claude Code skills directory (see the Installation section above).
dario is primarily written in JavaScript. It is open-source under askalf on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh dario against similar tools.
No comments yet. Be the first to share your thoughts!
darionpm i -g @askalf/dario · 0 runtime deps · SLSA-attested every release · nothing phones home · ~22k lines you can read in a weekend · independent, unofficial, third-party (DISCLAIMER.md)
🎉 dario
v5.0— one request path, one credential modelv5 is a breaking simplification: two removals, zero feature pile-on.
- 🏊 Pool-as-primitive. Every dario is now a pool. A plain
dario loginis a pool of one; add a second Claude seat and the samelocalhost:3456load-balances across them by live headroom — no mode switch, no config flag.- 🧹 Shim mode removed. The deprecated shim transport is gone. Proxy mode rebuilds every request to Claude Code's wire shape and is strictly better for every client.
Upgrading from v4? Solo
dario login+dario proxyusers: nothing to do. Full notes → MIGRATION.md · CHANGELOG
You're already paying $20, $100, or $200 a month for Claude. Then Cursor wants an API key. Aider wants an API key. Cline, Continue, Zed, your scripts — every one of them bills you again, per token, while the subscription you already bought sits idle in Claude Code.
dario is one local endpoint that routes all of them through the Claude subscription 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.
# 1. Install
npm install -g @askalf/dario
# 2. Log in to your Claude subscription (Pro, Max 5x, or Max 20x)
dario login # or `dario login --manual` for SSH / headless
# 3. Start the local proxy
dario proxy # separate terminal or background
# 4. Point any Anthropic-compat tool at it
export ANTHROPIC_BASE_URL=http://localhost:3456
export ANTHROPIC_API_KEY=dario
That's the whole setup. Every tool that honors those env vars now runs on your subscription.
Works with: Claude Code, Cursor, Aider, Cline, Roo Code, Continue.dev, Zed, Windsurf, OpenHands, OpenClaw, Hermes, Codex CLI, the Claude Agent SDK, your own scripts.
Add other providers and reuse the same proxy:
dario backend add openai --key=sk-proj-...
dario backend add groq --key=gsk_... --base-url=https://api.groq.com/openai/v1
dario backend add openrouter --key=sk-or-... --base-url=https://openrouter.ai/api/v1
dario backend add local --key=anything --base-url=http://127.0.0.1:11434/v1
export OPENAI_BASE_URL=http://localhost:3456/v1
export OPENAI_API_KEY=dario
Force a specific backend with a model prefix: openai:gpt-4o, claude:opus, groq:llama-3.3-70b, local:qwen-coder. Prefer Docker? ghcr.io/askalf/dario:latest — multi-arch (amd64+arm64), published every release (guide). Something off? dario doctor prints one paste-ready health report.
Type dario with no args (in another terminal) for a full-screen control panel — live request stream, per-model burn-rate, rate-limit utilization, billing-bucket breakdown, and an in-place config editor that writes to ~/.dario/config.json. Subscription accounting you watch happen instead of reading out of log files. Pure ANSI, zero new runtime deps.
┌─ dario ─────────────────────────────[ q quit · Tab next · ? help ]──┐
│ Status Config ▎Analytics▎ Hits Accounts Backends │
├─────────────────────────────────────────────────────────────────────┤
│ ANALYTICS — last 60 min │
│ │
│ Requests: 247 (4.1/min) Tokens in: 142,830 │
│ Tokens out: 38,200 Subscription %: 98% │
│ │
│ Per-model: │
│ opus-4-8 ████████████░░░░░░░░ 60% (148 req) │
│ sonnet-5 █████░░░░░░░░░░░░░░░ 26% ( 64 req) │
│ haiku-4-5 ███░░░░░░░░░░░░░░░░░ 14% ( 35 req) │
│ │
│ Rate-limit: │
│ 5h ████░░░░░░░░░░░░░░░░░░░░░░░░ 18% │
│ 7d ██░░░░░░░░░░░░░░░░░░░░░░░░░░ 8% │
└─────────────────────────────────────────────────────────────────────┘
| Setup | Monthly cost — heavy user |
|---|---|
| Cursor + Anthropic API direct | $80–$300 |
| Multi-tool heavy use (Cursor + Aider + Cline + Continue), per-token | $200–$600+ |
| Any of the above + dario | $20–$200 flat — your existing Pro/Max plan, nothing extra |
One subscription, every tool. Switching providers is a model-name change, not a reconfigure — add a backend once and the same localhost:3456 speaks OpenAI, Groq, OpenRouter, or a local Ollama too.
You point every tool at one URL. dario reads each request, decides which 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 backend | OAuth swap + CC template → api.anthropic.com |
| Anthropic Messages | gpt-*, llama-*, … |
OpenAI-compat backend | Anthropic→OpenAI translation, forwarded |
| OpenAI Chat | gpt-* / o1-* / o3-* |
OpenAI-compat backend | Auth swap, body forwarded byte-for-byte |
| OpenAI Chat | claude-* |
Claude backend | OpenAI→Anthropic translation, then 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, autodetected. Opus 4.8, Sonnet 5, and Haiku 4.5 — plus [1m] long-context variants — by full id (claude-opus-4-8) or shortcut (opus / sonnet / haiku, append 1m for the long-context form). GET /v1/models reads Anthropic's live catalog (TTL-cached, baked fallback when offline), so a new model resolves the day it lands with no dario release, and the model-specific request shape is applied automatically. Families pulled upstream are filtered from both the live catalog and the fallback so /v1/models never advertises a model that 404s — reversible via DARIO_SUSPENDED_MODELS if a family is ever pulled again.
In v5 every dario is a pool — a plain dario login is a pool of one, no separate mode to switch on. One Claude subscription has a ceiling; hold more than one seat — a personal Max and a work Max, a couple of Pros, team seats — and the same localhost:3456 routes every request to whichever seat has the most headroom, live, per request. A single dario accounts add even bootstraps a servable proxy with no dario login step:
dario accounts add work
dario accounts add personal
dario proxy
Three things it does that a round-robin doesn't:
5h bucket, a 7d bucket, and a per-model 7d_<family> bucket. dario reads all of them off every response and routes each request by the bucket that governs it: an Opus call to the seat with Opus room, a Sonnet call to the seat with Sonnet room, independently. Plan tiers mix freely — dario cares about headroom, not tier.{account × cache key}, so rotating a long conversation across seats on headroom alone re-pays cache-create every turn — a 5–10× token-cost multiplier on the cached portion. dario pins each conversation to one account (hashed from its first message, deterministic) for the life of the session, and rebinds only when that account is exhausted.