Skip to main content

Local token & cost dashboard for AI coding tools

Project description

English  |  中文

Tokdash

Local token & cost dashboard for AI coding tools

OpenCode Codex Claude Code Gemini CLI Antigravity OpenClaw Kimi CLI Pi GitHub Copilot CLI Hermes

FastAPI Python License Website Live Demo

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

  • 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
  • Contribution calendar: 2D heatmap + 3D isometric view with Tokens/Cost/Messages metrics
  • Session explorer: per-session drill-down
  • Quota tab [new]: subscription window bars with reset countdowns for Codex, Claude Code, and Antigravity. Codex windows work out of the box from local logs; Codex reset credits, metered features, and all Claude/Antigravity quota need opt-in live polling
  • Themes and app polish: 10 style themes, light/dark mode, and PWA install support

Overview
Tokdash overview dashboard - click for live demo

Sessions
Tokdash sessions view - click for live demo

Monthly usage heatmap
Tokdash monthly usage heatmap - click for live demo

Yearly usage heatmap
Tokdash yearly usage heatmap - click for live demo

Quota tracking
Tokdash quota tracking - click for live demo

Codex quota and reset credits
Tokdash Codex quota and reset credits - click for live demo

Quick start

Platform support

  • Linux (including WSL2): supported
  • macOS: supported
  • Windows (native): experimental

Prerequisites

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.

To expose the dashboard explicitly on all network interfaces with writes disabled, run tokdash setup --bind 0.0.0.0; review the remote-access guide first.

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.

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. For managed runtimes, update reports the Tokdash version before and after the upgrade; if the version is unchanged, it says Tokdash is already at that version instead of implying a new package was installed.

Existing installs: migration from before v1.0

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.

If your current setup uses a conda/system/user-pip interpreter and you want tokdash update to manage future upgrades, migrate the service to Tokdash's setup-owned venv:

# Upgrade the tokdash command you are about to run, for example:
python3 -m pip install --user -U tokdash
# or, for a conda base install:
conda run -n base python -m pip install -U tokdash
tokdash setup --runtime venv --force
tokdash doctor

This keeps your usage history under ~/.tokdash, rewrites the user service to run ~/.tokdash/runtime/python-venv/bin/python -m tokdash, and lets future tokdash update upgrade that managed venv and restart the service. If you installed with pipx, you can instead keep the pipx runtime and upgrade with tokdash update or pipx upgrade tokdash.

Remote access

Tokdash stays loopback-bound by default. Interactive tokdash setup can configure Tailscale Serve after explicit confirmation, providing private HTTPS read access from Windows or another tailnet device. Use SSH forwarding when you need authenticated write access. An explicit --bind 0.0.0.0 provides read-only network access but exposes the unauthenticated dashboard on every reachable interface.

See docs/guides/REMOTE_ACCESS.md for setup commands, WSL2 guidance, access URLs, write behavior, and security trade-offs.

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/guides/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/guides/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/guides/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.

Ready-made templates live in docs/guides/statusline/ — copy one into ~/.claude/scripts/ and add the statusLine block to ~/.claude/settings.json:

  • statusline-minimal.sh → one line: [Claude Sonnet 4.6] 📁 myproject | 📊 12.3M ($4.56) today
  • statusline-full.sh → a four-row dashboard with today + week totals and a top-3 per-tool breakdown
  • statusline.ps1 → the same one-line output as the minimal template, for Claude Code running natively on Windows (PowerShell, no curl/jq needed)

All are read-only, localhost-only, and fail silently if Tokdash isn't running. See the folder README for install/config and docs/reference/API.md for the endpoint reference.

Prefer to roll your own? Hand your agent this prompt and point it at docs/reference/API.md:

"I would like to add a statusline item from the tokdash endpoint's API; it should show the total tokens used today."

Tokdash statusline integration example

Configuration

