open source · MIT★ star it on GitHubfound a bug, or want an agent supported?open an issuebuilt in the open, receipts included
skip to content
tokenchitv0.11.0 · MIT
commit your svgparsed locallyno prompts sent

Receipts for your robots.

Your AI coding usage, in a card you own.

See token usage from Claude Code, Codex, Gemini CLI and OpenCode on your machine. Save an SVG in your repo, or choose to publish a hosted card and join the board.

$ npx -y @tokenchit/cli@latest generate --no-publish

Free and MIT · Node.js 22+ · Local stats need no account.

This command sends nothing: --no-publish returns before any networking code loads. Bare generate ends by publishing — at a terminal it asks first, in a script or CI it does not. Publishing sends daily totals by agent and model, plus your handle, and never prompts, replies or file paths.

35 developers on the board · 729B tokens

live preview
@iyashjayesh
TOKENS
26.4B
EQUIV. COST
$12,084
STREAK
0d
claude-code 74%codex 26%opencode <1%
[ 01 ]

Two ways to use it

Everything below the first command is optional. Reading your logs and rendering a card happen entirely on your machine, and --no-publish guarantees that is all that happens. Bare generate finishes by publishing: at a terminal it asks first, but a script or a CI job has nobody to ask, so it uploads. Keep the flag and the choice stays yours.

path a

Keep it local

The card is a file you own, in a repo you control.

$ npx -y @tokenchit/cli@latest generate --no-publish

what you get

  • Works offline, and keeps working if this site does not.
  • Nothing is sent, so there is nothing to take back later.
  • No account, no handle to claim, no key on disk.

what it costs

  • It is a snapshot: it shows the day you last ran it until you run it again.
  • No profile page, no board row, and no link back from the card.
path b

Share a live card

A hosted card that updates itself, and a row on the board.

$ npx -y @tokenchit/cli@latest publish

what you get

  • Refreshes without a commit, and links back to your profile.
  • A ✓ github mark, once the device flow proves the handle is yours.
  • The Action can pull the current card into any repo you like.

what it costs

  • Daily totals by agent and model, plus your handle, leave your machine.
  • The card depends on this service and caches for four hours.
  • Reversible, but not retroactive — unpublish deletes the lot.

Put it on your profile

The local path, end to end. Five steps, none of which need an account.

  1. 01run

    One command, nothing uploaded

    Detects which agents you have, writes .tokenchit.json, and renders the card from the transcripts already on your disk. No account and no sign-in — this command has no networking code in it at all.

    $ npx -y @tokenchit/cli@latest generate --no-publish
  2. 02inspect

    Open the file before you trust it

    tokenchit.svg is a plain SVG in your working directory. Every figure on it came from your own logs, and if an agent you use is missing, doctor says which one and why.

    $ tokenchit doctor
  3. 03commit

    It is a file in your repo

    GitHub serves a committed SVG directly rather than through its image proxy, so the card renders even for readers your network never reaches.

    $ git add tokenchit.svg && git commit -m "chore: update tokenchit"
  4. 04paste

    Embed it relative to the README

    A Markdown image resolves against the file it sits in. Beside the card that is ./, from a README one directory down it is ../ — the path the CLI prints is the first form, and pasting it into the second is how a working card becomes a broken image.

  5. 05refresh

    Re-run it, or let a hook do it

    The card is a snapshot, so it ages. A pre-commit hook re-renders and stages it every time you commit. The GitHub Action can also refresh a card, but only a published one: a runner has no access to your ~/.claude or ~/.codex.

    $ tokenchit hook install
