BURNLENSDashboard

burnlens scan · no API key · no signup

See what your AI coding agents actually cost

Claude Code, Cursor, Codex, Gemini CLI — local logs, one command, no proxy required

The problem

You opened Cursor on Monday. You ran Claude Code on Tuesday. You let Codex churn through a refactor on Wednesday. By Friday you have no idea how much you spent, which project ate the budget, or which session was the runaway. The provider bill says claude-sonnet: $214— it doesn't say which of your repos burned it.

What burnlens scan does

Reads the local session logs your coding agents already write to disk, deduplicates the turns, routes each call through the BurnLens pricing engine, and stores the results in a local SQLite database. No proxy, no code changes, no signup. Run it once and see retroactive cost history for every session on your machine.

$ burnlens scan
Scanning Claude Code sessions...
Found 141 session files across 5 projects.
Parsed 37,377 assistant messages.
Total Claude cost imported: $5,578.30

          Top projects by cost
┏━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓
┃ Project       ┃      Cost ┃ Messages ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩
│ payments-api  │ $2,636.62 │   16,405 │
│ burnlens      │ $1,063.03 │    7,916 │
│ web-console   │   $962.94 │    6,658 │
│ infra-tooling │   $736.59 │    4,947 │
│ docs-site     │   $179.12 │    1,451 │
└──────────────┴──────────┴─────────┘

No Cursor DB found at ~/Library/Application Support/Cursor/... Skipping Cursor scan.
No Codex sessions found at ~/.codex/sessions. Skipping Codex scan.
No Gemini CLI sessions found at any known location. Skipping.

Real output from one developer's laptop, on a clean install with no config file. Repo names replaced; every number is what the scan actually printed.

What it scans

AgentSourceWhat you get
Claude Code~/.claude/projects/Parses JSONL session files. Deduplicates repeated message.id entries. Attributes cost per session and per project directory.
CursorCursor's local bubble databaseReads Cursor's local SQLite store. Routes each turn through the cost engine by provider + model.
OpenAI Codex~/.codex/sessions JSONLHandles the event_msg wrapper and turn_context model fields. Tested against 700+ sessions / 88K events.
Gemini CLI~/.gemini/tmp/<project>/chats/Supports both JSON and JSONL chat formats. Imports session count, turns, and model usage.

Try it in three commands

pip install burnlens
burnlens scan
burnlens repos    # which repo actually burned the money

No env vars to set, no proxy to start, no account to create. The scan reads files and writes to a local database and does not need an API key. Local log scanning makes no network request; if you use automatic merged-PR outcome derivation, BurnLens can call the GitHub CLI (gh) when it is installed and authenticated.

Then ask it the questions the provider bill cannot answer:

  • burnlens repos — top repos by cost, with request counts and last-seen.
  • burnlens report --days 30 — spend by model over a window, plus waste alerts.
  • burnlens analyze — the waste detectors, with a dollar figure per finding.
  • burnlens economics — waste rate, error spend, and cost per outcome.

Need team-wide economics across developers? After a local scan: burnlens cloud connect then burnlens sync --now. Prompt bodies stay on the laptop.

How long the first scan takes depends on how much history you have. A light history finishes in seconds. The 141-session, 37,377-message machine above took a few minutes on its first run. Re-runs are idempotent and only pick up what is new.

Privacy

Everything stays on your machine. burnlens scan reads local files and writes to a local SQLite database at ~/.burnlens/burnlens.db. No prompts, no code, no session content ever leaves your machine. If you enable cloud sync later for team dashboards, only selected pseudonymous cost metadata and costs are uploaded — never prompt or response bodies.

FAQ

What if a model isn't priced yet? The session is still imported as $ unknown — not a measured $0.00 — and the model name is recorded so you can spot the gap. Adding a missing model is a one-line edit in burnlens/cost/pricing_data/*.json.

Does scanning interfere with the agent?No. burnlens scan only reads. It never writes to the agent's own log directories or databases.

Can I scan from CI? Yes — burnlens scan is idempotent. Re-running it picks up new sessions since the last scan. A scheduled job + cloud sync gives you a team-wide view of coding-agent spend across every developer.

What about Cline, Windsurf, Aider? Not yet — they're tracked in GitHub issues. Each new reader is one file in burnlens/scan/ plus a pricing entry; PRs welcome.

Get started

Start the free trial · Star on GitHub · Back to homepage