Releases: patwalls/headroom
Headroom v0.3.4 — Context window %, model name, session cost in the dropdown
What's new
Three new rows in the dropdown — all reading data Claude Code was already writing to the hook file, but Headroom was ignoring until now:
- Context window % — a third bar (calm/amber/red) showing how full your current context is. The question every deep-work session hits: "how full is my context before I lose coherence?" — now glanceable without opening a terminal.
- Active model — shown next to the "Updated" timestamp:
Sonnet 4.6 · Updated 10:39 PM - Session cost —
Session cost: $X.XXin the dropdown, live per session. The first Claude Code menu bar tool to show real-time session spend.
All three hide themselves when Claude Code doesn't report the field (older versions), so the dropdown degrades gracefully.
How to update
brew upgrade --cask patwalls/tap/headroom
Or download from headroom.walls.sh.
Trust reminder
As always: zero network calls, no token, no Keychain, no analytics. The dropdown reads ~/.claude/headroom-usage.json — a local file Claude Code's own status line writes. Verify with nettop if you want.
Full changelog: context window % and model name added in Lap 25; session cost added in Lap 29. The complete build-in-public log is in VISION.md.
v0.3.2 — one display decision
What changed
- One source of truth for the display.
Render.decide(_:)now produces the single display decision — menu bar title, color tone, and the live session/week windows — consumed by both the GUI and the--printverification harness. What verification prints is by construction exactly what renders in your menu bar. - The rolled-over-window rule (a window whose reset has passed shows "—", never a stale number) now applies uniformly everywhere, including
--print.
Download
Grab it from headroom.walls.sh (or brew install --cask patwalls/tap/headroom) — signed & notarized, ~260 KB, zero network calls.
v0.3.1 — zero network calls: reads Claude Code's own status line
Download: headroom.walls.sh/download (signed & notarized, universal) · or brew install --cask patwalls/tap/headroom
The architecture flip
Headroom no longer polls Anthropic's usage API — it reads the official rate-limit numbers Claude Code itself renders in its status line, captured to a local file by a tiny auto-installed hook.
- Zero network calls. No token, no Keychain access, no OAuth, no 429s — the entire old data layer is deleted
- Auto-wires on first launch — no dialogs, no permission, chains any existing status line non-destructively (and "Repair Live Data" in the menu re-wires it any time)
- Honest staleness — a window that has rolled over shows "—", never a wrong number
- Smaller and simpler: ~590 lines, no dependencies, MIT
The data surface is two small files: Hook.swift (writes) and Usage.swift (reads).
v0.2.5 — icon, cold-start resilience, sign-in spike
Download: headroom.walls.sh/download (signed & notarized, universal) · or brew install --cask patwalls/tap/headroom
Since v0.1.0
- Real meters in the dropdown — color-coded bars (green/amber/red) for the 5h session and 7d week, reset countdowns, full-width layout
- Rate-limit resilience — a failed refresh keeps the last good reading (up to 10 min) instead of showing
?%; HTTP 429 obeysRetry-Afterwith a one-shot retry, cold starts show why they're waiting - First-run explainer — Headroom explains the one Keychain permission before macOS asks
- App icon — the meter bars, on every consent dialog and Finder window
- MIT licensed
- Spike (CLI only):
headroom --signin— own OAuth flow storing a token in Headroom's own Keychain item (the future no-dialog path)
The token goes to api.anthropic.com and nowhere else — no analytics, no auto-updater, no phoning home.