readme beside the card
![tokenchit — @your-handle AI coding agent usage](./tokenchit.svg)
readme one directory down
![tokenchit — @your-handle AI coding agent usage](../tokenchit.svg)
hosted card · after publish
[![tokenchit — @your-handle AI coding agent usage](https://tokenchit.app/api/card/your-handle.svg)](https://tokenchit.app/u/your-handle)

A profile README is its own repository, so the card has to be committed to that repo for GitHub to serve it. Pointing at an SVG in a different repository renders as a broken image.

[ 02 ]

The board

opt-in

Public ranking of everyone who has published. Run tokenchit publish — or a bare tokenchit generate, which ends by calling it — and you are on it. Stop publishing and your row goes stale, then falls out of the window on its own.

Top developers by tokens
rankdeveloperagent mixtokensequiv. coststreak
1Image@bucharitesh3w✓364B$660,7070d
2Image@Rupam-M✓149B$69,3630d
3Image@VinayakRai5✓47.0B$20,35944d
4Image@iyashjayesh✓26.4B$12,0840d
5Image@manishreddy123✓25.1B$10,4840d

Rank is total tokens over the selected window; cost and agent mix cover the same window. Streak is the current run of active days, which is not a windowed figure. A cli badge means the numbers were self-reported without a GitHub sign-in.

[ 03 ]

The card, up close

SVG from the embed endpoint, shown at actual size. Default is 495 × 195; layout=compact is 340 wide so two cards fit on one README line. Theme follows GitHub's dark mode via a media query. Every card carries the timestamp of its last sync, because the endpoint caches for four hours.

variant / light
@iyashjayeshTOKENS26.4BEQUIV. COST$12,084STREAK0dclaude-code 74%codex 26%opencode <1%TOKENCHIT.APPSYNCED 4D AGO
variant / dark
@iyashjayeshTOKENS26.4BEQUIV. COST$12,084STREAK0dclaude-code 74%codex 26%opencode <1%TOKENCHIT.APPSYNCED 4D AGO
markdown
[![tokenchit — @your-handle AI coding agent usage](https://tokenchit.app/api/card/your-handle.svg)](https://tokenchit.app/u/your-handle)
html · two cards on one line
<img height="195" src="…/card/your-handle.svg"> <img height="195" src="…/card/your-handle.svg?layout=compact">

Markdown will not place two images on one line. The HTML form is the only way to sit cards side by side in a README, which is why the compact width exists.

layout=compact · 340px
@iyashjayeshTOKENS26.4BEQUIV. COST$12,084STREAK0dTOKENCHIT.APPSYNCED 4D AGO
query options
layoutdefaultdefault (495px) or compact (340px)
themeautoauto follows GitHub dark mode; force light or dark
agentsallcomma-separated allowlist, e.g. claude-code,codex
hide—drop any of spend, streak, mix from the card
cache4hclamped 4h–24h, same as the rest of the genre

Equiv. cost is not what you paid. It is what these tokens would cost at list API rates. Most agent usage runs under a subscription where no per-token charge ever happens, and models with no public price — bundled or self-hosted ones — are counted in the token total but left out of the figure.

[ 04 ]

Two different marks

The lime ✓ GITHUB mark means the account is real and the handle is theirs. It says nothing about the numbers. That is what the tier below is for.

How a row on the board is verified, and what each mark does and does not prove
tiermethodprovesdoes not prove
○ cli · self-reportedone-shot upload of a locally parsed summaryThe file was produced by the CLI on some machine, at the stated time.Nothing about the numbers. Logs can be edited before parsing. Treat as a claim.
✓ github verifiedGitHub device flow, then an API key bound to that accountThe handle on the row belongs to the GitHub account that authorised it. Nobody else can publish under it.Anything about the figures. It is an identity check, not an audit — the numbers are still self-reported.

Not yet: signed daily deltas would prove the numbers arrived in order and were never edited after the fact, and a read-only provider analytics API would match them against real billing records. Neither is built, so neither is claimed — and neither would fix the ceiling below.

Ceiling: no tier distinguishes tokens spent on work from tokens spent on nothing. The card measures usage, not output.

[ 05 ]

Enforced by the test suite

Not a policy page. These are real tests in packages/cli/test/privacy.test.js, run on every push. Each one fails if the guarantee it names stops holding.

privacy.test.js
✓payload.noContentno prompt, reply, branch or file content survives into an uploaded payload44ms
✓paths.absentno filesystem path is collected at all — not hashed, not truncated, absent35ms
✓dryrun.exact--dry-run prints the byte-identical body that a real publish puts on the wire90ms
✓net.isolatedno source file outside src/net.ts can open a socket7ms
✓payload.noContent.everyAdapterthe same guarantee proved for every adapter, not Claude Code alone51ms
5 passing (227ms) · 0 failing
[ 06 ]

Year in review

tokenchit recap renders this as a second committable SVG. Same data, no card constraints.

total tokens
4.24B
equiv. api cost
$1,284.60
top model
claude-sonnet-4-5
longest streak
63d
per-agent breakdown
agentsharetokenscost
claude-code
52%
2.46B$742.10
codex
19%
890M$268.40
opencode
19%
902M—
gemini
10%
471M—
activity by day and hourlessmore
MON
712M
TUE
738M
WED
770M
THU
725M
FRI
747M
SAT
265M
SUN
283M
0003060912151821
day total

Peak block: Tue–Thu, 14:00–19:00 local. Derived from log timestamps only.

supported by

Neon backs tokenchit through their Open Source programme, and is the Postgres this project documents as its default. That choice came first and on its own merits: their idle behaviour is scale-to-zero with automatic resume, where the alternative needed a human in a dashboard to bring a quiet board back.

Read your own numbers.

One command. It finds your agents, prints your stats and writes the card. The command shown cannot publish. Bare generate can, and in a script or CI it does so without asking, so keep the flag for a guaranteed local run.

$ npx -y @tokenchit/cli@latest generate --no-publish

Or tokenchit sync to see the figures without writing anything. It makes no network request.

Who is burning the most?

Ranked by tokens, from developers who chose to publish. The two windows disagree on purpose — one rewards the last month, the other the whole history.

Last 30 days

All time

Top 8 of each. A ✓ means the GitHub identity was proved; everything else is self-reported.

See the full board →