About Maciej Blog

Harness Dashboard: token usage across every coding agent

October 16, 2026

Hello there!


In September I wrote about a usage dashboard for Oh My Pi, and in October it moved into Claude Code as a native pane. That tool answers one question well: what is this session using right now? It does not answer the question that came after it. Across all the agents I use in a week, where do the tokens and the money actually go?


Harness Dashboard is my answer to that one. It is a desktop app that reads the session logs your coding agents already write to disk, keeps them in a local SQLite database, and turns them into interactive charts. The quickest way to see it is the one-minute video tour in the README: where the tokens go, one prompt in full, trimming an expensive skill, and the settings. It was made with demo data, and there is also a full-quality download (21 MB, with sound).


One app, many harnesses

The dashboard reads Claude Code, Codex, Gemini CLI, GitHub Copilot CLI, OpenCode, pi, omp, Zed, and the Cline, Roo Code and Kilo Code extensions straight from the files and databases they keep. Cursor keeps its usage on its servers, so it comes either from an opt-in sync with cursor.com or from its CSV export. Agents on other machines, such as Claude Code with its own telemetry or Hermes Agent, can send their usage over OTLP to a receiving port that is off by default.


Ingestion is incremental. Each scan reads only the bytes appended since the last one, so a rescan is quick, and the running app does it every 30 seconds. Support is not equally deep everywhere, and the README is specific about it. Zed keeps one running total per thread, so a thread counts as a single row. Copilot CLI’s session database is undocumented, so reading it is best effort and was tested with made-up data only.


Where the tokens go

The Overview shows tokens, API-equivalent cost, sessions, prompts and cache hit rate against the previous period. From there, every dimension is also a filter: project, user, model, provider, skill, agent, session and prompt. A flow chart follows the money from tool to model to project, and each breakdown page draws a network of what used what.


The part I find most useful is the prompt level. Each human prompt starts a turn, and every model call until the next prompt is attributed to it, including the subagents it spawned. That makes it possible to open one request and see what it really consumed, call by call. Skills work the same way: from the moment a skill is invoked until the next prompt, the calls count toward that skill, which is how the video ends up trimming an expensive one.


Work can also be measured by its result. Branches shows what each git branch cost, with the lines the agents’ edits changed and the commits and pull requests they made, all read from the agents’ own logs without running git. Edits made by hand or by shell commands are not counted, so the cost per 100 changed lines covers agent edits only.


There is more than I can fit in one post: trends with a 30-day projection, chart notes to compare the days before and after a change, cache savings, compactions, what-if pricing on another model, failed and declined tool calls, and a model drift page that flags when a model got slower or more error-prone than it usually is.


How honest are the numbers?

The cost is an API-equivalent list price: what the tokens would have cost on the provider’s API. Subscription plans such as Claude Max or ChatGPT Pro do not bill that way, so it is a comparison, not your invoice. Where a tool reports its own cost, as Cursor, Cline, Roo Code and Kilo Code do, that cost is used instead. Models without a known price are marked estimated until you add a price in the settings.


The built-in prices ship with the app, which never fetches them itself. A weekly GitHub Action checks the makers’ own pricing pages first and falls back to LiteLLM and OpenRouter only where no official price exists, then opens a pull request that is reviewed before it is merged.


Limits, budgets and agents asking for themselves

The Live view shows tokens per minute, the sessions running now, and how much of each plan limit is left: Claude’s 5-hour and weekly limits, Codex, Copilot premium requests, and whatever omp, OpenCode or pi are logged in to. Logins are only read, never renewed, so an expired one is reported rather than refreshed behind your back.


Daily, monthly and per-project budgets send desktop notifications at 80% and 100%, also with the window closed, because the app keeps running from the tray. For agents, harness-dashboard mcp is a read-only MCP server, so an agent in Claude Code, Codex, Cursor, Zed or OpenCode can check what a session or branch cost, or how much of a limit is left, before a large refactor. Claude Code also gets a one-line status line with the session cost, today’s cost and the 5-hour limit.


Local by default

The database stays on your machine, or in a folder you choose. A shared folder on iCloud Drive, Dropbox, OneDrive or a network share lets several machines write into one file, deduplicated so nothing is counted twice. The app only listens on 127.0.0.1, and its API answers only through a sign-in link or a local token. Prompt text is stored truncated to 2,000 characters with secrets redacted, and you can set that length to zero to keep none at all.


Outbound requests are limited to the optional update check, the plan-limit checks, and the Cursor sync once you turn it on. Optional AI session labels run your own claude or codex with your own login. Your usage itself is never uploaded.


Give it a try

On macOS and Linux, run this in your terminal:

curl -fsSL https://raw.githubusercontent.com/MSpiechowicz/harness-useful-dashboard/main/install.sh | sh

On Windows, use PowerShell:

powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/MSpiechowicz/harness-useful-dashboard/main/install.ps1 | iex"

The installer checks every download against the release checksums. The releases page also has .deb, .rpm, .dmg and .msi packages and plain command line binaries. The app is not code-signed, so macOS and Windows warn on the first start of a manual download. Once installed, it checks for updates and offers to install them from a banner in the sidebar. The UI is available in English, German, Spanish, French and Polish.


The project is available under the GPL-3.0 license and sits next to Harness Useful Skills and the sidebar in the same small family of local tools. If you try it, I would like to hear which harness you use and whether its numbers look right to you. Issues and contributions are welcome on GitHub.


That is all for now. Stay healthy and keep coding!


Greetings,

Maciej

Go back

Welcome to MaciejOS