π₯ TokenBurn
See what your AI coding agents cost you β in tokens and dollars, from the logs already on your disk.
A terminal UI, a desktop GUI and a web dashboard (plus a CLI for scripts), all in Rust, all showing the same live numbers.
Cross-platform: Linux, macOS and Windows are supported.
TokenBurn reads local logs only β no network calls, no account, no telemetry. It understands pi, Zed, Claude Code, Codex, Copilot CLI, Gemini CLI, OpenCode and Amp, shows where the tokens (and money) went, and keeps itself up to date while you work.
Choose your front-end
Same data, same charts, same 43 themes β pick whichever fits how you work.
π₯οΈ Terminal UI β tokenburn-tui
For when you live in the terminal. Browse the report, watch the charts, and filter as you type.

- Report table with a stacked token chart and a share-by-project pie
- Instant filtering:
/free text (claude -zed),fper-tool checkboxes with row counts - Options popup (
o): toggle panels, auto-refresh interval (5β300 s or off) - Theme picker with live preview (
T), or[/]to cycle
&&
πͺ Desktop GUI β tokenburn-gui
A native window (Iced) with interactive, animated charts. Click a bar to scope everything to that day, click a slice to scope it to that project.

- Stacked bars over time (tokens or cost) and a project donut; hover for tooltips
- Click to drill down β the table, totals and the other chart follow
- macOS app, Windows installer, and Linux (one binary for X11 and Wayland)
- Drop-down pickers for tool, view, window and theme
&&
π Web dashboard β tokenburn-web
A local web page in your browser. Live over a WebSocket, drill-down by clicking, and every view is a shareable URL.

- Server-rendered SVG charts with CSS animation β no JavaScript charting library
- Filters are Topcoat signals: changing one updates the page in place
- A drilled-down view is part of the URL:
?sel_bucket=2026-09-22&sel_project=pi%3Aatlas - JSON API at
/api/report; binds to127.0.0.1by default
β¨οΈ CLI β tokenburn
For scripts and pipes.

