Free · open source · native macOS menu bar app
TokenWatch tracks usage limits, spend, and prompt-cache state for Claude, Codex, Cursor, Copilot, Gemini, OpenRouter, and seven more, all from your menu bar. It reads the sign-ins you already have. No account to create, and nothing leaves your Mac unless you join the optional leaderboard.
This replica works. Switch tabs, click a % used or reset label, or hover the donut.
Dashboard · Limits tab
Every enabled provider's limits in one scrolling list. Bar color is based on your pace, so 64% used can be fine or a problem depending on how much of the window is left.
Blue means you'll finish the window with room to spare. Orange means you'll land close to the limit. Red means you're on course to run out before it resets, and the note tells you when.
A tick shows how far through the window you are. If the fill is past the tick, you're using it faster than the window allows.
Click a headline to switch every metric between % used and % left. Click a reset label to switch between a countdown and the exact reset time.
A second Claude or Codex profile on this Mac shows up as its own card with its own limits. You don't need to switch accounts to check it.
Drag a provider's header to reorder. Right-click to star, hide, refresh, or copy a PNG screenshot of the card to the clipboard. Data from more than two refreshes ago is marked Outdated.
Same window, three paces
Ahead. The fill is well behind the "now" tick. Keep going.
Cutting it close. At this rate you'll end the window with very little left.
Will run out. You'll hit the limit about 38 minutes from now, long before it resets.
Dashboard · Usage tab
The Usage tab adds up spend from your local session logs. You don't need an admin API key and nothing is uploaded unless you join the leaderboard.
A donut in each provider's brand color, covering everything on this Mac: Claude Code, Codex, OpenCode, the Copilot, Grok, Antigravity and Devin CLIs, fx, Muse Code, every provider you call through omp or pi, and your Cursor account. Show it as Cost, Cost per MTok, or Tokens for Today, Yesterday, or 30 Days. Hover the center for the exact figure, or hover a provider to see what each model cost.
Each provider card shows today's and yesterday's spend. Expand it to see each model's cost and share.
One row for each Claude Code or Codex session you used in the last 5 hours. Each row shows the project, a flame or snowflake, and the cache hit rate.
Daily cost or tokens for the last week, priced at API list rates. The rates refresh against a public price list and also work offline.
Claude keeps your conversation cached after each message, for either 1 hour or 5 minutes depending on the session. TokenWatch reads which one each session uses from its log. Send your next message in that time and the context is read from cache at a fraction of the price.
Once that time passes, the cache expires and your next message pays full price to re-read the whole context. TokenWatch shows how many tokens that will be before you send.
Codex gets the same warm/cold indicator from its local logs. It shows whether the last turn hit the cache but no expiry time, because OpenAI keeps cache timing on its servers and doesn't expose it.
Customize & settings
Dashboard, Leaderboard, Customize, and Settings are screens in the same popover. It resizes to fit what's on screen, and you can do everything from the keyboard.
Turn providers on or off and drag to reorder them. For each provider, drag metrics between Always Visible and On Demand, or star up to two for the menu bar. ⌘Z undoes any change.
Three native notifications, each off by default:
Each alert fires once when a limit crosses into that state, not on every refresh.
Keeps the popover out of screen recordings and screen shares, so your spend doesn't show up in a demo or on a call.
Record any key combination to open TokenWatch from any app. It doesn't need Input Monitoring permission.
Refreshes every 5 minutes by default, and you can set it anywhere from 1 to 30 minutes. The footer counts down to the next refresh; click it or press ⌘R to refresh now. You can also turn on Launch at Login.
Keyboard shortcuts
| ↩ | Open Customize from the dashboard. In a provider's details, go back to the list. |
| esc | Go back one screen. Closes the popover if you're already on the dashboard. |
| ⌘, | Open or close Settings. |
| ⌘R | Refresh now. |
| ⌘Z | Undo the last customization: hide/show, reorder, star, or moving a metric. |
Providers
TokenWatch uses the sign-ins your tools already have on this Mac and queries each provider's own usage API directly.
TokenWatch uses the sign-in these tools already saved on your Mac.
Paste a key in Settings. It's stored in the macOS Keychain and only sent to that provider.
Get started
No account and no sign-up. Open it, and it finds the AI tools you're already signed in to on this Mac.
Install with Homebrew, or download the signed and notarized DMG and drag it into Applications.
brew install --cask MetaPouch/tokenwatch/tokenwatchTokenWatch runs only in the menu bar, with no Dock icon. The first time, it opens on its own and lists every AI tool it found on your Mac.
Everything it found is already selected. Click Track and your limits load right away. Use an API key instead? Add it in Settings (⌘,).
Press ↩ to open Customize. Reorder providers, hide metrics you don't need, and star the ones you want in the menu bar. Turn on alerts in Settings.
TokenWatch doesn't check for updates in the background. With Homebrew, run the upgrade command. If you installed the DMG, download the latest release and drag it over the old copy.
Leaderboard · optional
tokenwat.ch ranks daily tokens and API-equivalent spend across TokenWatch users. It's off until you join from the Leaderboard screen, and TokenWatch makes no request to it before then. Pause or leave any time.
Click Join Leaderboard at the top right of the dashboard (or ⋯ → Leaderboard), then Join with GitHub. This Mac gets its own token, kept in the macOS Keychain. Your GitHub token never reaches the app. Once you're in, the button shows your GitHub avatar and username.
Per day, provider and model: token counts and the estimated cost the Usage tab shows. Never prompts, code, project names, file paths, or keys. Preview Upload shows the exact JSON.
Everything shared appears on your profile at tokenwat.ch/@you and on the boards. You can hide individual stats on tokenwat.ch/account.
Pause Syncing stops all uploads. Sign Out revokes this Mac, and tokenwat.ch/account deletes your account and everything uploaded.
Privacy
No telemetry, no analytics SDK, and no account needed. Out of the box it makes two kinds of network requests, and nothing else. Two more, to tokenwat.ch and for your GitHub avatar, start only if you join the leaderboard.
API keys you paste are stored in the macOS Keychain, not in a config file.
Alerts are delivered by macOS on your Mac. Nothing about them is sent anywhere.
The code is written from scratch in Swift and MIT licensed. You can read it, check every network call, and build it yourself. SECURITY.md lists everything it reads and why.
Every network request TokenWatch makes
FAQ
Yes. It's MIT licensed with no paid tier, no account, and no ads. The full source is on GitHub.
They're estimates. TokenWatch prices your local session tokens at each model's API list rate. If you're on a subscription like Claude Max, you aren't billed per token, so treat the numbers as "what this would cost on the API." It's still a good way to see which models and projects use the most.
The popover is built on Liquid Glass, which requires the macOS 26 SDK.
Yes. If you have a second profile on this Mac (a separate CLAUDE_CONFIG_DIR or CODEX_HOME), or the Cursor CLI is signed in as a different person than Cursor.app, it shows up on the Limits tab as its own card. Spend history counts every Claude and Codex account's local logs; Cursor's history covers only the account Cursor.app is signed in as. TokenWatch only reads these accounts. It never changes which account your CLI uses.
Yes, via Sparkle: it checks a static appcast.xml on this site once a day by default, or immediately from ⋮ → Check for Updates…. Downloading and installing always needs your click first — nothing installs silently — and you can turn off the daily check in Settings. Homebrew installs also auto-update (auto_updates true); run brew upgrade --cask tokenwatch any time regardless.
It reads your local session log files, but only uses token counts, timestamps, model names, and project folder names from them. Prompts, code, project names, and file paths are never sent anywhere. If you join the leaderboard, it uploads daily token counts and estimated cost per provider and model, and nothing else.
If you joined the leaderboard, click Sign Out on the Leaderboard screen first so this Mac is revoked and its token removed from the Keychain. Then run brew uninstall --zap --cask tokenwatch. This also removes its settings, caches, and preferences. For a DMG install, drag the app to the Trash and delete ~/Library/Application Support/TokenWatch.
Yes. Each provider is one self-contained Swift file plus a test fixture. CONTRIBUTING.md explains how to add one, or you can open an issue to request it.
Install TokenWatch and see your limits, spend, and cache status for every provider in your menu bar.