cctop
An htop for your AI coding agents. One screen for every Claude Code, Codex, Cursor, Devin, Gemini CLI, OpenCode, Pi and Windsurf session on your machine: what each is doing, what it has spent, and which one needs you.

A real recording. Play it in a terminal with
asciinema play docs/assets/demo.cast.
It reads what the agents leave on disk, so it sees sessions it did not start, including ones that ended weeks ago. Nothing to configure, nothing to run alongside it.
Features
- Cost. Tokens times published rates, per session, hour, day and model.
- Context.
CTX%tells you when a window is 68% full. The Context panel shows what is in it, including an Unaccounted bar that never claims to be smaller than it is. - Waiting on you. The status dot goes amber when an agent needs a reply, and
turns to a
✓when a turn ended while you looked elsewhere. - Stuck work.
ERR%is the share of a session's tool calls that failed. A quarter of them means an agent is retrying something that will not work, and paying for every attempt. - Collisions. Two agents in one checkout do not cause a merge conflict. They
cause one agent to overwrite a file the other still holds. The
!column warns you first. - Terminals. A tab is a real terminal you can type into, split and drag.
Alt+bjumps to whichever agent is waiting on you. Its agent runs in cctop's own rmux, built in, so it keeps running after you quit and is back in its tab next time.
Installation
[!IMPORTANT] cctop runs on Linux, including WSL. It reads Linux process tables and drives agents over ptys and unix sockets. There is no macOS or Windows build.
|
It offers to install sshfs as well, for cctop sandbox; append
-s -- --with-sshfs to sh to say yes in advance.
By hand, from a statically linked release archive. Swap in the aarch64 name on that architecture.
d=
|
&&
# released with; needs Rust 1.89 or newer
From source: git clone, cd cctop, cargo build --release. The binary lands
in target/release/cctop.
Checksums and cctop --update are in Installing cctop.
Usage
Run it:
That is the whole first run. It finds your sessions, prices them, and draws the table you saw above.
Six keys are worth knowing before anything else:
| Key | |
|---|---|
↑ ↓ |
move between sessions |
← → |
move between the panels underneath |
/ |
filter, on anything a row is |
R |
reopen the selected session in a tab of its own |
F12 or Alt+1 |
back to the dashboard, leaving the tab running |
q |
quit |
[!TIP] Run
cctop --install-hooksonce. The agents then report their own state live instead of cctop inferring it from disk. Runcctop doctorwhen something looks wrong and it will tell you what.
Beyond the dashboard
cctop can answer an agent (s), hand a session's context to a different
harness (O), read the sessions on another machine over ssh (--host), and
stream the table to a browser. On a phone that last one earns its place, since
the sessions waiting on you can find you.
It can also tell you what the money bought.
cctop optimizefinds the reads intonode_modules, the files fetched again after a compaction, and the tool calls that failed and were billed anyway. Each finding carries its cost and says whether that figure was measured or estimated.cctop compareputs your models side by side on your own work: how often each got a file right first time, what a changed file cost, how long it took.--rate 60prices that time too.cctop yieldasks the repository what became of the spend: which sessions' work reached the default branch, which sits on a side branch, which was never committed.cctop recall "why is the cache sharded"returns the passages of past sessions that discussed it.cctop --install-mcpgives the same to the agents themselves.
[!NOTE] Most costs are estimates: tokens multiplied by published per-token rates. Subscription plans (Claude Max, Pro, Team) charge a flat rate or bundle a fixed allowance, so these numbers will not match your invoice. Treat the
$column as a measure of resource consumption rather than billing.--plan maxshows bundled usage asincl. What the cost figures mean is honest about which providers report real figures and which get inferred.
Reference
| Agent | Cost | Tokens | Context | Tools | Live process |
|---|---|---|---|---|---|
| Claude Code | estimated | ✓ | ✓ full breakdown | ✓ | ✓ |
| Codex | estimated | ✓ | ✓ | ✓ | ✓ |
| OpenCode | reported | ✓ | ✓ | ✓ | ✓ |
| Pi | reported | ✓ | ─ | ✓ | ✓ |
| Gemini CLI | estimated | ✓ | ─ | ✓ | ─ |
| Devin | ─ | ✓ | ✓ | ✓ | ✓ |
| Cursor | ─ | ─ | ─ | ✓ | inferred |
| Windsurf | ─ | ─ | ─ | ✓ | ─ |
A ─ marks something the harness does not record, which is a different thing
from something cctop cannot show. Each provider's page has the
detail. Devin records tokens, context, tools and a live process, and no money at
all.
cctop --help has the rest.
Telemetry
cctop sends a small usage report at most once a day, from a background thread,
to https://cctop-releases.ecorsiste.workers.dev/telemetry. It is on by
default, and nothing is sent until a one-time notice has been shown on an
interactive run (the dashboard, or cctop serve on a terminal). cctop hook
and cctop yolo-hook never send anything. A report holds these fields and no
others:
id: a random ID you can reset. It is 128 random bits, not derived from anything about your machine or you, made at the first report.cctop telemetry reset-idreplaces it.version: cctop's version.os,arch: the OS and CPU type, such aslinuxandx86_64.features: how many times each oftui,serve,workspace,tunnel,yoloandupdateran since the last report.agents: the most agents of each kind (claude,codex,opencode, …) seen running at once since the last report.crash, only if cctop panicked: the file and line in cctop's own source, and the panic message with anything that looks like a path, URL, email, home dir, user name, hostname, IP or long token removed, cut to 200 characters.
It never sends prompts, session names, working directories, account names, hostnames or IP addresses.
To see the next report exactly, run cctop telemetry status. To turn it off,
use any one of these:
cctop telemetry off, which also deletes the ID and whatever was counted (cctop telemetry onturns it back on, with a new ID)telemetry = falseunder[settings]inconfig.toml, or the toggle on the settings page (,)CCTOP_TELEMETRY=0orDO_NOT_TRACK=1in the environment
Documentation
- Reading the table - every column, the status dot, filtering, and the full key list
- Driving agents - typing into sessions, resuming, tabs and splits, notifications
- In a browser -
cctop serve, the session report, and reaching it from a phone - The bottom panels - Tool Activity and the context breakdown
Then, if you want the detail: what it cost you for · did the spend ship · what the subscription bought · what the cost figures mean · provider by provider · integrations · troubleshooting