Tokdash is localhost-only by default.

  • TOKDASH_HOST (default: 127.0.0.1)
  • TOKDASH_PORT (default: 55423)
  • TOKDASH_CACHE_TTL (default: 600 seconds)
  • TOKDASH_COMPUTE_CONCURRENCY (default: 2) — cap on simultaneous heavy history reparses; excess cold requests return a fast 503 instead of saturating the server under load
  • TOKDASH_LIMIT_CONCURRENCY (default: 64) — uvicorn connection cap (backpressure)
  • TOKDASH_KEEPALIVE (default: 5 seconds) — uvicorn keep-alive timeout
  • TOKDASH_ALLOW_ORIGINS (comma-separated, default: empty)
  • TOKDASH_ALLOW_ORIGIN_REGEX (default allows only localhost/127.0.0.1)
  • TOKDASH_NO_RETENTION_NOTICE (set to 1 to silence the history-retention reminder printed on tokdash 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 to 0, false, no, or off to disable the persistent usage DB
  • TOKDASH_DATA_DIR (default: ~/.tokdash) — base directory for Tokdash local state
  • TOKDASH_USAGE_DB_PATH (default: $TOKDASH_DATA_DIR/usage.sqlite3) — explicit SQLite file path
  • TOKDASH_USAGE_DB_DURABLE (default: 1) — keep already indexed rows if a source file temporarily disappears or a parser returns no rows; set to 0 for strict source replacement
  • TOKDASH_USAGE_DB_WATCH (default: 0) — set to 1 to run a background sync loop inside tokdash serve
  • TOKDASH_USAGE_DB_WATCH_INTERVAL (default: 30 seconds) — sync interval for tokdash db watch and 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

For remote access through Tailscale Serve, SSH forwarding, or an explicit network bind, see docs/guides/REMOTE_ACCESS.md. Interactive tokdash setup can configure and record the Tailscale Serve rule after you opt in.

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).
  • Optional quota polling: the Quota tab is local-only by default. Per-provider API polling can be enabled from the tab or with tokdash quota consent; it uses your local CLI credentials only to call that provider's own quota endpoint, and stores responses in the local usage SQLite DB.
  • Server exposure: Tokdash binds to 127.0.0.1 by default. Tailscale Serve provides private read-only access, SSH forwarding provides authenticated write access, and --bind 0.0.0.0 explicitly exposes unauthenticated reads on every interface. See the remote-access guide.

Quota tracking (optional)

The Quota tab shows subscription utilization windows and reset timers, from two data sources. Local logs (no network): Codex records its own quota in session files, so the Codex 5-hour/weekly windows work out of the box — but they update only when you use Codex, and the logs never contain reset credits or metered-feature windows. Treat session-log Codex consumption as an estimate that can be materially wrong: each session caches its quota snapshot at its last fetch and replays it unchanged on every later message, so the numbers can be stale, and reset-boundary noise can occasionally distort a window further — the Quota tab labels these charts as estimated. Live polling (off by default, per-provider consent): Tokdash calls the provider's own quota endpoint with the sign-in your CLI already has. It is fresher, adds Codex reset credits and metered features, is required for accurate Codex consumption, and is the only quota source for Claude Code, Antigravity, MiniMax, Kimi Code, and SuperGrok/Grok Build:

tokdash quota consent --codex-api on --claude-api on --antigravity-api on
tokdash quota consent --minimax-api on --kimi-api on --grok-api on
tokdash quota consent --credential-scan on   # allow the disclosed local credential readers
tokdash quota consent --poll-interval 30      # background poll cadence: 15, 30, 60 or 120 min
tokdash quota consent --enabled off           # master switch: turn ALL quota tracking off
tokdash quota poll
tokdash quota show

Master switch. quota.enabled (default on) turns all quota work on or off — session scanning, network polling, and snapshot writes. Toggle it from the Quota tab or with tokdash quota consent --enabled on|off. When it is off (or the TOKDASH_QUOTA_POLL=0 kill switch is set), the background poller idles completely, GET /api/quota/refresh returns a "quota tracking disabled" error, and the tab shows an enable quota tracking card instead of data. Per-provider consent keys keep their narrower network-only meaning.

Poll interval. The background poller snapshots every 30 minutes by default. Choose 15/30/60/120 minutes from the Quota tab, during tokdash setup, or with tokdash quota consent --poll-interval N; it is saved as quota.poll_interval_minutes in config.json. The TOKDASH_QUOTA_POLL_INTERVAL env var (seconds, floor 300) overrides the saved value, and the tab shows which source is active. Interval changes apply on the next poll cycle without restarting the server. Codex session ingestion is incremental — after a one-time backfill of your history, each cycle only tail-reads session files that grew, so a steady-state poll costs single-digit milliseconds.

For fixed-reset quota windows, the poller also samples near the reset boundary so history captures the pre-reset high and post-reset baseline. Boundary sampling is enabled by default, calls only the provider whose window triggered it, coalesces nearby provider boundaries, and keeps at least 300 seconds between daemon poll cycles. Set TOKDASH_QUOTA_BOUNDARY_POLL=0 to disable it, TOKDASH_QUOTA_BOUNDARY_POST=0 to disable only post-reset samples, or adjust the default 120-second leads with TOKDASH_QUOTA_BOUNDARY_PRE_SECONDS and TOKDASH_QUOTA_BOUNDARY_POST_SECONDS.

