Local token & cost dashboard for AI coding tools
Project description
Local token & cost dashboard for AI coding tools
Try it without installing → tokdash.github.io/demo
Performance: about 30× faster than pre-0.6.0 cold usage scans, and 15× faster than ccusage in the same local benchmark.
[!IMPORTANT] Keep your history: Claude Code and Gemini CLI delete local sessions older than ~30 days by default, so Tokdash's earlier months can silently shrink — a one-line config change per client prevents it (History retention).
Table of Contents
- Features
- Live demo
- Supported clients
- Platform support
- Quick start
- Configuration
- Privacy & security
- API (local)
- Cost Accuracy Note
- History retention
- Roadmap
- Contributing / security
- Project structure
- License
Features
- Exact token counts: Input/Output/Cache token breakdowns
- Statusline integration [new]: drop a live token-usage indicator into Claude Code's statusline (or any agent that can hit a local HTTP endpoint) — see Statusline integration
- Custom date ranges: Flatpickr date picker + quick range buttons (Today, Last 7 Days, This Month, etc.)
- Contribution calendar: 2D heatmap + 3D isometric view with Tokens/Cost/Messages metrics
- Session explorer: per-session drill-down for Codex, Claude Code, OpenCode, and Pi
- 10 style themes: Elevated, Classic, Vibrant, Midnight, Paper, Liquid, Terminal, Brutalist, Arcade, Studio
- Light & dark mode: auto-detects system preference, manual toggle
- PWA support: installable as a progressive web app
Live demo
A static demo of the current dashboard is hosted at tokdash.github.io/demo — no install required. (The project home page is tokdash.github.io.)
The demo runs the unmodified Tokdash frontend against an in-browser shim that returns deterministic, fully synthetic data. You can:
- switch between Overview / Sessions / Stats / Pricing tabs,
- pick any date range (or the Today / 7-day / 30-day shortcuts),
- toggle light/dark and all 10 style themes,
- drill into a synthetic Codex / Claude Code / OpenCode session,
- browse the read-only pricing database.
Source for the demo lives at tokdash/tokdash.github.io. Nothing is uploaded; nothing is read from your machine.
Platform support
- Linux (including WSL2): supported
- macOS: experimental
Quick start
Prerequisites
- Python 3.10+
- One or more supported clients installed
Install
Recommended isolated install:
pipx install tokdash
If you do not use pipx:
python3 -m pip install --user tokdash
First run
Run the onboarding wizard:
tokdash setup
The wizard configures a reversible user-level background service when the platform supports
one, then prints the dashboard URL (default: http://127.0.0.1:55423). If no supported
service manager is available, it records setup state and prints foreground run guidance. It
uses localhost-first defaults, does not require sudo for the local service, and keeps your
usage history unless you later uninstall with --purge.
For a non-interactive setup from an agent, script, or bundle:
tokdash setup --auto --json
To preview what setup would change:
tokdash setup --dry-run
Verify
tokdash doctor
doctor checks the runtime, background service, configured port, data paths, and update-check
status. Use tokdash doctor --json for automation.
Existing installs
If you installed Tokdash before the onboarding flow, upgrade first:
pipx upgrade tokdash
# or: python3 -m pip install --user -U tokdash
Then run tokdash doctor and tokdash setup when you want Tokdash to manage the background
service. If you already have a hand-written systemd or launchd service, setup does not
silently replace it: it refuses unmarked tokdash.service / plist files by default. Keep
managing that service yourself, remove it before setup, or run tokdash setup --force after
checking tokdash setup --dry-run. --force also handles pre-1.0 services that already
occupy port 55423 but do not expose the new /health fingerprint: it rewrites and restarts
the existing tokdash.service. Use tokdash setup --no-service to skip service creation.
Update or remove
tokdash update # upgrade the managed runtime and restart the service when possible
tokdash uninstall # reverse exactly what setup created; keeps usage history by default
update only drives install methods Tokdash can safely manage. If your runtime was installed
by a package manager Tokdash does not own, it prints the exact manual guidance instead of
mutating that environment.
Remote access
Tokdash stays loopback-bound by default. For remote access, prefer:
- interactive
tokdash setup, which can offer an explicit Tailscale Serve step when available, - SSH forwarding:
ssh -L 55423:127.0.0.1:55423 <user>@<host>.
Some Tailscale installs require operator permission before a non-root user can configure Serve.
If Tailscale denies the Serve config, the interactive wizard can offer the one-time
sudo tailscale set --operator=$USER step and then retry tailscale serve. Tokdash uses
the /tokdash path on your tailnet host, so it does not claim the domain root if you already
serve other tools there. After Serve succeeds, setup prints the exact
https://...ts.net/tokdash URL to open from your tailnet.
Tailscale Serve is read-only for mutating dashboard/API actions because proxied requests fail Tokdash's loopback write gate. Use SSH forwarding when you need trusted remote writes.
Binding Tokdash directly to 0.0.0.0 is possible but not recommended because the local API is
not an internet-facing authenticated service.
Foreground fallback
If you only want a one-off foreground process:
tokdash serve
Open http://127.0.0.1:55423. Use tokdash serve --port <port> if the default port is busy.
For full onboarding details, including runtime choices, WSL/systemd behavior, macOS launchd,
Tailscale, bundling, update checks, and safe uninstall semantics, see
docs/ONBOARDING.md.
OpenClaw digest (scheduled reports)
Tokdash can power daily/weekly/monthly OpenClaw usage reports by querying the local API on a schedule.
For Humans
Copy and paste this prompt to your LLM agent (Claude Code, AmpCode, Cursor, etc.):
Install and configure scheduled Tokdash usage reports for OpenClaw by following the instructions here:
https://raw.githubusercontent.com/JingbiaoMei/Tokdash/main/docs/agents/openclaw_reporting/AGENTS.md
Or read the guide yourself, but seriously, let an agent do it.
For LLM Agents
Fetch the installation guide and follow it:
curl -s https://raw.githubusercontent.com/JingbiaoMei/Tokdash/main/docs/agents/openclaw_reporting/AGENTS.md
Statusline integration
The local API can power a statusline item in your coding agent (Claude Code, etc.) showing live token/cost stats. Hand your agent this prompt:
"I would like to add a statusline item from the tokdash endpoint's API; it should show the total tokens used today."
Point it at docs/API.md for endpoint details and let it wire the rest.
Configuration
Tokdash is localhost-only by default.
TOKDASH_HOST(default:127.0.0.1)TOKDASH_PORT(default:55423)TOKDASH_CACHE_TTL(default:600seconds)TOKDASH_COMPUTE_CONCURRENCY(default:2) — cap on simultaneous heavy history reparses; excess cold requests return a fast503instead of saturating the server under loadTOKDASH_LIMIT_CONCURRENCY(default:64) — uvicorn connection cap (backpressure)TOKDASH_KEEPALIVE(default:5seconds) — uvicorn keep-alive timeoutTOKDASH_ALLOW_ORIGINS(comma-separated, default: empty)TOKDASH_ALLOW_ORIGIN_REGEX(default allows only localhost/127.0.0.1)TOKDASH_NO_RETENTION_NOTICE(set to1to silence the history-retention reminder printed ontokdash serve)
Persistent usage DB (default on):
Tokdash maintains a local SQLite index at ~/.tokdash/usage.sqlite3 by default. It stores parsed token rows and Codex/Claude session summaries so repeated dashboard and API reads can use indexed SQL instead of reparsing every source log. Source logs remain the source of truth; the DB is a local performance index, and Tokdash falls back to live parsing if it is disabled or unavailable.
TOKDASH_USAGE_DB(default:1) — set to0,false,no, oroffto disable the persistent usage DBTOKDASH_DATA_DIR(default:~/.tokdash) — base directory for Tokdash local stateTOKDASH_USAGE_DB_PATH(default:$TOKDASH_DATA_DIR/usage.sqlite3) — explicit SQLite file pathTOKDASH_USAGE_DB_DURABLE(default:1) — keep already indexed rows if a source file temporarily disappears or a parser returns no rows; set to0for strict source replacementTOKDASH_USAGE_DB_WATCH(default:0) — set to1to run a background sync loop insidetokdash serveTOKDASH_USAGE_DB_WATCH_INTERVAL(default:30seconds) — sync interval fortokdash db watchand the serve-time watch loop
DB maintenance commands:
tokdash db status --pretty
tokdash db sync --pretty
tokdash db verify --verify-period today --pretty
tokdash db repair --dry-run --pretty
tokdash db resync --pretty
tokdash db watch --pretty
Remote access through Tailscale Serve:
tokdash setup
# When the wizard offers Tailscale Serve, confirm it.
# Setup prints the exact https://...ts.net/tokdash URL after Serve succeeds.
If you manage Tailscale yourself after setup has started Tokdash on the default port:
tailscale serve --bg --https=443 --set-path=/tokdash http://127.0.0.1:55423
Open https://<machine>.<tailnet>.ts.net/tokdash. Stop that manual Serve rule with
tailscale serve --https=443 --set-path=/tokdash off. tokdash uninstall only reverts
Tailscale Serve rules that the setup wizard created and recorded. Tailscale Serve remains
read-only for mutating dashboard/API actions; use SSH forwarding when you need trusted remote
writes.
By default tokdash serve opens the dashboard in your browser once on startup. Pass --no-open to disable this (it is also skipped automatically in headless/SSH environments and in the background service templates).
Privacy & security
- No telemetry: Tokdash does not intentionally send your data anywhere.
- Local parsing: usage is computed from local session files (see supported clients).
- Server exposure: Tokdash binds to
127.0.0.1by default. Prefer Tailscale Serve or SSH tunneling for remote access; avoid--bind 0.0.0.0unless you understand it listens on all interfaces and have firewall/auth in place. Tailscale Serve is read-only for write endpoints by design because proxied requests fail Tokdash's loopback write gate; use SSH forwarding when you need authenticated remote writes.
API (local)
Tokdash is a local HTTP server. Common endpoints:
GET /api/usage?period=today|week|month|NGET /api/usage?date_from=YYYY-MM-DD&date_to=YYYY-MM-DDGET /api/tools?period=...(coding tools only)GET /api/openclaw?period=...(OpenClaw only)GET /api/sessions?tool=codex|claude|opencode|pi_agent&period=...(append&include_review_sessions=trueto include Codex review/permission sessions, hidden by default)GET /api/stats(contribution calendar & statistics)
Example:
curl 'http://127.0.0.1:55423/api/usage?period=today'
Full API reference: docs/API.md — schema, parameters, and response shapes for every endpoint.
Cost Accuracy Note
Token counts depend on what each client logs locally. Costs are computed from the bundled pricing database (src/tokdash/pricing_db.json) by default, or from your saved dashboard pricing override at <data_dir>/pricing_db.json when present (the Pricing tab writes there and it fully replaces the bundled rates). Either way they may lag real provider pricing — use as an estimate and verify against your billing source if it matters.
History retention
Tokdash reads each client's local session logs and also keeps a local SQLite performance index. The index can keep rows Tokdash has already seen, but it cannot recover logs that were deleted before they were indexed, and it is not a replacement for keeping the original client history. If a client deletes old logs before Tokdash syncs them, a past month can still read lower than when you first recorded it. Only two supported clients do this by default, and both are a one-line fix:
- Claude Code deletes sessions older than
cleanupPeriodDays(default 30 days) at startup. Add this to your existing~/.claude/settings.json(and any alternateCLAUDE_CONFIG_DIR):{ "cleanupPeriodDays": 3650 }
- Gemini CLI deletes sessions older than 30 days. Disable it in
~/.gemini/settings.json; if a project has.gemini/settings.json, make the same change there because workspace settings override user settings:{ "general": { "sessionRetention": { "enabled": false } } }
Every other supported client keeps history indefinitely by default. For the full per-client survey, fix details, and what the local SQLite index does and does not preserve, see docs/HISTORY_RETENTION.md.
Roadmap
See docs/ROADMAP.md.
Contributing / security
- Contributing guide:
docs/CONTRIBUTING.md - Security policy:
docs/SECURITY.md
Project structure
tokdash/
├── main.py # Source entrypoint (python3 main.py)
├── tokdash # Source CLI wrapper (./tokdash serve)
├── src/
│ └── tokdash/
│ ├── cli.py
│ ├── api.py # FastAPI routes/app
│ ├── compute.py # Aggregation/merging logic
│ ├── dateutil.py # Shared date-range parsing
│ ├── sessions.py # Session explorer logic
│ ├── pricing.py # PricingDatabase wrapper
│ ├── assets.py # Static asset management
│ ├── model_normalization.py
│ ├── pricing_db.json
│ ├── sources/
│ │ ├── openclaw.py # OpenClaw session log parser
│ │ └── coding_tools.py # Local coding tools parsers
│ └── static/
│ ├── index.html # Single-page dashboard
│ ├── theme-config.js # Theme palettes & heatmap colors
│ └── themes.css # Per-theme CSS overrides
└── docs/ # Onboarding guide, API docs, release notes, and agent prompts
License
MIT License - see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tokdash-1.0.1.tar.gz.
File metadata
- Download URL: tokdash-1.0.1.tar.gz
- Upload date:
- Size: 467.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0340718b04651422af5bf3d60985ecebdfccf0b0e1b7a280ff7d402a74620f36
|
|
| MD5 |
dc4e4f1b448e12f7fa4df2fffcf3f011
|
|
| BLAKE2b-256 |
0927009608577bf6010f109643a9db43fa15a359084ee1c0c077cc6e66acf2e8
|
Provenance
The following attestation bundles were made for tokdash-1.0.1.tar.gz:
Publisher:
publish-pypi.yml on JingbiaoMei/Tokdash
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tokdash-1.0.1.tar.gz -
Subject digest:
0340718b04651422af5bf3d60985ecebdfccf0b0e1b7a280ff7d402a74620f36 - Sigstore transparency entry: 1900248741
- Sigstore integration time:
-
Permalink:
JingbiaoMei/Tokdash@dde04e5b79f80dfbff5b5f0e073dc8163dfcf0d3 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/JingbiaoMei
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@dde04e5b79f80dfbff5b5f0e073dc8163dfcf0d3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file tokdash-1.0.1-py3-none-any.whl.
File metadata
- Download URL: tokdash-1.0.1-py3-none-any.whl
- Upload date:
- Size: 421.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4313467c92d5ea443c4ef9876acf052d0f4da6ab346be418fbf72239dd1cf40d
|
|
| MD5 |
783afedb92233794f1481a23c4ad2689
|
|
| BLAKE2b-256 |
a358f0ab25c4cde146b0e6c964add746a6d7cda0c3d67865e2522b9e86939f78
|
Provenance
The following attestation bundles were made for tokdash-1.0.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on JingbiaoMei/Tokdash
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tokdash-1.0.1-py3-none-any.whl -
Subject digest:
4313467c92d5ea443c4ef9876acf052d0f4da6ab346be418fbf72239dd1cf40d - Sigstore transparency entry: 1900248820
- Sigstore integration time:
-
Permalink:
JingbiaoMei/Tokdash@dde04e5b79f80dfbff5b5f0e073dc8163dfcf0d3 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/JingbiaoMei
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@dde04e5b79f80dfbff5b5f0e073dc8163dfcf0d3 -
Trigger Event:
push
-
Statement type: