You find the limit by hitting it.
Claude Code here, Codex there, an OpenRouter tab, two org billing pages. Every provider meters something different — sessions, tokens, credits, invoices — and none of them can see the others. The first unified signal you get is the limit itself.
Two halves. Keys in only one of them.
The collector — TypeScript / Hono, running on a machine you control — is the only component that holds a credential or talks to a provider. The web UI is a dumb display of GET /api/snapshot. No provider key ever reaches the browser.
Every card says how much to trust it.
Aggregating ten meters only works if you know which numbers are solid. So every card carries a confidence chip and a freshness badge — no silent guesses.
A documented provider API. The number comes from the vendor's own usage or billing endpoint, requested with your key, on your machine.
A best-effort local reader. It parses state a vendor's CLI already stores on your machine. It can break after a vendor update — and the board will say so rather than guess. Using it is your call under that vendor's terms.
Your keys stay home.
Secrets live in a local .env or an age-encrypted vault, read by the collector. The snapshot the browser gets has no secrets in it.
Run it on your Mac behind Tailscale, so the network itself is the auth. Add password auth if you expose it beyond the tailnet.
Self-hosted and single-user. Nothing to sign up for, no hosted backend, nothing phones home.
MIT-licensed TypeScript. Read the adapter before you trust the number it prints.
Ten meters, all optional.
Official adapters are opt-in — each registers only when its key is present. Unofficial readers self-discover the token the vendor's CLI already stored, and fail soft when it's absent. The board shows only what you use.
Running in three commands.
$ git clone https://github.com/alexneri/ai-unified-usage-meter-dashboard && cd ai-unified-usage-meter-dashboard $ npm install $ AUTH_MODE=open npm start
Add the keys you have to .env — every provider is optional. Or hand DEPLOY_PROMPT.md to Cursor or Claude Code and let it drive.
One board. Your machine. Zero keys in the browser.
Built as a personal utility, shared because the ten-tab problem is universal. If it saves you one surprise 429, it earned the star.