Live polling requires two separate decisions: quota.credential_scan permits read-only access to the disclosed local credential stores, then each <provider>_api key permits that provider's network request. Tokdash reads native CLI auth/config files, OpenCode's auth.json plus global provider config, active Claude settings, and CC Switch's providers table through a read-only SQLite connection. It never scans provider logs, shell profiles, or arbitrary {file:...} references. MiniMax accepts an mmx sign-in or Token Plan Subscription Key (MINIMAX_TOKEN_PLAN_GLOBAL_KEY / MINIMAX_TOKEN_PLAN_CN_KEY); a normal pay-as-you-go key is not guaranteed to have Token Plan quota. Kimi accepts a Kimi Code sign-in/key (KIMI_API_KEY), not a Moonshot Open Platform pay-as-you-go key. SuperGrok/Grok Build quota requires the xAI OAuth sign-in in $GROK_HOME/auth.json; a normal xAI API key cannot access consumer billing. On macOS, Claude Code may require a one-time read-only Keychain approval. Tokdash never refreshes or writes provider credentials. TOKDASH_QUOTA_POLL=0 is a hard kill switch for all quota tracking. tokdash export excludes quota data by default; use --include-quota only when you intentionally want it in the JSON.

Grok Build token usage is also parsed locally from $GROK_HOME/logs/unified.jsonl. Its inference records expose prompt, cached-prompt, completion, and reasoning tokens; Tokdash attributes them using the model events from the same CLI process and calculates cost from the normal pricing database. Records without a model event are skipped rather than assigned a guessed price.

tokdash setup offers an optional quota step (per-provider network consent, default No, plus the poll interval), and tokdash doctor reports the quota state: master switch, per-provider consent, kill switch, effective interval and its source, last poll time, and the stored snapshot count.

Quota snapshots and their history live in the local usage database (usage.sqlite3, enabled by default) and are kept indefinitely by default — set TOKDASH_QUOTA_RETENTION_DAYS to a positive number of days to prune older snapshots. If you opt out of local persistence with TOKDASH_USAGE_DB=0, the Quota tab loses its main data path: no snapshot history is kept, the background poller does not run, and the tab only shows in-memory results from a manual Refresh (network providers with consent) for the lifetime of the current server process. Keep the usage DB enabled (the default) for normal quota tracking.

API (local)

Tokdash is a local HTTP server. Common endpoints:

  • GET /api/usage?period=today|week|month|N
  • GET /api/usage?date_from=YYYY-MM-DD&date_to=YYYY-MM-DD
  • GET /api/tools?period=... (coding tools only)
  • GET /api/openclaw?period=... (OpenClaw only)
  • GET /api/sessions?tool=codex|claude|opencode|pi_agent|mimo&period=... (append &include_review_sessions=true to include Codex review/permission sessions, hidden by default)
  • GET /api/quota and GET /api/quota/history (subscription quota snapshots; network refresh is write-gated and opt-in)
  • GET /api/stats (contribution calendar & statistics)

Example:

curl 'http://127.0.0.1:55423/api/usage?period=today'

Full API reference: docs/reference/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 alternate CLAUDE_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/reference/HISTORY_RETENTION.md.

Roadmap

See docs/development/ROADMAP.md.

Contributing / security

  • Contributing guide: docs/CONTRIBUTING.md
  • Security policy: docs/SECURITY.md

Documentation

Full documentation lives in docs/ (start at the index), grouped into:

  • guides/ — task-oriented setup: onboarding, remote access, statusline, background service.
  • reference/ — lookup material: API reference, supported clients, history retention.
  • development/ — changelog, releasing, roadmap, and internals/ design notes.

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/                   # Documentation — see docs/README.md for the index
    ├── guides/             # Onboarding, remote access, statusline, background service
    ├── reference/          # API reference, supported clients, history retention
    └── development/        # Changelog, releasing, roadmap, internals/ design notes

License

MIT License - see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tokdash-1.4.2.tar.gz (624.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tokdash-1.4.2-py3-none-any.whl (529.3 kB view details)

Uploaded Python 3

File details

Details for the file tokdash-1.4.2.tar.gz.

File metadata

  • Download URL: tokdash-1.4.2.tar.gz
  • Upload date:
  • Size: 624.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for tokdash-1.4.2.tar.gz
Algorithm Hash digest
SHA256 e7a2826b448fb44dbb26ab11f8736eeece4d2292cdc083ed82d531aef066ee4f
MD5 8aed500a55cc095cf400b265413ab746
BLAKE2b-256 1869b4c76987b7757da50e52dea203b4b697ea274536308fd23c7fa3e0498b2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for tokdash-1.4.2.tar.gz:

Publisher: publish-pypi.yml on JingbiaoMei/Tokdash

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tokdash-1.4.2-py3-none-any.whl.

File metadata

  • Download URL: tokdash-1.4.2-py3-none-any.whl
  • Upload date:
  • Size: 529.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for tokdash-1.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 26c5a3bffaf9dc3915fdd31b66b89e238725c7d2c3779c7966aabacc6d54cfe1
MD5 da84e058ddca67f1e8c4a7b5b3fde9aa
BLAKE2b-256 32f5368f8f2923cfc384fe69dadc37ad51a792f500f547bf769ead1e643a2017

See more details on using hashes here.

Provenance

The following attestation bundles were made for tokdash-1.4.2-py3-none-any.whl:

Publisher: publish-pypi.yml on JingbiaoMei/Tokdash

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page