The receipt nobody printed

You got comped.
The question is how badly.

Every coding session on your machine already wrote down exactly what it burned. Nobody reads it, because it's four gigabytes of JSONL in four different shapes. comped reads it and tells you what your last 30 days would have cost at API list price โ€” and how many times over your subscription ate it.

$ rote play run https://play.modiqo.ai/rajkaria/comped plan=claude-max-200

Needs python3. Nothing else. No API key, no sign-in, no upload โ€” and no network calls at all.

The comped card: total spent at list price, the multiplier against your plan, spend per model, cache-read share, and the top repeated asks with what each repeat cost.
One card. Rendered from the synthetic logs bundled with the Play, so the numbers are small โ€” on a real month they are not.

Do the maths in your head, badly

Or don't. Put in what you pay and a guess at what you'd have spent on the API, and find out what you're calling it at parties.

Nothing here leaves your browser. It's arithmetic, not a service. The Play does the real version, with your actual token counts.

How it gets the number

No estimates, no sampling, no telemetry. It reads the same files your agent already wrote and does the arithmetic you'd do by hand if you had a spare weekend.

  1. It reads every harness you have. Claude Code โ€” including the subagent transcripts hiding in subdirectories โ€” plus Codex, Pi and OpenCode. Each one is a separate step, so a harness you don't use is a shrug, not an error.
  2. It throws away the duplicates. Claude Code writes one line per content block, so roughly four in ten usage lines are the same API call again. Price those and your number is fiction. They're collapsed on (message.id, requestId). Codex is the opposite problem: cumulative counters that have to be differenced.
  3. It prices what's left. Uncached input, cache writes, cache reads and output, each at its own rate, in exact decimal arithmetic โ€” from a bundled price table that names its source, its upstream checksum and the date it was taken. A model the table doesn't know is reported with its token count and never priced by guess.
  4. Then it reads you back to yourself. The jobs you've asked three or more times across different days, what each repeat cost, and โ€” for the darker version โ€” the mistakes your agent keeps making and what recovering from them cost.

Three Plays, one honest parser

Same core underneath. Pick the one that matches the question you're actually asking.

rajkaria/comped

What did it cost me?

The card. List-price total, the multiplier against your plan, cache-read share, spend per model, what moved since your last run, and the asks you keep repeating with a price on each.

rote play run https://play.modiqo.ai/rajkaria/comped plan=claude-max-200
rajkaria/session-ledger

Just give me the data

The deduplicated ledger under everything else: usage records, the messages that started each turn, every tool call and whether it failed. Nothing priced, nothing judged. If you're writing a session Play, read this instead of re-parsing the logs.

rote play run https://play.modiqo.ai/rajkaria/session-ledger
rajkaria/wrong-turns

Where did it go wrong?

The mistakes your agent makes on repeat โ€” tool errors, the message where you corrected it, reverts โ€” grouped by signature, priced by what recovery cost, each with a drafted rule for your CLAUDE.md. It writes the draft. It never edits your files.

rote play run https://play.modiqo.ai/rajkaria/wrong-turns

New to rote? Two minutes to install, then any of the above.

What it looks at, exactly

Short version below. The long version is in the docs, field by field, including every number the card can show you.

Tokens

Per API call: uncached input, cache writes, cache reads, output and reasoning tokens, with the model and the session they belong to. Reasoning bills as output, because that's how you're charged.

Turns

The message that started each turn, so cost can be attributed to what you asked rather than to a wall of API calls. Messages your harness generated are labelled as such and kept out of the totals that claim to be yours.

Tools

Every tool call, its one-line summary, and whether it errored. That's what makes "your agent has failed the same way 14 times" a fact rather than a feeling.

Never

Prompt text beyond a 120-character truncation plus a hash. File contents. Your credentials โ€” it refuses to open the files that hold them, even to work out which plan you're on. You type that.

The boring, important part

A tool that reads your logs is asking for a lot of trust. Here's the exact shape of what it does, and how you can check rather than believe.

None of that is a promise you have to take on faith. The test suite fails the build if the core imports urllib, http, socket, requests or ssl; if any module except the PNG renderer so much as mentions subprocess; or if any line of source references a credential path. Read that test โ€” it's 20 lines.

Is the number real?

It's a list-price equivalent, and the card says so on its face. That distinction matters, so here it is plainly.

It is not a bill

You're on a subscription. You paid what you paid. This is what the same tokens would have cost at the API's published rates โ€” the number that tells you whether your plan is a bargain or a rounding error.

Every figure shows its working

Each run writes comped-explain.txt: one line per model with the token counts, the rate each was multiplied by, and the total. If a number looks wrong, you can find out why in about ten seconds.

Checked against someone else's maths

Continuous integration compares our Claude Code token totals, per model, against ccusage โ€” an independent tool with its own parser. Same logs, same dedup, same totals.

Unknown models stay unknown

If the bundled table has no rate for a model, it appears under "unpriced" with its token count and no dollar figure. A guessed price would make the headline number worse, not better.

Go and find out

Try it on the synthetic logs bundled with the Play first, if you'd rather not point a stranger's code at your own on the first date.

$ rote play run https://play.modiqo.ai/rajkaria/comped claude_dir=resources/fixtures/claude codex_dir=resources/fixtures/codex plan=claude-max-200
$ rote play run https://play.modiqo.ai/rajkaria/comped plan=claude-max-200

Then post your multiplier. Everyone thinks theirs is the bad one.