TokenWatch

Free · open source · native macOS menu bar app

Know how close you are to every AI limit before it stops you.

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.

brew install --cask MetaPouch/tokenwatch/tokenwatch
macOS 26 Tahoe or later Signed & notarized Zero telemetry MIT licensed
TokenWatch
≡Claudemax
Session (5h)~62% left at reset
22% usedResets in 2h
Weekly~6% spare
64% usedResets in 2d
≡Codexplus
SessionLimit in 38m
81% usedResets in 3h
Weekly~52% left at reset
30% usedResets in 3d
≡Cursorpro
Plan usage~39% left at reset
45% usedResets in 8d
≡OpenRouter
Key limit
$5.03 usedof $10.00
Balance
Remaining12.27 USD
TokenWatch · Next update in 42s··· ⌄

This replica works. Switch tabs, click a % used or reset label, or hover the donut.

13providers supported
0accounts to create
0telemetry or analytics
0third-party dependencies

Dashboard · Limits tab

See whether you'll run out, not just how much you've used.

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.

  • ▸

    Pace-aware colors

    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 "now" marker on every bar

    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.

  • ⇆

    Switch the view with one click

    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.

  • ☷

    All your Claude & Codex accounts

    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.

  • ⇅

    Arrange it your way

    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

Weekly~52% left at reset
30% usedResets in 3d

Ahead. The fill is well behind the "now" tick. Keep going.

Weekly~6% spare
64% usedResets in 2d

Cutting it close. At this rate you'll end the window with very little left.

SessionLimit in 38m
81% usedResets in 3h

Will run out. You'll hit the limit about 38 minutes from now, long before it resets.

Dashboard · Usage tab

See what you spent, and what's about to cost more.

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.

  • ◐

    Total Spend

    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.

  • ≡

    Spend by model

    Each provider card shows today's and yesterday's spend. Expand it to see each model's cost and share.

  • Every active session's cache

    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.

  • ▁

    7-day history

    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.

Total Spend ⌄ⓘ⇧
6.1billion
Claude6.1B tok
Tokens · last 30 days
Claudemax
▶Today $133· Yesterday $254
claude-opus-4-571%$94.51
claude-sonnet-4-528%$37.28
Other1%$1.33
api-gateway100% hit · expires 14:06
web-app87% hit · expires 14:04
mobile-appcold · re-reads ~412.8K tok
design-systemcold · re-reads ~96.4K tok

Warm cache: cheap

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.

api-gateway100% hit · expires 14:06

Cold cache: full 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.

mobile-appcold · re-reads ~412.8K tok

ⓘ Codex

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.

infra-scripts98% hit last turn

Customize & settings

Set it up once and leave it running.

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.

☰

Customize

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.

Alerts before you hit a limit

Three native notifications, each off by default:

  • Almost Out: under 10% left
  • Cutting It Close: on pace to land near the limit
  • Will Run Out: on pace to run out before reset

Each alert fires once when a limit crosses into that state, not on every refresh.

◑

Appearance

  • Theme: System, Light, or Dark
  • Density: Default or Compact
  • Icon style: Text or Bars
  • 12- or 24-hour reset times
  • Reduce Animations and Increase Transparency

Hide from screen share

Keeps the popover out of screen recordings and screen shares, so your spend doesn't show up in a demo or on a call.

⌘

Global shortcut

Record any key combination to open TokenWatch from any app. It doesn't need Input Monitoring permission.

↻

Refresh when you want

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.
escGo back one screen. Closes the popover if you're already on the dashboard.
⌘,Open or close Settings.
⌘RRefresh now.
⌘ZUndo the last customization: hide/show, reorder, star, or moving a metric.

Providers

13 providers, one menu bar.

TokenWatch uses the sign-ins your tools already have on this Mac and queries each provider's own usage API directly.

Already signed in? Just turn it on.

TokenWatch uses the sign-in these tools already saved on your Mac.

ClaudeSession & weekly limits, extra usage, spend, cacheClaude Code sign-in
Codex / ChatGPTSession & weekly limits, cache~/.codex/auth.json
CursorPlan usage, on-demand spendCursor app or CLI sign-in
GitHub CopilotPremium interaction quotaExisting Copilot sign-in
GeminiPro & Flash quota remainingGemini CLI sign-in
AntigravityModel quota remainingAntigravity sign-in
GrokCredit usage~/.grok/auth.json
AmpFree tier usage, credit balanceAmp CLI or API key

Paste an API key

Paste a key in Settings. It's stored in the macOS Keychain and only sent to that provider.

OpenRouterCredit balance, key limitAPI key
OpenAI APISpend today & last 7 daysAPI key
z.aiToken & credit quotaAPI key
KimiSession & weekly quotaAPI key
OpenCode GoRolling & weekly usageAPI key

Get started

Set up in about a minute.

No account and no sign-up. Open it, and it finds the AI tools you're already signed in to on this Mac.

Install

Install with Homebrew, or download the signed and notarized DMG and drag it into Applications.

brew install --cask MetaPouch/tokenwatch/tokenwatch

Launch

TokenWatch 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.

Pick what to track

Everything it found is already selected. Click Track and your limits load right away. Use an API key instead? Add it in Settings (⌘,).

Make it yours

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.

Updating

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.

brew update && brew upgrade --cask tokenwatch

Leaderboard · optional

See how your token burn compares.

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.

Join with GitHub

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.

What's shared

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.

What's public

Everything shared appears on your profile at tokenwat.ch/@you and on the boards. You can hide individual stats on tokenwat.ch/account.

Pause or leave

Pause Syncing stops all uploads. Sign Out revokes this Mac, and tokenwat.ch/account deletes your account and everything uploaded.

Privacy

Your usage data stays on your Mac unless you share it.

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.

  • Keys in the Keychain

    API keys you paste are stored in the macOS Keychain, not in a config file.

  • ☉

    Local notifications

    Alerts are delivered by macOS on your Mac. Nothing about them is sent anywhere.

  • ◇

    Open source

    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

Your credentialper provider
→
That provider's own APIHTTPS, e.g. api.anthropic.com
Price-list request~hourly, optional
→
Public GitHub-hosted price listno credentials, no usage data
Daily token counts & costonly after you join the leaderboard
→
api.tokenwat.chper day, provider and model
Avatar requestonly while joined, at most daily
→
avatars.githubusercontent.comyour GitHub avatar, no credentials
Your prompts, code, keys, or projects
×
Anyone else

FAQ

Questions

Is it really free?

Yes. It's MIT licensed with no paid tier, no account, and no ads. The full source is on GitHub.

Are the spend figures what I'll actually be billed?

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.

Why does it need macOS 26 Tahoe?

The popover is built on Liquid Glass, which requires the macOS 26 SDK.

Can I see more than one Claude, Codex or Cursor account?

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.

Does it update itself?

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.

Does it read my prompts or code?

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.

How do I uninstall it completely?

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.

My provider isn't listed. Can I add it?

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.

Stop getting surprised by rate limits.

Install TokenWatch and see your limits, spend, and cache status for every provider in your menu bar.

brew install --cask MetaPouch/tokenwatch/tokenwatch