tokenfatty
Local meter · macOS · v0.1

Find out what your AI tools actually cost.

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.

What it measures

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.

Tokens read
31.7M
Across 134 responses in three days
Cache hit rate
100%
268 tokens arrived uncached, all week
Without caching
5.4×
What the same work would have cost

Where the money goes

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 bucketRate $/Mtok TokensCostShare
Uncached input5.00268 $0.000.0%
Cache write — 1.25× base 6.251,460,586 $9.1330.4%
Cache read — 0.10× base 0.5029,990,344 $15.0049.9%
Output25.00236,290 $5.9119.7%
Total31,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.

Install

  1. Download it
    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.

  2. Run the installer
    ./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.

  3. Look at your menu bar

    A small and a figure appear top right. Click it for the breakdown. It refreshes every 30 seconds.

Requirements

Removing it

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

What it sends

Nothing. Ever.

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.

  • Zero tokens. Running it costs nothing, on your subscription or anyone's API bill. It works on a plane.
  • No telemetry. Not anonymous, not aggregate, not "just a ping".
  • Your prompts are never read — only the token counts each response reports.

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.

How the counting works

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.