| Project | Device | Agent | Surface | Models | Cost | Started | Last activity |
|---|
Coding Usage aggregates every local Claude Code, Codex and OpenCode session
on your machines into one API-equivalent cost view. Across
sessions it totals ( authoritative,
estimated), spanning . On a flat
subscription you do not actually pay these amounts — the figure answers
“what would this have cost on the API”, exactly like Claude Code's own
/usage.
Authoritative — for Claude sessions you have opened, the cost is Claude
Code's own /usage figure. The status line records it per session to
~/.claude/usage-ledger.json and the report uses it verbatim (no estimation).
OpenCode — OpenCode stores aggregate tokens and a session cost in
~/.local/share/opencode/opencode.db. The report uses that cost when present
and still shows the tokens/model even when the OpenCode provider is free.
Estimated (shown with a leading ~) — older Claude sessions
and all Codex sessions have no ledger entry, so their cost is tokens × API
list price. Only sessions opened after the status line was configured have an
authoritative entry; that is why most rows are estimates.
The Cost column is the whole-session total. Expand a row to see every model it
used, most expensive first, with that model's tokens and an estimated cost. When the
session total is authoritative, the per-model estimates will not sum to exactly the
same number — e.g. an authoritative $44.08 next to a per-model subtotal of
~$46.35. That is expected: one is Claude's billed figure, the other is a
token-based estimate. It is not a double count.
<synthetic> markerEach session lists all models it used. Claude Code subagent and sidechain
transcripts from <session-id>/subagents/*.jsonl are folded into the
parent session, so a mostly Opus row can also show Sonnet or Haiku when Claude
delegated work. Claude Code's internal
<synthetic> entries (locally-generated messages such as interrupts and
error notices) carry no tokens and no API call, so they are filtered out — they are not
a real model.
codex-auto-review entries are automatic reviewer-agent transcripts that
Codex writes when Auto-review evaluates approval requests. They are read-only model
calls, not coding sessions you manually started. When the transcript includes a
parent_thread_id, the report attaches the auto-review cost under the matching
Codex session instead of showing it as a separate top-level row. Use the Model
filter to find sessions that include them.
The filter panel is collapsed by default so the charts stay visible first, especially on mobile. Reset filters sits next to the toggle so it is reachable without expanding the panel, and is disabled when nothing is filtered. Rows per page lives in the pager and Expand all next to the Sessions table, where they apply. The date range uses an inline two-month calendar: click a start day, then an end day (either order) to set Started between; Clear dates removes it.
The report stores your selected filters, filter-panel state, sort order, page size,
expanded state, and active tab in this browser's localStorage, so refreshing
the file keeps your view.
This chart breaks each model's usage into input (fresh, uncached), output (generated, including reasoning tokens), cache read and cache write, and gives you three controls so you can read it the way that answers your question:
Hover any segment for its exact value and share. Codex exposes no cache-write tokens (that segment is always empty for Codex), and Codex models with no configured rate drop out of the Cost view. These controls only reshape this chart — the headline cost figures (chips, Cost by month, the Sessions table) stay the authoritative whole-session totals. The chart respects the active filters, exactly like the cost charts.
A session's entire cost is attributed to the month it started. Almost all sessions
happen within one day, so this rarely matters; a session that spans a month boundary counts
in its start month. Per-day splitting is not done because the authoritative /usage
figure is a single session total with no daily breakdown.
Anthropic bills a cache-write premium (5-minute TTL 1.25×, 1-hour 2×) and cheap cache reads (0.1×). OpenAI has no write surcharge — only a cached-input discount — so Codex cache writes are not charged.
Each app writes transcripts to its own home directory, so WSL and Windows are separate locations:
| Tool | WSL CLI | Windows (Desktop + CLI) |
|---|---|---|
| Claude Code | ~/.claude/projects/ | /mnt/c/Users/<you>/.claude/projects/ |
| Codex | ~/.codex/sessions/ + ~/.codex/archived_sessions/ | /mnt/c/Users/<you>/.codex/sessions/ + /mnt/c/Users/<you>/.codex/archived_sessions/ |
| OpenCode | ~/.local/share/opencode/opencode.db | /mnt/c/Users/<you>/.local/share/opencode/opencode.db |
CLI vs Desktop is not a different folder — it is recorded inside each transcript and shown in the Surface column. Cloud / container sessions (Codex Cloud tasks, Claude Code on the web) run server-side and leave no local transcript, so they cannot be measured here.
Each machine writes a committed data/<host>.json; this site is rebuilt
from those files, and the Device filter narrows totals to one machine. The data holds
project names, dates and costs — no secrets — but keep the repo private if that
matters.
For this host, the previous data/<host>.json is imported before scanning
local transcripts. Normal hook runs only add or grow known sessions: an archived,
missing, or briefly smaller transcript does not remove already exported history.