Monitor your Claude AI usage from the macOS menu bar.
Real-time quotas, cost analytics, burn rate prediction, project breakdown.
Free, open source, zero dependencies.
Download .dmg Β Β·Β Website Β Β·Β Changelog
| Feature | Description | |
|---|---|---|
| Quotas | Progress bars | Animated bars for session (5h), weekly, Sonnet & Opus quotas |
| Dynamic icon | Menu bar icon and text turn green/orange/red based on worst quota (toggle in Settings) | |
| Live countdown | Real-time timer showing when quotas reset | |
| Burn rate | Predicts when you'll hit the limit based on current velocity | |
| Model advisor | Smart tips when quota imbalance is detected | |
| Analytics | Cost tracking | Daily, weekly, monthly cost breakdown from JSONL session files |
| Project breakdown | Per-project cost and session count | |
| Session history | Recent conversations with topic, duration, cost, model | |
| Sparkline chart | Interactive usage trend (7/14/30 days) with hover tooltips | |
| Model breakdown | Per-model cost and token usage with totals | |
| Daily budget | Set a $/day target with progress tracking | |
| Export CSV | Save daily cost & token data as CSV | |
| Copy stats | One-click copy of formatted stats to clipboard | |
| Live | Active session | Detects when Claude Code is running (green dot) |
| Auto-credentials | File watcher auto-detects claude login |
|
| Reset notification | Get notified when quotas reset | |
| Settings | Auto-refresh | Configurable interval (1, 2, 5, 10 min) |
| Menu bar modes | Icon only, Session %, Timer, All quotas | |
| Compact mode | Minimal UI showing just percentages | |
| Notifications | Alert when usage exceeds configurable threshold | |
| Launch at login | Start automatically with macOS | |
| Extensions | Plugin marketplace | Browse, search, and install Claude Code plugins directly from the app |
| Category filter | Filter plugins by category (Development, Productivity, Database, etc.) | |
| Install counts | See plugin popularity with download stats | |
| Manage plugins | Toggle enabled/disabled, uninstall, check for updates | |
| Plugin UI | Installed plugins with custom UI (e.g. claude-mem) open inline detail views | |
| Design | shadcn/ui style | Flat, minimal, bordered cards with hover effects |
| Dark & Light | Adapts to system appearance automatically | |
| Accessibility | VoiceOver labels on all interactive elements |
No API key needed. Uses your existing
claude logincredentials. Works with Pro & Max plans. Completely free.
brew tap lcharvol/tap
brew install --cask claude-god# 1. Download & install
open https://github.com/Lcharvol/Claude-God/releases/latest/download/ClaudeGod.dmg
# 2. Allow unsigned app (required once)
xattr -cr /Applications/Claude\ God.app# Make sure you're logged in
claude login
# Launch β a "C" icon appears in the menu bar, press β₯βC to toggle
open /Applications/Claude\ God.appQuotas β The app reads your OAuth credentials from claude login (Keychain or ~/.claude/.credentials.json) and calls:
GET https://api.anthropic.com/api/oauth/usage
Authorization: Bearer <oauth_token>
anthropic-beta: oauth-2025-04-20
Returns utilization for each quota window (five_hour, seven_day, seven_day_sonnet, seven_day_opus). Tokens are refreshed automatically.
Cost Analytics β Parses all ~/.claude/projects/**/*.jsonl session files to calculate costs per model using Anthropic's published pricing.
git clone https://github.com/Lcharvol/Claude-God.git
cd Claude-God
brew install xcodegen # one time
make build # or: make open (Xcode)See Makefile for all commands: build, run, dmg, clean.
Sources/
βββ ClaudeUsageApp.swift # Entry point, MenuBarExtra
βββ UsageManager.swift # OAuth, auto-refresh, notifications, budget, active session
βββ AuthManager.swift # Credential loading, token refresh, file watcher
βββ UpdateChecker.swift # GitHub releases auto-update
βββ HotkeyManager.swift # Global β₯βC hotkey (Carbon API)
βββ AppShortcuts.swift # Shortcuts.app intents (Get Usage, Get Cost, Refresh)
βββ MenuBarView.swift # UI: cards, stats, settings, heatmap, shadcn components
βββ SessionAnalyzer.swift # JSONL parser, cost calculator, efficiency metrics
βββ Assets.xcassets/ # App icon
Widget/
βββ ClaudeGodWidget.swift # WidgetKit β desktop quota gauges
Zero external dependencies. Foundation + SwiftUI + Combine + Security + UserNotifications + ServiceManagement.
git tag v2.8.0 && git push origin v2.8.0
# GitHub Actions builds the .dmg automatically- Fixed: The Accounts section toggled a green dot and nothing else β every row resolved the same credentials, because
switchAccount()always fell back to the default Keychain entry (or a prefix scan that picked whichever token was freshest), "Add" registered one hardcoded path for every row, and analytics were pinned to~/.claude/projects. A newActiveAccountcontext derives the credentials file, Keychain service andprojects/dir from the selected account'sCLAUDE_CONFIG_DIR, and "Add" now asks for that directory (#47, thanks @ValeriiMedvezhonkov) - Fixed: A switch that found no credentials kept the previous account signed in, so the new row showed the old account's quota. The switch now clears the token and the remembered Keychain coordinates first β a refresh could otherwise write one account's token into another's item β and says so when nothing resolves
- Fixed: Timeline and costs lagged a switch by up to two minutes, sitting behind the 120-second staleness window that only lifts on popover open. Both scans are forced on switch and tagged with the account they read
- Fixed: Choosing
~/.claudein the picker created a row that could never authenticate β it was hashed into a suffixed Keychain service while the default login lives in the un-suffixed one. It now resolves to the default account - Fixed: Removing an account above the active one shifted the selection onto a different account without reloading it
- Fixed: The app got permanently stuck once you stopped running
claudein a terminal β v2.25.1 made it a pure credential reader, counting on the CLI to keep refreshing the shared Keychain entry, which the Claude desktop app never touches. The token expired, nothing revived it, and the popover showed "Rate limited" over a401 token has expired.recoverSession()now reloads disk/Keychain first and only spends the shared refresh token once the access token has been dead 12h β long enough that no running CLI can still hold it, so #40 stays fixed (#46) - Fixed: An expired session was reported as "Rate limited β retrying in 30s", sending users to wait out a limit they never hit. A 429 on a known-expired token now triggers recovery, then says "Session expired" with the Sign In button
- Fixed: Refreshed tokens are written back with
SecItemUpdateon the exact entry they were read from. The oldsecurity add-generic-password -U -a ""write could not target Claude Code's account-less item and created a shadow entry beside it
- Fixed: Menu bar never turned green β
menuBarIconColorreturned.primaryunder 50% usage, so only orange (β₯ 50%) and red (β₯ 80%) were ever tinted and the green state the README advertised didn't exist. The menu bar text was also never colored in any mode, so even at 85% a red icon sat next to a plain white85% Β· 2h31m. Icon and text now share one tint driven by the worst quota (#44, thanks @egorovartem-alt) - Added: "Color by usage level" toggle in Settings β Menu bar (default on) β the removed
.primaryfallback was a deliberate contrast choice for light menu bars, so monochrome stays available
- Fixed: Usage tab was blank for enterprise accounts with a dollar budget but no token quotas β the tab gated rendering solely on
!quotas.isEmpty, so these accounts hit the "Click Refresh" empty state instead of their Extra Usage card. The menu bar, rings and alerts already handled this viaallNotifiableQuotas; the tab was the last surface still keyed on rawquotas(#42, thanks @ecoffey) - Fixed: Compact mode never rendered extra usage at all, so the same accounts would have seen an almost-empty panel. It now shows an Extra Usage line β percentage bar when a monthly limit exists, On/Off badge otherwise
- Fixed: Daily forced
claude /loginβ Claude God's background token-health timer + arefreshInternalfallback were consuming Claude Code's single-use OAuth refresh token, invalidating the CLI's in-memory copy every ~24h. Removed both paths and deletedselfRefreshToken/persistRefreshedCredentialsfromAuthManagerso no future path can regress this. Claude God now only reads credentials; when its token expires it reloads from disk/Keychain (picking up any refresh Claude Code did itself) and otherwise surfaces "Session expired β runclaude auth login" (#40, thanks @RobinMobers97)
- Added: JSON usage export β opt-in toggle writes a full snapshot to
~/.claude-god/usage.jsonafter every refresh, so tmux/i3blocks/dashboards can read live Claude usage without hitting the OAuth API themselves - Added: Claude Code statusline integration β one-click install a helper script that prints
session Β· weekly Β· todaycolored inside every Claude Code prompt via thestatusLinesetting - Added: Notarized release pipeline β the CI transparently upgrades from ad-hoc to Developer ID signing + Apple notarization + stapling as soon as the six Apple secrets are configured on the repo; users then no longer need to run
xattr -crafter install (setup guide)
- Fixed: Transparent phantom window when changing text size β
WindowTopAnchoronly resized theNSPanel's height, so SwiftUI's content resize on textScale change left an empty backing halo (or overflowed the window). Anchor now resizes width too and keeps the top-right corner fixed so the popover stays anchored under its status item
- Fixed: "Sign In" button in Settings appeared to do nothing on a fresh install β clicking it flashed "Signing in..." briefly then silently reverted. The error message ("Claude CLI not found β install with
npm i -g @anthropic-ai/claude-code") was set correctly but was only rendered in the Usage-tab error banner, which fresh-install users never see (they're routed straight to Settings by the!isAuthenticatedgate). The Authentication card now displays the error under the Sign In button
- Fixed: Intel Mac support restored β the release DMG is now a universal binary (arm64 + x86_64). The GitHub Actions Apple Silicon runner was producing arm64-only builds that Intel users couldn't launch; added
ARCHS="arm64 x86_64"+ONLY_ACTIVE_ARCH=NOto the workflow, no source changes needed (#34, thanks @kelvincht)
- Added: Adjustable popover text size (S / M / L / XL) β new preset picker in Settings resizes every font in the popover via a
textScaleenvironment value +.shFont(...)view modifier (no.scaleEffectblur). Popover width scales with the multiplier so bigger type doesn't wrap. Menu bar untouched; defaultM(1.0) leaves existing users unchanged (#33, #39, thanks @nairdaleo) - Added: Model-scoped weekly quotas surfaced in the usage list β
weekly_scopedentries from the OAuthlimitsarray (currently the Fable weekly quota on Max+) now render as"Weekly (<name>)"alongside the existing "Weekly (all)" row, and downstream code (notifications, alert rules, rings, widget) picks them up generically (#36, thanks @pieropalevsky) - Fixed: Permanent "Session expired" that no sign-in could clear β two combined bugs: credential loaders returned
~/.claude/.credentials.jsonwithout checking expiry (pinning the app to a dead token while a valid one sat in the Keychain), and the embeddedclaude auth loginPTY had no stdin write path so the "paste your authorization code" prompt was unanswerable. Both entry points now delegate to a singleresolveCredentialsthat picks whichever source has the latestexpiresAt, andTerminalSession.send(_:)adds a line-buffered write to the PTY master with a monospaced input row in the sign-in view (#37, #38)
- Fixed: Repeated "Claude God wants to use your confidential information stored in
Claude Code-credentials-XXXXXXXX" prompt β newer Claude Code versions write credentials under suffixed service names, and the per-entry data fetch inloadBestKeychainEntryWithPrefixusedSecItemCopyMatching + kSecReturnData, which prompts on every read. The fetch now reuses the existingsecurity find-generic-passwordhelper with the exact service name discovered from the non-prompting list query, so the dialog loop disappears (#30, #31, thanks @nairdaleo)
- Fixed: No more "Claude God wants to access the keychain" prompt for the common case β v2.23.2's fallback hit the Security framework API directly (which prompts the first time an ad-hoc-signed app reads an item it didn't create). Now tries
security find-generic-password -a $USERas a second non-prompting fast path before the API; the scan only runs for unusual multi-account layouts
- Fixed: PR #27 Keychain fallback actually works now β the scan called
SecItemCopyMatchingwith an attribute combination (kSecReturnAttributes + kSecReturnData + kSecMatchLimitAll) that returnserrSecParam (-50)on the legacy login keychain, so it bailed out before reading anything. Now lists refs+attributes first, then fetches each item's data with a per-item query, so users with multipleClaude Code-credentialsentries (Claude Code storesaccount=unknownnext toaccount=<user>) finally connect
- Fixed: Embedded
claude auth loginno longer crashes the app β PTY slave FD was being closed twice (after the first close, the OS reused that FD slot for a guarded keychain socket, then the handle's dealloc triggeredEXC_GUARD); slave handle now usescloseOnDealloc: false(#26, #27, thanks @nairdaleo) - Fixed: Credentials detected when only per-project Keychain entries exist β newer Claude Code writes suffixed entries (
Claude Code-credentials/path/...) and may leave the base entry stale, so signed-in users appeared "Not connected";AuthManagernow scans allClaude Code-credentials*items as a fallback - Fixed: Popover only grows downward when resizing β new
WindowTopAnchorpins the top edge to the status bar item in Release/Homebrew builds (was resizing from the center)
- New: Extra Usage (dollar budget) is now a first-class quota across the app β surfaced as a % in every menu bar mode (including
E X%in "All" mode), selectable as a ring in Icon+ Rings, drives icon warning/critical colors, and fires standard + custom usage alerts. The popover's Extra Usage card gains a color-coded progress bar when a monthly limit is set (#25, thanks @ecoffey)
- Changed: Peak hours window updated to MonβFri 5amβ11am PT to match Anthropic's actual throttling band for 5-hour session limits (was 7amβ5pm PT) (#24, thanks @pieropalevsky)
- Refactored: Tooltips derive from a single
peakHoursDescriptionsource-of-truth so future policy changes touch one constant instead of three sites
- Fixed: OAuth token self-refresh β now sends
application/x-www-form-urlencodedper RFC 6749, ending the HTTP 400 loop on silent refresh (#21, #22) - Fixed:
claudebinary resolution β falls back to$SHELL -l -c "which claude"so nvm / fnm / volta / pnpm installs are found - Fixed: Auto-recovery after manual
claude auth loginβ 10s background poller picks up Keychain-only credential writes without needing Sign In
- New: Rings menu bar mode β Apple Watch-style concentric activity rings for up to 3 quotas, configurable picker + live preview, optional Timer ring (#20)
- Fixed: Drastic energy savings β App Nap re-enabled, adaptive countdown, slower active-session polling, JSONL scan deferred to popover open (#14)
- Fixed: Widget extension now registers β added missing
NSExtensionPointIdentifier(#13) - Fixed: Resizable popover actually responds to drag β visible grip handle replaces the broken NSWindow wiring
- New: Session+Week menu bar mode β session %, reset countdown, and weekly % at a glance (#15)
- New: Resizable window with persisted height
- New: Extra usage balance card + Claude Design quota row
- New: Sign In button + opt-in auto-reconnect when OAuth token expires
- Fixed: Usage tab flicker on expired token, long reset times shown as days/hours
- Fixed: Hardened refresh pipeline β every exit path clears loading state, credential reload timeouts, backoff counter auto-resets
- Fixed: Respect
Retry-Afterheader on 429, progressive backoff, token expiry pre-flight, Keychain fallback for credentials
- Fixed: App no longer gets stuck on "Rate limited" screen after
claude login(#5) - Fixed: Credential changes now trigger auto-refresh even when an error is displayed
- Fixed: Refresh no longer gets stuck β cancellable fetches, stale response detection, centralized state reset
- New: Peak / off-peak indicator with countdown to transition
- Perf: JSONL parsing without DataβString roundtrip, SQLite 9β4 queries, widget skip unchanged, keychain off main thread
- New: GitHub, swift-lsp, code-review, code-simplifier, context7, playwright plugin detail views (9 total)
- Fixed: Menu bar icon contrast, font sizes +1pt, wider window
- New: Superpowers plugin UI β browse skills, view plans with progress, design specs
- New: Frontend Design plugin UI β design principles, aesthetic tones, anti-patterns, cookbook link
- New: Extensions tab with plugin marketplace β browse, install, and manage Claude Code plugins directly from the app
- New: Featured plugin cards for plugins with custom UI (claude-mem opens inline Memory panel)
- Fixed: Memory tab now reads correct claude-mem schema (
observationstable) - New: Activity timeline, project summaries, Markdown export, delete observations, open files in Finder
- New: Memory tab β browse claude-mem persistent memories with search, project filter, and install guide
- Fix: OAuth token refresh no longer persists tokens β prevents daily 401 errors
- Perf: Single JSON decode per JSONL line, direct Data line splitting, single-pass file traversal, binary search for ROI matching
- Improved: Logging, error handling, forecasting, and exports
- New: ROI tab β correlates git commits with Claude sessions (cost/commit, per-project, per-model, 30-day trend)
- New: Updated model pricing, landing page SEO, download counter
- Fix: Project cost truncation, mobile layout, 429 handling
- Fix: Token refresh race condition, notification spam, reset timer, CSV export, duplicate alert rules
- New: Desktop widget, usage heatmap, live session cost, per-project budgets, Shortcuts.app, multi-account, custom alerts





