A small, self-hosted dashboard for your AI coding usage limits, viewable on your phone or laptop over Tailscale. Zero dependencies, plain Node and vanilla HTML/CSS/JS.
It tracks Claude Code (Max) and Codex (ChatGPT Plus) side by side: each tool's 5-hour and weekly limit windows with reset countdowns and a burn-rate projection, plus activity stats from your local logs (tokens, cache hit rate, estimated value, token mix, cache savings). When one tool maxes out, a headroom cue points you to the one with room left. A Trends section below the gauges charts usage over time — limit burn, tokens per day, cache hit rate, and value — with a 24h / 7d / 30d switch.
Claude Code's limit meters live inside the tool and are easy to lose track of. This puts the real, authoritative numbers one glance away, from any device on your tailnet, so you can pace your work and stop getting throttled mid-task.
- Node 24+ (uses the built-in
node:sqlite). No packages to install.
npm start
Then open it:
- On this machine: http://localhost:8787
- From your phone or laptop on the tailnet:
http://<this-machine's-tailscale-name>:8787
To keep it running across reboots, install it as a systemd user service (a sample unit is described below), or use your preferred process manager.
The limit gauges read from Claude Code's statusline. Point Claude Code at the
included script by adding this to ~/.claude/settings.json:
{
"statusLine": {
"type": "command",
"command": "node /absolute/path/to/llmdash/scripts/statusline.js"
}
}The next time Claude Code renders its status line, the gauges populate. Until then, the activity stats already work (they come from your logs) and the gauges show "waiting…". The script still prints a normal status line (model, folder, and 5-hour remaining), so you keep a useful status line.
Codex limits come from the Codex app-server, so the dashboard just needs to be
able to run codex. If you start it from your normal shell, that's automatic. If
you run it as a service, set LLMDASH_CODEX_CMD to the absolute path of your
codex binary (find it with which codex), since the service's PATH is minimal.
Codex activity stats read from ~/.codex/sessions and fill in as you use Codex.
- Claude limits come from Claude Code's statusline output (the sanctioned
path — no credentials reused). The script writes
rate_limitstodata/claude-ratelimits.json; the server reads it and logs snapshots to SQLite. - Codex limits come from
codex app-server(account/rateLimits/read), polled on an interval (not per request) and snapshotted to the same table withsource = "codex"; a rollout-file cache is used as a fallback. - Activity is computed on demand from each tool's local logs
(
~/.claude/projects/**/*.jsonl,~/.codex/sessions/**/rollout-*.jsonl). - Limits are account-wide; activity is from this machine's logs only. The UI says which is which.
Create ~/.config/systemd/user/llmdash.service pointing ExecStart at your Node
binary and this directory, then:
systemctl --user daemon-reload
systemctl --user enable --now llmdash.service
loginctl enable-linger "$USER" # so it runs without an active login
One-line install (checks Node, clones to ~/llmdash, sets up the launchd
service, wires the statusline):
curl -fsSL https://raw.githubusercontent.com/dtgibson/llmdash/main/scripts/install-macos.sh | bash
It's safe to re-run (it updates and reloads). Prefer to read the script first?
It's at scripts/install-macos.sh. Manual steps below if you'd rather.
The app itself is cross-platform (Node + a vanilla web UI); only the background-service setup differs from Linux. On a Mac:
- Node 24+ is required (for the built-in SQLite):
node -v. - Clone the repo (e.g.
~/llmdash) and run it once withnpm start, then open http://localhost:8787 orhttp://<your-mac's-tailscale-name>:8787. - Point Claude Code's statusline at your path in
~/.claude/settings.json:"command": "node /Users/you/llmdash/scripts/statusline.js". - To run it in the background (the launchd equivalent of the systemd service),
use the template at
macos/com.llmdash.dashboard.plist.example— fill in yournode, project, andcodexpaths, copy it to~/Library/LaunchAgents/, andlaunchctl load -wit. Full steps are in that file's comments.
Codex limits work the same way as on Linux (via the codex app-server).
All optional, via environment variables:
LLMDASH_PORT(default8787)LLMDASH_HOST(default0.0.0.0— binds all local interfaces, so it's reachable on your LAN and tailnet, but not the public internet behind NAT. To restrict strictly to the tailnet, set this to your Tailscale IP, e.g.LLMDASH_HOST=100.x.y.z.)LLMDASH_POLL_MS(default60000)LLMDASH_CODEX_CMD(defaultcodex) — path to the codex binary for the limits readLLMDASH_CODEX_DIR(default~/.codex) — where Codex's session logs live
The pricing table behind "estimated value" lives in config.js — edit it freely.
Snapshots and the captured reading are stored under ./data/ (gitignored).
npm test
Personal project. Next up: Codex (ChatGPT Plus) support, then usage-over-time
charts. See ROADMAP.md.