A macOS menu bar app that shows how much quota is left on every coding-agent account you use — and exactly when each one resets.
CL 25% CX ✓ CX ✓ CX 98%
No signup. No login. No account linking. Nothing leaves your machine.
If you work across several Claude and Codex accounts, the question is always the same: which one still has quota, and when does the spent one come back? The answer exists on your disk already — every CLI writes it — it is just not anywhere you can see it.
Trackr reads what is already there and puts it in your menu bar.
One command. It builds from source on your machine, so there is no Gatekeeper warning and nothing to unquarantine.
curl -fsSL https://raw.githubusercontent.com/tawanorg/aicodingtrackr/main/install.sh | bashNeeds macOS 14+ and Apple's command line tools. If swift is missing the script
runs xcode-select --install for you and tells you to re-run it.
Start it automatically at login:
~/.aicodingtrackr/src/install-login-item.shBuild it yourself instead
git clone https://github.com/tawanorg/aicodingtrackr.git
cd aicodingtrackr
./bundle.sh release # -> build/Trackr.app
open build/Trackr.app
./.build/release/trackr # same data as a text table- Name your accounts. Click any account name and type.
unidentified · probecomesside-project. Names persist across logout and login. Submit an empty name to clear it. - Read the strip.
CLis Claude,CXis Codex,CPis Copilot. A number is percent used;✓means that account's window has reset and it is ready. - Trackr shows the numbers and stays out of the way. Which account to use is your call.
| Provider | Source | Network | Fidelity |
|---|---|---|---|
| Claude Code | GET /api/oauth/usage with the OAuth token Claude Code already stores in your login Keychain |
yes | exact, live |
| Codex | rate_limits in ~/.codex/sessions/**/rollout-*.jsonl |
none | exact for the logged-in account |
| GitHub Copilot | gh api /copilot_internal/user — chat, completions and premium interactions against their monthly reset |
yes, via gh |
exact, live |
Copilot uses the gh CLI you have already authenticated rather than asking for a
GitHub token of its own. No gh, or logged out, and the provider is skipped
silently — not everyone uses Copilot.
Codex deliberately makes no network call. It exposes no read-only usage API — rate limits only ride along on real inference responses — so probing one would consume the very quota being measured.
~/.claude.json and ~/.codex/auth.json each hold exactly one logged-in account
and are overwritten when you log into another. So at any instant only the active
account is directly readable. Naively that gives you one real number and a row of
stale guesses.
Two things fix it:
- An append-only snapshot store. Every reading Trackr sees is recorded, so an account's last known state survives you switching away from it.
- Reset times are absolute, not durations. A snapshot whose reset time has already passed proves that window rolled over — the account is back to 0% used. Stale data, exact conclusion.
So "has my other account reset yet?" is answered with certainty even if Trackr has not seen that account in a week. Only an account still mid-window degrades, and it says so:
| Shown | Means |
|---|---|
25% |
exact — read live, or provably reset |
≥25% |
stale mid-window snapshot; real usage can only be higher |
ready ✓ |
window rolled over, full quota available |
Everything stays on your machine. The only network request is to Anthropic's own
usage endpoint, with the token Claude Code already put in your Keychain — the same
call the CLI's /usage command makes. There is no server, no telemetry, and no
account of ours to create.
State lives in ~/Library/Application Support/AICodingTrackr/. Delete it to reset.
Once you name an account, the panel shows the name and plan rather than the email address, so the window is safe to screenshot or screen-share.
- It only learns accounts it has observed. Use each account once while Trackr is running; it cannot retroactively discover one it has never seen. Installing the login item makes this happen passively.
- Codex rollouts written before ~Sept 2026 carry no account id. Trackr falls
back to grouping them by plan and shows
unidentified · pro, since aprorollout cannot have come from aproliteaccount. Log into one of those accounts once and it gets a real identity. Two accounts on the same plan collapse into one entry — a labelled heuristic, not an identity. - Codex cloud tasks (run from the ChatGPT web UI) spend the same quota but write no local rollout, so the local reading can understate usage.
/api/oauth/usageand/copilot_internal/userare unofficial endpoints and can change without notice; the Claude one also rate-limits its callers. Trackr polls every 10 minutes and backs off when throttled, and any failure degrades to the last stored snapshot rather than breaking the display.- Reading the Keychain prompts once. That is a one-off macOS consent dialog, not a login. Both the app and the CLI are ad-hoc signed with stable identifiers so the grant survives rebuilds — an unsigned binary gets a new identity every time it is compiled, and macOS would ask again each time. If a run ever seems to hang, look for a Keychain dialog hiding behind another window.
- macOS only. Windows is feasible — Codex writes identical rollouts under
%USERPROFILE%\.codex\and Claude Code keeps credentials in a file there — but the UI layer needs rewriting. Tracked in issues.
Sources/TrackrCore/
Model.swift accounts, windows, and resolving a reading against the clock
ClaudeProvider.swift Keychain read + usage endpoint + backoff
CodexProvider.swift rollout scan, cached headers, tail-parsed rate limits
SnapshotStore.swift append-only history
CopilotProvider.swift Copilot quota via the gh CLI
Nicknames.swift user-chosen account names
Tracker.swift merge live + cached, order, format
Sources/trackr/ text mirror of the panel
Sources/TrackrBar/ MenuBarExtra UI
Yield an AccountSnapshot — a stable AccountRef plus one QuotaWindow per limit
with an absolute resetsAt — and merge it in Tracker.refresh. The staleness
and ordering logic is provider-agnostic; it only needs reset times to be absolute
rather than durations.