What it reads
--tool |
Tool | Where it reads (default) | $ cost |
|---|---|---|---|
pi |
pi | ~/.pi/agent/sessions/**/*.jsonl ($TOKENBURN_PI_SESSIONS, $PI_CODING_AGENT_DIR) |
β |
zed |
Zed agent panel | threads.db (sqlite + zstd JSON; $TOKENBURN_ZED_DB) |
β |
claude |
Claude Code | ~/.claude/projects/**/*.jsonl ($CLAUDE_CONFIG_DIR) |
when logged |
codex |
OpenAI Codex CLI | ~/.codex/sessions/**/*.jsonl ($CODEX_HOME) |
β |
copilot |
GitHub Copilot CLI | ~/.copilot/session-state ($COPILOT_HOME) |
β |
gemini |
Google Gemini CLI | ~/.gemini/tmp/*/chats ($GEMINI_DATA_DIR) |
β |
opencode |
OpenCode | ~/.local/share/opencode/opencode.db ($OPENCODE_DATA_DIR) |
β |
amp |
Amp | ~/.local/share/amp/threads/*.json ($AMP_DATA_DIR) |
β |
all (the default) reads every tool that is installed; one that isn't simply contributes nothing. Cost is shown only where the tool logs one β otherwise $0.00 rather than a guess (token counts are exact). Cursor, Windsurf, VS Code Copilot Chat and JetBrains AI keep no usable token log on disk, so they can't be supported.
The Claude Code, Codex, Copilot CLI, Gemini CLI, OpenCode and Amp readers follow the formats documented by ccusage and are covered by fixture tests; pi and Zed were also checked against real logs. If one misreads your data, open an issue with a (redacted) log line.
Shared by every front-end
Always up to date. Nothing to press β each front-end re-reads the logs itself, and only re-parses the files that changed, so leaving one open is cheap.
| Refresh | |
|---|---|
| TUI | every 5 s (5β300 s, or off, in the o popup) |
| GUI | every 10 s |
| Web | every 5 s over a WebSocket (every 10 s without the live runtime) |

Charts. Tokens or cost over time (one stacked bar per hour, day or month, one colour per tool) and a donut of the biggest projects. In the GUI and web dashboard they animate in, and clicking drills down:
| Click | Effect |
|---|---|
| a bar | table, totals and donut are scoped to that bucket |
| a donut slice (or its legend row) | table, totals and bars are scoped to that project |
| both | they intersect |
| the same one again, or β clear | back to everything |
Changing the tool, view or window drops the selection.
Responsive. All three front-ends adapt to the space they get, on the same three breakpoints β wide (β₯ 980 px, β₯ 110 terminal columns), medium (β₯ 700 px, β₯ 70 columns) and narrow β so a phone-sized browser, a half-screen window and an 80Γ24 terminal are all comfortable:
| Wide | Medium | Narrow | |
|---|---|---|---|
| Layout | everything: all columns, charts side by side | the cache columns drop out, charts stack | compact header and controls (they wrap), only the essential columns, whole page scrolls |
| Web | |||
| GUI |
The terminal UI follows the terminal size live (it re-lays itself out as you resize):
| Medium (~95 columns) | Narrow (~65 columns) |
|---|---|
- TUI: the cache columns go at < 110 columns; below 70 only
totalandcoststay, the pie and the theme chip make room (the currency stays), and the hints shrink. Charts shrink on short terminals and vanish below 22 rows so the table keeps the space; under 40Γ10 you get a "terminal too small" notice instead of a garbled screen. - GUI: try it with
TOKENBURN_GUI_SIZE=400x820 tokenburn-gui(the window can be as small as 320Γ420). - Web: plain CSS media queries on the same breakpoints; tables scroll sideways instead of overflowing, and the chart text gets larger and sparser when it is scaled down.
43 themes, dark and light β Dracula, Nord, Tokyo Night, Catppuccin, Gruvbox, Solarized, Kanagawa, RosΓ© Pine, Everforest and more β shared by every front-end, including one colour per tool in the charts. Pick one with --theme "Tokyo Night" (--list-themes lists them), or in the UI; the choice is remembered in settings.json (~/.config/tokenburn/, ~/Library/Application Support/tokenburn/, %APPDATA%\tokenburn\; override with TOKENBURN_CONFIG_DIR), so all front-ends start with the same theme.

Currencies. Every tool logs its cost in US dollars; pick another currency to see it converted β 41 are built in (EUR, GBP, CHF, JPY, RON, RUB, UAH, PLN, CZK, HUF, INR, CNY, BRL, CAD, AUD, AED, and more; --list-currencies prints them all). Choose one with --currency EUR, the pick list in the GUI, the select in the web dashboard (?currency=EUR) or C in the TUI; the choice is remembered in settings.json for every front-end. Amounts keep cents ($0.04), and yen, won, forint and the like have none.
TokenBurn never goes online, so the exchange rates are fixed estimates (marked β next to the cost label). For exact ones, add your own to settings.json β they win over the built-in values and lose the β:
(rates are units per US dollar). JSON output (--json, /api/report) always stays in dollars.
Install
Prebuilt (GitHub releases)
| Platform | Artifacts |
|---|---|
| macOS | tokenburn-<v>-macos.dmg β TokenBurn.app + Command Line Tools/ (CLI, TUI, web) |
| Windows | tokenburn-<v>-windows-x86_64-setup.exe (installer, optional PATH entry) or the .zip |
| Linux | .deb / .rpm per app, tokenburn-{tui,gui}-<v>-<arch>.AppImage, portable .tar.gz (glibc x86_64 / aarch64, static musl x86_64) |
Every portable archive holds all binaries for that target, the web runtime in assets/ (so tokenburn-web runs live), the README and licence, plus a .sha256.
macOS: the app is ad-hoc signed, not notarised β right-click β Open the first time, or xattr -dr com.apple.quarantine TokenBurn.app.
From crates.io
No python3 or zstd binary needed β sqlite and zstd are bundled.
Using it
TUI keys
| Key | Action |
|---|---|
β/β, Tab, 1-4 |
total / hourly / daily / monthly |
t / w |
cycle tool / window (today β month β all) |
p |
per-project / per-model view |
/ |
free-text filter: all words must match (tool, project, session id); -word excludes. Enter keeps, Esc clears |
f |
per-tool checkboxes with counts β β£ toggle, a all, n none, x clear |
o |
options: auto-refresh and interval, bar chart, pie chart, pie slices |
T, [, ] |
theme picker / previous / next |
C |
currency picker (preview as you move, saved) |
β/β, j/k, g/G |
scroll |
q, Esc |
quit (Esc first clears an active filter) |
Filters apply instantly to the rows already loaded; the header shows what is active, e.g. β filter:"claude" tools:3/8 412/3,029 rows.

Web dashboard
| URL | Description |
|---|---|
/?tool=pi&bucket=daily&window=month&metric=cost |
the dashboard (every parameter optional) |
/api/report?bucket=monthly |
the same report as JSON |
/api/themes, /api/health |
theme palettes, liveness probe |
It binds to 127.0.0.1. --host 0.0.0.0 exposes it on the network β there is no authentication, and token/cost data is private, so only do that deliberately.
Live mode needs Topcoat's browser runtime. Release archives, the DMG, the Windows installer and the .deb/.rpm include it. When building yourself, just run-web bundles it (needs cargo install topcoat-cli), or run topcoat asset bundle and point TOKENBURN_WEB_ASSETS at the result. Without it, tokenburn-web still works and serves a static dashboard (form filters, links instead of clicks, reload every 10 s) β which is what cargo install tokenburn-web gives you. Search order: $TOKENBURN_WEB_ASSETS, <exe dir>/assets, <exe dir>/../share/tokenburn-web/assets, /usr/share/β¦, /usr/local/share/β¦.
Development
tokenburn (cli) βββ
tokenburn-tui βββββΌβββΆ tokenburn-core βββΆ rusqlite, zstd, serde_json, chrono
tokenburn-gui βββββ€
tokenburn-web βββββ
| Crate | |
|---|---|
tokenburn-core |
the collectors, queries, aggregation, chart data and drill-down logic, themes, settings |
tokenburn-cli |
clap args and the table renderer |
tokenburn-tui |
Ratatui: app / events / layout / features / widgets |
tokenburn-gui |
Iced: state / message / update / view / features / widgets |
tokenburn-web |
Topcoat: app / pages / api / components / charts / params / data / style |
Demo recordings
The GIFs above live in examples/vhs/generated/ and are stored with Git LFS (git lfs install once). They are generated from synthetic data (examples/vhs/fixture.sh), never from real logs:
License
MIT β see LICENSE.