Spend
Cost by day, by model, by project — and cost filtered by a search query, which is the one no dashboard can do. Prompt-caching gets its own card, because cache reads and cache writes are priced very differently from fresh input and are usually where the money actually goes.Always an estimate
Turnlog computes cost from the token counts in your own logs against a shipped price table covering Anthropic and OpenAI rates. It is labelled an estimate everywhere, because it is one: it is not your bill. Cursor IDE sessions are the exception — they use the cost Cursor itself recorded. Rates wrong for you — Bedrock, Vertex, an enterprise agreement, or plain disagreement? Override any model withmodelPricing.
Two ways naive counting gets this wrong
Both are worth knowing, because they are why a hand-rolled script disagrees with Turnlog. Usage repeats per line, not per response. Claude Code writes one JSONL line per content block, and every one of those lines repeats the samemessage.id and the same
usage object. Summing per line inflates cost by roughly 2.7×. Turnlog counts usage
once per response.
Resuming copies the whole history forward. A resumed session’s file contains
everything from the previous one, so counting per file bills the same conversation
repeatedly. Turnlog dedupes across a resume chain: the first occurrence of a message
wins.