One line
You need a terminal and python3 (3.9 or newer, which every Mac has). Copy this, paste it into Terminal, press Enter:
curl -fsSL https://gotcomped.com/comped.sh | sh
No account, no package manager, nothing installed. It downloads about 150 KB of standard-library Python into a temporary directory, runs it, and deletes the directory on the way out. Ten seconds, and the only thing left on your machine is ~/comped/. The script is sixty lines; read it before you paste it. Anything after sh -s -- goes to the run: … | sh -s -- plan=claude-pro-20.
It checks the download against its published checksum before running anything. That proves the download arrived whole, not that this site is honest; for that, read the source.
With node: npx
If you already have node, there is nothing to download by hand and no shell to worry about, which also makes this the one to try on Windows:
npx comped
The package is the same standard-library Python in an npm wrapper: no node dependencies, no install script, and bin/comped.js does nothing but find an interpreter and hand it the payload. You still need Python 3.9 or newer on your PATH. Arguments work the same: npx comped plan=claude-pro-20.
The other way in: as a rote Play
comped is also published as a Play on Modiqo's registry, and that is the careful way in: rote prints every parameter and every path the Play will touch and waits for your yes, and the whole package sits in public where you can read it before you run it. The trade is a free Modiqo account, because rote will not run anything until you are signed in.
curl -fsSL https://gotcomped.com/run.sh | sh
That line installs rote if you don't have it, signs you in, and runs the Play. About a minute the first time. To be asked at every step instead, use the registry's own installer:
curl -fsSL "https://play.modiqo.ai/install?play=rajkaria/comped" | sh
Already have rote? Then it's just rote play run https://play.modiqo.ai/rajkaria/comped --yes: drop --yes to see the Ready selector. Check you're on 0.78 or newer with rote --version. Want to read the whole thing before you run it? rote play inspect rajkaria/comped prints the manifest, and that much needs no account.
Same code every way. The Play, the download and the npm package carry a byte-identical copy of the core, and CI fails if they ever drift apart. Same parameters, same card, same row on the board.
Or ask the agent you already have
If you spend your day in Claude Code, Codex, Cursor or anything else with a shell, you don't need the terminal line at all. Paste this at your agent:
Run comped on this machine: fetch https://gotcomped.com/llms.txt and follow it.
It reads llms.txt, a briefing written for agents rather than people, and takes it from there: it asks you first whether to put your score on the leaderboard, runs comped without needing an account, and reads the card back to you. That file also tells it what it must not do, including summarising your logs by eye and copying anything out of ~/comped into a message or a commit. It is short. Read it before you paste the line.
Try it on sample data first
If you'd rather see it work before pointing it at your own logs, sample logs travel with it: real in shape, made-up in content. This works through every door.
curl -fsSL https://gotcomped.com/comped.sh | sh -s -- \
claude_dir=resources/fixtures/claude \
codex_dir=resources/fixtures/codex \
out_dir=comped-demo leaderboard=false
Or with node:
npx comped \
claude_dir=resources/fixtures/claude \
codex_dir=resources/fixtures/codex \
out_dir=comped-demo leaderboard=false
Or, as a Play:
rote play run https://play.modiqo.ai/rajkaria/comped \
claude_dir=resources/fixtures/claude \
codex_dir=resources/fixtures/codex \
out_dir=comped-demo
About two seconds, and a card with tiny numbers. Then the real thing:
curl -fsSL https://gotcomped.com/comped.sh | sh
Everything lands in ~/comped/. Run it again tomorrow and the card grows a line telling you what moved.
Reading your card
Top to bottom:
- The big number. What the last 30 days would have cost at the provider's public API prices. Not a bill: you're on a subscription and you paid what you paid.
- Your comp score, and your tier. That number divided by what your plan costs for the same window. 13× means your subscription paid for itself thirteen times over; the tier is the word for that.
- Which AI cost what, largest first, with a bar.
- Cache-read share. How much of what the AI read came from cache. High is normal and good.
- Active days and sessions, so a big number reads as either heavy use or a heavy week.
- Since last time, once there is a last time.
- Detected. Which AI you use and through which tools. None of it typed by you.
- If you're on… every plan your provider sells, scored at once, with the one it assumed marked. Find your row.
- Repeat offenders. Things you've asked your agent to do three or more times on different days, with what the repeats cost.
What it works out for you
You type nothing. Every request your AI tools log carries the name of the model that answered it, and that name says who made it. From that, comped knows whether you're on Claude, ChatGPT/Codex, Kimi, GLM, DeepSeek, Gemini, Grok, Qwen, MiniMax or Mistral, and which tools you read it through.
The one thing your logs don't record is which tier you pay for: a Pro session and a Max session look identical. So rather than ask, or peek at your account (it never will), the card prices every plan your provider sells and marks the most expensive one that fits as the safe assumption. Your real score is at least that. If you want the exact row on the headline, say so once:
rote play run https://play.modiqo.ai/rajkaria/comped plan=claude-pro-20
Say it once: a typed plan is remembered in ~/comped/comped-plan.txt and every later run uses it. Delete the file to go back to inferring. Paying for something the table doesn't list: a Kimi or GLM coding plan, a team seat? plan=usd:29 prices it.
Your tier
The score lands you in one of seven tiers, printed on the card and in comped-share.txt: Paying customer (under 1×), Break-even (1–2×), Comped (2–5×), Properly comped (5–12×), All-you-can-eat (12–30×), Hostage situation (30–80×), Please stop (80× and up).
The leaderboard
The last step of a run posts your score to https://gotcomped.com/leaderboard.html and prints your rank. The line in comped-share.txt is rewritten with it, so what you post already says where you stand.
| Rule | What it means for you |
|---|---|
| Ranked by comp score | Full price ÷ your plan. A $20 plan at 60× beats a $200 plan at 13×. Ties break on dollars, then active days. |
| Ranks from $20 and 3 days | Under $20 at full price, or fewer than three active days in the window, you're posted but not ranked; the run says so. |
| One row per handle | A re-run replaces your row. Two machines with the same handle: the latest run wins. Blank handles post as anon-xxxx, one per machine. |
| Your row is yours | A random id in ~/comped/comped-device.txt keys it. Nothing anyone else posts can touch it; nothing you post can touch theirs. Keep the file if you want re-runs to replace rather than add. |
| Held for a look | Over 2,000× or $250,000 is stored but not shown until someone looks. The server also recomputes score = dollars ÷ plan and refuses a mismatch. |
| Off the board | leaderboard=false posts nothing. To remove a row already there, open an issue with the handle. |
Options you might change
Add any of these after the command as name=value. Everything has a sensible default.
| Option | Default | What it does |
|---|---|---|
days_back | 30 | Filter on each record's own timestamp. |
out_dir | ~/comped | Created if missing. Everything this Play writes goes here and nowhere else. |
plan | auto | Leave it. auto reads the model ids already in your logs, names the providers behind them (Claude, GPT/Codex, Kimi, GLM, DeepSeek, Gemini, Grok, Qwen and the rest) and prices every tier those providers sell, marking the least flattering one as assumed -- you read your own row instead of typing it. Override with a comma-separated list of ids, or usd:<amount> for a subscription this table does not carry. This Play never opens your OAuth files to find out. |
repeat_threshold | 3 | Minimum asks for a repeat offender; also needs 2 sessions and 2 days. |
handle | (empty) | Your name on the gotcomped.com leaderboard, and in the /play settle command. Blank posts anonymously (anon-xxxx). gotcomped.com/run.sh fills in your rote handle. |
card_theme | dark | dark or light. |
leaderboard | true | true posts your score to gotcomped.com after the card is written and prints your rank: the multiplier, tier, list-price total, plan, detected providers, days, and your handle. Nothing else, ever; the exact payload is saved to out_dir/comped-rank.json. false sends nothing, and the run is then entirely offline. |
The full parameter list, including where each tool's logs are read from, is on the developers page.
What it writes
All of it under ~/comped/ (or the out_dir you chose), and nowhere else. The card lists every path it wrote.
| File | What's in it |
|---|---|
comped-report.md | The whole run in Markdown: card, the line to post, a link that draws the card as a downloadable picture, per-model table, sources, repeats, dividend, delta, unpriced models, methodology, privacy, and every path written. |
comped-card.svg | The shareable card, 1200×675. |
comped-card-square.svg | The same card on a square canvas. PNG renderers fit thumbnails into a square box and would otherwise crop the wide one. |
comped-card.png | Rendered from the square SVG when this machine has rsvg-convert or macOS qlmanage. Absent, with a note pointing at the card page, when it doesn't: that page draws the same card in your browser and downloads it as a PNG. |
comped-explain.txt | One line per model showing tokens × rate = dollars, plus the plan arithmetic and one line per source. |
comped-share.txt | A post you can paste, with the numbers already in it. |
comped-baseline.json | Totals and repeat labels from this run, so the next one can show you the delta. |
ledger.jsonl | The full ledger. Same file session-ledger produces. |
ledger-summary.json | Counts per source, including what could not be read and why. |
When it looks wrong
"no log directory found"
Expected if you don't use that tool: it's skipped and the run continues. If you do use it, its logs live somewhere unusual; point the right option at them: claude_dir, codex_dir, pi_dir, opencode_dir.
The number looks too low
Check days_back (it's 30 by default), then the "unpriced" list at the bottom of the report. A model that isn't in the price list contributes nothing to the total, on purpose: a guessed price would make the number worse, not better.
The score is lower than I expected
The headline assumes the most expensive plan that fits. Look at the If you're on… rows for your actual tier, or pass plan=.
No repeat offenders
The bar is deliberately high: three asks, two sessions, two days. Try repeat_threshold=2.
No PNG
The SVG card is always written and uploads to LinkedIn as-is. For a PNG, install rsvg-convert, or use a Mac where it's built in.
It asked me to sign in
That's rote's registry, so the Play can be fetched and verified. comped itself never signs in to anything; the one thing it sends is your score to the leaderboard, and only if leaderboard is left at true.
It says "not posted"
The card is done; only the leaderboard post failed, usually because the machine is offline or the post timed out. Run again when you're online, or leave it. The exact reply is in ~/comped/comped-rank.json.
I'm on the board as anon-xxxx
The run had no handle, which is what happens by default: nothing about you is assumed. Pass handle=yourname to claim a name. The rote path fills in your rote handle automatically. A re-run replaces your row, so the anonymous one goes away when a named one arrives from the same machine.
Privacy
- Reads your AI tools' session logs. Nothing else.
- Never reads
~/.claude.json,~/.codex/auth.jsonor any credential, keychain or token file. Which AI you use comes from the logs; your plan is never looked up. - Sends one thing. After the card is written, your score goes to the leaderboard: handle, comp score, tier, full-price total, plan and its price, detected providers and tools, days, sessions, cache share, and a random id that keys your row. No paths, prompts, model names or hostnames. It's saved to
~/comped/comped-rank.jsonbefore it goes.leaderboard=falsemakes the run entirely offline: no telemetry, no "anonymous usage", no version check, nothing. - Writes only under the folder you choose, and tells you every path.
- Your messages are cut to 120 characters and hashed. Never the full text, never on a card.
How to verify each of those rather than believe them is on the developers page.