Tokenfatty sits in your menu bar and reads the session transcripts Claude Code already writes to your disk. No API key, no account, no configuration. It sends nothing anywhere and costs zero tokens to run.
Real output from one machine over three days. Project names changed.
Claude Code is a subscription, so you are never billed per token. Tokenfatty reports notional value instead: what the same tokens would have cost at public API list rates. It is not a bill. It is what the subscription delivered, priced against the alternative.
Every response reports four disjoint token buckets, each priced differently. Cache writes cost more than fresh input; cache reads cost a tenth. The call that builds context pays for it, and every call after rides cheaply on what it stored.
| Token bucket | Rate $/Mtok | Tokens | Cost | Share |
|---|---|---|---|---|
| Uncached input | 5.00 | 268 | $0.00 | 0.0% |
| Cache write — 1.25× base | 6.25 | 1,460,586 | $9.13 | 30.4% |
| Cache read — 0.10× base | 0.50 | 29,990,344 | $15.00 | 49.9% |
| Output | 25.00 | 236,290 | $5.91 | 19.7% |
| Total | 31,687,488 | $30.03 |
Cache reads are half the cost despite being the cheapest bucket, purely on volume. That is the kind of thing you cannot see without a meter.
curl -L https://tokenfatty.com/tokenfatty.tar.gz | tar xz
cd tokenfatty
68 KB. Read install/install.sh
before you run it — it is 90 lines and it tells you every path it
touches.
./install/install.sh
It builds ~/Applications/Tokenfatty.app
and registers a login agent, so the meter starts with your machine and
restarts if it dies. It checks for PyObjC and asks before installing
it — never silently.
A small ◆ and a figure appear top right. Click it for the breakdown. It refreshes every 30 seconds.
python3 --version works, you are set./install/uninstall.sh
Deletes the app, the login agent and the log — exactly the three paths the installer created, and nothing else. It leaves PyObjC alone, since that went into your Python environment and something else may want it.
There is no HTTP client, no SDK and no API key anywhere in the codebase.
The reader imports four standard-library modules:
datetime, glob,
json, os. It opens files
under ~/.claude/projects and does arithmetic.
If this ever changes it will be stated here before a release that changes it, not after. A tool distributed as local-only that quietly starts reporting home is the one mistake that would deserve to end it.
Claude Code writes one transcript record per content block, but token usage is reported per response. A reply containing a thinking block, some text and three tool calls becomes five records, each repeating identical counts. Tokenfatty collapses them on message id.
Counting records instead of responses overstates spend by a multiple — on the run above, 265 duplicate records collapsed into 134 real responses. Every figure the app shows names the files it came from and how many records were read, so you can check it.