hermes atlas
243·repos hermes·v0.20.6 ★ star this repo

junhoyeo/tokscale

🛰️ Track token usage across AI coding agents from your terminal. 🏅 Global leaderboard with trillions of tokens tracked.

★ 5.2K langRust licenseMIT updated2026-08-27

Tokscale is a CLI tool and visualization dashboard designed to track token consumption and costs for various AI coding agents. It monitors usage by reading local data files and session logs from supported clients like Claude Code, GitHub Copilot CLI, and Cursor IDE.

  • Tracks token usage and costs across multiple AI coding agents.
  • Provides a CLI interface and a 3D visualization dashboard.
  • Supports data submission to a public leaderboard and profile.
full readme from github

Tokscale

A high-performance CLI tool and visualization dashboard for tracking token usage and costs across multiple AI coding agents.

[!TIP]

I drop new open-source work every week. Don't miss the next one.

GitHub Follow Follow @junhoyeo on GitHub for more projects. Hacking on AI, infra, and everything in between.
Discord link Come hang out in our Discord — and surround yourself with the world's top-tier vibers.
Sponsor Tokscale Support Tokscale's continued development through GitHub Sponsors.

GitHub Release npm Version npm Downloads GitHub Contributors GitHub Forks GitHub Stars GitHub Issues License Coverage

🇺🇸 English | 🇰🇷 한국어 | 🇯🇵 日本語 | 🇨🇳 简体中文

Overview Models
TUI Overview TUI Models
Daily Summary Stats
TUI Daily Summary TUI Stats
Frontend (3D Contributions Graph) Wrapped 2025
Frontend (3D Contributions Graph) Wrapped 2025

Run bunx tokscale@latest submit to submit your usage data to the leaderboard and create your public profile!

Overview

Tokscale helps you monitor and analyze your token consumption from:

Logo Client Data Location
OpenCode OpenCode ~/.local/share/opencode/opencode.db (1.2+, all channels including opencode-stable.db) or/and ~/.local/share/opencode/storage/message/ (legacy/unmigrated)
Claude Claude Code ~/.claude/projects/ and ~/.claude/transcripts/
OpenClaw OpenClaw ~/.openclaw/agents/ (+ legacy: .clawdbot, .moltbot, .moldbot)
Codex Codex CLI ~/.codex/sessions/
Prime Agent Prime Agent ~/.prime/agent/sessions/ and ~/.prime/agent/session-artifacts/ (RLM child sessions)
Sakana Fugu Sakana Fugu via Codex — ~/.codex/sessions/*.jsonl (model_provider: sakana)
Copilot GitHub Copilot CLI ~/.copilot/otel/*.jsonl (+ COPILOT_OTEL_FILE_EXPORTER_PATH)
Hermes Agent Hermes Agent $HERMES_HOME/state.db and $HERMES_HOME/profiles/*/state.db (fallback: ~/.hermes/...)
Gemini Gemini CLI $GEMINI_CLI_HOME/tmp/*/chats/*.json (fallback: ~/.gemini/tmp/*/chats/*.json)
Cursor Cursor IDE Cursor API export cached at ~/.config/tokscale/cursor-cache/usage*.csv (desktop auto-login or cookie paste; not ~/.cursor)
Amp Amp (AmpCode) ~/.local/share/amp/threads/
Codebuff Codebuff ~/.config/manicode/ (+ manicode-dev, manicode-staging; override via CODEBUFF_DATA_DIR)
Freebuff Freebuff shares ~/.config/manicode/ with Codebuff (same runtime); token usage is estimated from the transcript (no local usage; override via FREEBUFF_DATA_DIR)
Droid Droid (Factory Droid) ~/.factory/sessions/
Pi Pi ~/.pi/agent/sessions/
Oh My Pi Oh My Pi ~/.omp/agent/sessions/**/*.jsonl
Senpi Senpi (OmO Native) ~/.senpi/agent/sessions/ (override via SENPI_CODING_AGENT_DIR)
Kimchi Kimchi Coding ~/.config/kimchi/harness/sessions/ (override via KIMCHI_CODING_AGENT_DIR)
Reasonix Reasonix ~/.reasonix/stats/*.jsonl (override via REASONIX_STATE_HOME or REASONIX_HOME)
Kimi Kimi CLI / Kimi Code kimi-cli: ~/.kimi/sessions/ kimi-code: ~/.kimi-code/sessions/ (override via KIMI_CODE_HOME) kimi-work: desktop app-data root (auto-discovered)
Qwen Qwen CLI ~/.qwen/projects/
Roo Code Roo Code ~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/ (+ server: ~/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/tasks/)
Kilo Kilo ~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/ (+ server: ~/.vscode-server/data/User/globalStorage/kilocode.kilo-code/tasks/)
Kilo CLI Kilo CLI ~/.local/share/kilo/kilo.db
Mux Mux ~/.mux/sessions/
Crush Crush $XDG_DATA_HOME/crush/projects.json (project registry; fallback: ~/.local/share/crush/projects.json)
Goose Goose ~/.local/share/goose/sessions/sessions.db (+ macOS Application Support, legacy Block/goose paths; override via GOOSE_PATH_ROOT)
Antigravity Google Antigravity Cached via tokscale antigravity sync to ~/.config/tokscale/antigravity-cache/sessions/*.jsonl (live RPC against the local language server)
Antigravity CLI Antigravity CLI ~/.gemini/antigravity-cli/conversations/*.db (override the Gemini home via GEMINI_CLI_HOME; local SQLite, read directly — no antigravity sync needed)
Trae Trae IDE / Trae Solo (international) Cached via tokscale trae sync to ~/.config/tokscale/trae-cache/sessions/*.json (account-level usage from the official API)
Warp Warp / Oz Cached via tokscale warp sync to ~/.config/tokscale/warp-cache/usage.json (aggregate requests and spend only; no token transcripts)
Grok Build Grok Build $GROK_HOME/sessions/*/*/updates.jsonl (fallback: ~/.grok/sessions/*/*/updates.jsonl)
Zed Agent Zed Agent ~/.local/share/zed/threads/threads.db (macOS: ~/Library/Application Support/Zed/threads/threads.db; Windows: %LOCALAPPDATA%/Zed/threads/threads.db; hosted Zed models only, not external ACP agents)
Kiro Kiro ~/.kiro/sessions/cli/*.json (+ *.jsonl), ~/.local/share/kiro-cli/data.sqlite3 (macOS: ~/Library/Application Support/kiro-cli/data.sqlite3), and Kiro IDE globalStorage snapshots (Kiro/User/globalStorage/kiro.kiroagent; macOS Application Support, Linux ~/.config/Kiro, Windows %APPDATA%\Kiro)
Cline Cline VS Code globalStorage tasks (Linux: ~/.config/Code/...; macOS: ~/Library/Application Support/Code/...; Windows: %APPDATA%\Code\...; server: ~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/) + Cline CLI sessions (first available root, in order: $CLINE_SESSION_DATA_DIR, $CLINE_DATA_DIR/sessions/, $CLINE_DIR/data/sessions/, fallback ~/.cline/data/sessions/; blank/whitespace-only environment values are ignored)
Gajae-Code gajae-code (gjc) ~/.gjc/agent/sessions/ (override via GJC_CODING_AGENT_DIR, GJC_CONFIG_DIR, PI_CONFIG_DIR; $XDG_DATA_HOME/gjc/sessions/ on Linux/macOS)
Cherry Studio Cherry Studio %APPDATA%\CherryStudio\Data\Agents\.claude\projects\*.jsonl and legacy %APPDATA%\CherryStudio\.claude\projects\*.jsonl (macOS: ~/Library/Application Support/CherryStudio/Data/Agents/.claude/projects/; Linux: $XDG_CONFIG_HOME/CherryStudio/Data/Agents/.claude/projects/; Agent / Claude Code mode transcripts; V2 root preferred, legacy keeps untransferred history)
Jcode Jcode ~/.jcode/sessions/session_*.json + session_*.journal.jsonl sidecars (override via JCODE_HOME)
MiMo Code MiMo Code ~/.local/share/mimocode/mimocode.db (XDG data dir; SQLite)
Junie Junie ~/.junie/sessions/*/events.jsonl
Command Code Command Code ~/.commandcode/projects/**/*.jsonl (token usage estimated from transcripts at ~4 chars/token; not persisted on disk)
ZCode ZCode ~/.zcode/cli/db/db.sqlite (v2 usage database) and ~/.zcode/projects/**/*.jsonl (legacy transcripts)
OpenCodeReview OpenCodeReview ~/.opencodereview/sessions/**/*.jsonl
CodeBuddy CodeBuddy (CLI, IDE, VS Code plugin) ~/.codebuddy/projects/**/*.jsonl + extension logs
WorkBuddy WorkBuddy ~/.workbuddy/projects/**/*.jsonl + SQLite fallback
Devin CLI Devin CLI ~/.local/share/devin/cli/sessions.db (SQLite)
Devin Desktop Devin Desktop ACP events: macOS ~/Library/Application Support/Devin/User/acp-events/; Linux ~/.config/Devin/User/acp-events/; Windows %APPDATA%\Devin\User\acp-events\
Augment Code Augment Code (Auggie CLI) ~/.augment/sessions/*.json
Synthetic Synthetic Re-attributed from other sources via hf: model prefix or synthetic provider (+ Octofriend: ~/.local/share/octofriend/sqlite.db)
DeepSeek Harness DeepSeek Harness ~/.dsh/sessions/**/session.jsonl.zstd (or session.jsonl when written uncompressed; override via DSH_HOME)
MiniMax Code MiniMax Code ~/.config/tokscale/headless/mcode/*.jsonl (headless capture of mcode exec --output-format stream-json; override via TOKSCALE_HEADLESS_DIR)
Fx fx ~/.fx/sessions/<sessionId>/usage-v2.json (per-session aggregates)

Get real-time pricing calculations using 🚅 LiteLLM's pricing data, with support for tiered pricing models and cache token discounts.

Why "Tokscale"?

Tokscale

This project is inspired by the Kardashev scale, a method proposed by astrophysicist Nikolai Kardashev to measure a civilization's level of technological advancement based on its energy consumption. A Type I civilization harnesses all energy available on its planet, Type II captures the entire output of its star, and Type III commands the energy of an entire galaxy.

In the age of AI-assisted development, tokens are the new energy. They power our reasoning, fuel our productivity, and drive our creative output. Just as the Kardashev scale tracks energy consumption at cosmic scales, Tokscale measures your token consumption as you scale the ranks of AI-augmented development. Whether you're a casual user or burning through millions of tokens daily, Tokscale helps you visualize your journey up the scale—from planetary developer to galactic code architect.

Contents

Features

  • Interactive TUI Mode - Beautiful terminal UI powered by Ratatui (default mode)
    • 6 interactive views: Overview, Models, Daily, Hourly, Stats, Agents (plus an optional Minutely view, opt-in via minutelyTabEnabled)
    • Keyboard & mouse navigation
    • GitHub-style contribution graph with configurable color themes
    • Real-time filtering and sorting
    • Zero flicker rendering
  • Multi-platform support - Track usage across OpenCode, Claude Code, Codex CLI, Prime Agent, Copilot CLI, Cursor IDE, Gemini CLI, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Kimchi Coding, Reasonix, Kimi CLI, Kimi Work, Qwen CLI, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Antigravity CLI, Zed, Kiro, Trae, Warp/Oz, Cline, Gajae-Code, Grok Build, Jcode, MiMo Code, Command Code, Junie, ZCode, OpenCodeReview, CodeBuddy, WorkBuddy, Devin CLI, Devin Desktop, Augment Code, Synthetic, Cherry Studio, fx, and Oh My Pi
  • Real-time pricing - Fetches current pricing from LiteLLM with 1-hour disk cache; automatic OpenRouter fallback and Cursor model pricing for newly released models
  • Detailed breakdowns - Input, output, cache read/write, and reasoning token tracking
  • Native Rust core - All parsing and aggregation done in Rust for 10x faster processing
  • Web visualization - Interactive contribution graph with 2D and 3D views
  • Flexible filtering - Filter by platform, date range, or year
  • Task-attributed reports - LLM-powered session summarization and task grouping with multi-backend support (Apple FM, Claude, Codex, Gemini, Kiro, MiniMax)
  • Export to JSON - Generate data for external visualization tools
  • Social Platform - Share your usage, compete on leaderboards, and view public profiles

Installation

Quick Start

# Run directly with npx
npx tokscale@latest

# Or use bunx
bunx tokscale@latest

# Or use Deno without installing an alias
deno x npm:tokscale@latest

# Light mode (table rendering only)
npx tokscale@latest --light

That's it! This gives you the full interactive TUI experience with zero setup.

Package Structure: tokscale is an alias package (like swc) that installs @tokscale/cli. Both install the same CLI with the native Rust core (@tokscale/core) included.

Prerequisites

  • Node.js or Bun
  • (Optional) Rust toolchain for building native module from source

Development Setup

For local development or building from source:

# Clone the repository
git clone https://github.com/junhoyeo/tokscale.git
cd tokscale

# Install Bun (if not already installed)
curl -fsSL https://bun.sh/install | bash

# Install dependencies
bun install

# Run the CLI in development mode
bun run cli

Note: bun run cli is for local development. When installed via bunx tokscale, the command runs directly. The Usage section below shows the installed binary commands.

Building the Native Module

The native Rust module is required for CLI operation. It provides ~10x faster processing through parallel file scanning and SIMD JSON parsing:

# Build the native core (run from repository root)
bun run build:core

Note: Native binaries are pre-built and included when you install via bunx tokscale@latest. Building from source is only needed for local development.

Usage

Basic Commands

# Launch interactive TUI (default)
tokscale

# Launch TUI with specific tab
tokscale models    # Models tab
tokscale monthly   # Daily view (shows daily breakdown)
tokscale hourly    # Hourly tab

# Use legacy CLI table output
tokscale --light
tokscale models --light

# Launch TUI explicitly
tokscale tui

# Export contribution graph data as JSON
tokscale graph --output data.json

# Output data as JSON (for scripting/automation)
tokscale --json                    # Default models view as JSON
tokscale models --json             # Models breakdown as JSON
tokscale monthly --json            # Monthly breakdown as JSON
tokscale models --json > report.json   # Save to file

TUI Features

The interactive TUI mode provides:

  • 8 Views: Overview (chart + top models), Usage (subscription quotas), Models, Daily, Hourly, Stats (contribution graph), Agents. A per-minute view (Minutely) is hidden by default and can be enabled with minutelyTabEnabled in settings.json — see Configuration
  • Keyboard Navigation:
    • ←/→/Tab/BackTab: Switch views
    • ↑/↓ or Home/End: Navigate lists
    • Enter: Open daily detail (Daily tab) / select graph cell (Stats tab)
    • Esc or Backspace: Close dialog or exit detail view
    • c/d/t: Sort by cost/date/tokens
    • j: Jump to today
    • s: Open source picker dialog
    • g: Open group-by picker dialog (model, client+model, client+provider+model, workspace+model, session+model, client+session+model)
    • h: Toggle Daily/Hourly chart granularity (Overview tab)
    • v: Toggle Table/Profile view (Hourly tab)
    • y: Copy selected row to clipboard
    • p: Cycle through color themes
    • L: Toggle light mode (white background)
    • r: Refresh data; Shift+R toggles auto-refresh; +/- adjusts interval
    • e: Export to JSON
    • q or Ctrl+C: Quit
  • Mouse Support: Click tabs, buttons, and filters
  • Themes: Green, Halloween, Teal, Blue, Pink, Purple, Orange, Monochrome, YlGnBu, Graphite, Lagoon, Dusk
  • Settings Persistence: Preferences saved to ~/.config/tokscale/settings.json (see Configuration)

Group-By Strategies

Press g in the TUI or use --group-by in --light/--json mode to control how model rows are aggregated:

Strategy Flag TUI Default Effect
Model --group-by model One row per model — merges all clients and providers
Client + Model --group-by client,model One row per client-model pair
Client + Provider + Model --group-by client,provider,model Most granular — no merging
Workspace + Model --group-by workspace,model Group local usage by workspace key, then model — add --merge-worktrees to fold git worktrees into their repo
Session + Model --group-by session,model One row per session_id and model — attribute cost to a specific agent-CLI session
Client + Session + Model --group-by client,session,model One row per client, session, and model — useful for multi-agent runners that join on session_id

--group-by model (most consolidated)

Clients Providers Model Cost
OpenCode, Claude, Amp github-copilot, anthropic claude-opus-4-5 $2,424
OpenCode, Claude anthropic, github-copilot claude-sonnet-4-5 $1,332

--group-by client,model (CLI default)

Client Provider Model Cost
OpenCode github-copilot, anthropic claude-opus-4-5 $1,368
Claude anthropic claude-opus-4-5 $970

--group-by client,provider,model (most granular)

Client Provider Model Cost
OpenCode github-copilot claude-opus-4-5 $1,200
OpenCode anthropic claude-opus-4-5 $168
Claude anthropic claude-opus-4-5 $970

--group-by session,model (per-session cost attribution)

tokscale models --json --group-by session,model emits one entry per (session_id, model). Each entry includes a top-level sessionId field so downstream tools (e.g. multi-agent IDEs) can join cost data back to a specific agent-CLI session:

{
  "groupBy": "session,model",
  "entries": [
    {
      "sessionId": "019e1e27-af49-7cd1-89b7-7bad1c3f3be2",
      "client": "codex",
      "provider": "openai",
      "model": "gpt-5",
      "input": 25251,
      "output": 47,
      "cacheRead": 1920,
      "cacheWrite": 0,
      "reasoning": 40,
      "messageCount": 12,
      "cost": 0.0123
    }
  ]
}

Use --group-by client,session,model when you also need the client name on every row (one spawn across all 20+ supported CLIs at once).

Per-workspace cost

--group-by workspace,model attributes usage to the directory an agent ran in, so you can see what a given project cost:

# One row per (workspace, model)
tokscale models --light --group-by workspace,model --month

# Fold every git worktree into its parent repository — one row per repo
tokscale models --light --group-by workspace,model --merge-worktrees --month

# JSON carries workspaceKey (grouping identity) and workspaceLabel (display name)
tokscale models --json --group-by workspace,model --merge-worktrees

In the TUI, press gWorkspace + Model, then w to toggle worktree rollup (the footer shows [w:worktrees] or [w:repos]).

Workspace rows are labeled repo or repo ⑃ worktree. Clients disagree about how they record a workspace — Claude Code stores a dash-mangled directory slug (-Users-me-devpro-app) while Codex and OpenCode store real paths — so tokscale resolves slugs back to their true path against the filesystem. Four consequences worth knowing:

  • Without --merge-worktrees, each git worktree is its own row. Agent CLIs that isolate every task into a worktree will therefore spread one repository across many rows; --merge-worktrees re-unites them (and also merges a repo recorded by different clients under different key formats).
  • --merge-worktrees finds worktrees kept inside the repo and beside it. <repo>/.claude/worktrees/<name> (what agent CLIs create) and <repo>/.git/worktrees/<name> are recognized from the path alone; a worktree checked out elsewhere (git worktree add ../feature-x) is recognized by reading its .git pointer file back to the repository. A repo reached through two different path spellings (a symlink and its target) still stays two rows, because a workspace identity is compared as a string. Totals are unaffected either way — usage is split across rows, never lost or double counted.
  • Rows that would show the same name are qualified with their parent directory. A label is the directory's own name, so ~/work/api and ~/oss/api would both read api; colliding labels gain as many leading path segments as it takes to tell them apart (work/api, oss/api), and when no path segment can — the same directory recorded by two clients under different key formats — the row is qualified with its workspace key instead. Grouping is unaffected — this only changes the displayed text.
  • Clients that never record a workspace roll up into a single Unknown workspace row. Roughly half the supported clients (including gemini, cursor, amp, droid, roocode, kilocode, goose, and Copilot's OTEL path) do not write one, so their usage cannot be attributed to a directory.

Filtering by Platform

Use --client (short -c) to scope reports to one or more clients. The flag is repeatable, accepts comma-separated values, and works with every report command:

# Show only OpenCode usage
tokscale --client opencode

# Comma-separated: combine multiple clients
tokscale --client opencode,claude

# Repeated: same effect, useful with shell aliases
tokscale -c opencode -c claude

# Cursor IDE uses Tokscale's API cache; run login + sync --json first
tokscale --client cursor

# Synthetic (synthetic.new) is detected from other agent sessions
tokscale --client synthetic

# Combine with other filters
tokscale --client opencode,claude --week --json

Possible values: opencode, claude, codex, copilot, gemini, cursor, amp, codebuff, droid, openclaw, hermes, pi, prime-agent, kimchi, kimi, qwen, roocode, kilocode, kilo, mux, crush, goose, antigravity, antigravity-cli, zed, kiro, trae, warp, cline, gjc, grok, jcode, micode, commandcode, junie, zcode, opencodereview, codebuddy, augment, synthetic, cherrystudio.

Breaking change (v4.0.0): The per-client boolean flags (--opencode, --claude, --codex, etc.) have been removed and now error. Use the canonical --client/-c flag instead — e.g. tokscale --client opencode,claude.

Date Filtering

Date filters work across all commands that generate reports (tokscale, tokscale models, tokscale monthly, tokscale graph):

# Quick date shortcuts
tokscale --today              # Today only
tokscale --yesterday          # Yesterday only
tokscale --week               # Last 7 days
tokscale --month              # Current calendar month

# Custom date range (inclusive, local timezone)
tokscale --since 2024-01-01 --until 2024-12-31

# Filter by year
tokscale --year 2024

# Combine with other options
tokscale models --week --client claude --json
tokscale monthly --month --benchmark

Note: Date filters use your local timezone. Both --since and --until are inclusive. v2.2.0 note: Session active-time daily buckets also use your local timezone, so users outside UTC may see active-time dates align with local token/cost report days instead of UTC day boundaries.

Pricing Lookup

Look up real-time pricing for any model:

# Look up model pricing
tokscale pricing "claude-3-5-sonnet-20241022"
tokscale pricing "gpt-4o"
tokscale pricing "grok-code"

# Force specific provider source
tokscale pricing "grok-code" --provider openrouter
tokscale pricing "claude-3-5-sonnet" --provider litellm

# Inspect custom pricing overrides
tokscale pricing list-overrides

Lookup Strategy:

The pricing lookup uses a multi-step resolution strategy:

  1. Custom Pricing Overrides - Exact user-defined entries from ~/.config/tokscale/custom-pricing.json
  2. Exact Match - Direct lookup in LiteLLM/OpenRouter databases
  3. Alias Resolution - Resolves friendly names (e.g., big-pickleglm-4.7)
  4. Tier Suffix Stripping - Removes quality tiers (gpt-5.2-xhighgpt-5.2)
  5. Version Normalization - Handles version formats (claude-3-5-sonnetclaude-3.5-sonnet)
  6. Provider Prefix Matching - Tries common prefixes (anthropic/, openai/, etc.)
  7. Cursor Model Pricing - Hardcoded pricing for models not yet in LiteLLM/OpenRouter (e.g., gpt-5.3-codex)
  8. Fuzzy Matching - Word-boundary matching for partial model names

Custom Pricing Overrides

Create custom-pricing.json in Tokscale's config directory (~/.config/tokscale/custom-pricing.json on macOS/Linux by default; the same directory resolved by TOKSCALE_CONFIG_DIR when set) to override prices for model IDs that upstream pricing databases do not yet cover correctly.

{
  "$schema": "https://tokscale.ai/custom-pricing.schema.json",
  "models": {
    "accounts/fireworks/routers/kimi-k2p6-turbo": {
      "input_cost_per_million_tokens": 2.00,
      "output_cost_per_million_tokens": 8.00,
      "cache_read_input_token_cost_per_million_tokens": 0.30,
      "source": "https://docs.fireworks.ai/serverless/pricing",
      "notes": "Fireworks Kimi K2.6 Turbo (preview)"
    },
    "accounts/fireworks/models/kimi-k2p6": {
      "input_cost_per_million_tokens": 0.95,
      "output_cost_per_million_tokens": 4.00,
      "cache_read_input_token_cost_per_million_tokens": 0.16
    },
    "kimi-k2p6-turbo": {
      "input_cost_per_million_tokens": 2.00,
      "output_cost_per_million_tokens": 8.00
    }
  }
}

Override prices are entered in dollars per million tokens, matching how most API providers publish pricing; Tokscale converts them to per-token rates internally. At least one of input_cost_per_million_tokens or output_cost_per_million_tokens must be present, and cache-read/cache-creation fields are optional. An explicit 0 is allowed and is the way to declare a free model — it is a statement ("this costs nothing"), unlike an omitted field, which means the rate is unknown and leaves the usage unpriced. LiteLLM-style per-token field names such as input_cost_per_token, output_cost_per_token, and cache_read_input_token_cost are also accepted for copy/paste compatibility, but the per-million names are the recommended user-facing form. To omit a tier or cache price, leave the field out; negative or non-finite values are treated as invalid and the whole model entry is skipped so typos do not silently alter accounting. Optional source and notes fields are ignored by Tokscale and can be used for your own bookkeeping.

Overrides are exact-only and case-insensitive. Tokscale checks the raw model ID first, then the existing synthetic /models/ normalization, then falls through to LiteLLM, OpenRouter, Cursor pricing, and fuzzy matching if no override matches. Raw exact matches beat normalized exact matches, so accounts/fireworks/routers/kimi-k2p6-turbo can override one gateway-specific model while kimi-k2p6-turbo can cover normalized /models/ paths. Overrides are loaded once at startup; restart the command after editing the file. This is the recommended local fix for wrong-model pricing bugs while waiting on upstream LiteLLM pricing updates.

Provider Preference:

When multiple matches exist, original model creators are preferred over resellers:

Preferred (Original) Deprioritized (Reseller)
xai/ (Grok) azure_ai/
anthropic/ (Claude) bedrock/
openai/ (GPT) vertex_ai/
google/ (Gemini) together_ai/
meta-llama/ fireworks_ai/

Example: grok-code matches xai/grok-code-fast-1 ($0.20/$1.50) instead of azure_ai/grok-code-fast-1 ($3.50/$17.50).

Social

# Login to Tokscale (opens browser for GitHub auth)
tokscale login

# Save an existing Tokscale API token without browser auth
tokscale login --token tt_xxx

# Check who you're logged in as
tokscale whoami

# Display your saved API token as a QR code (useful for sharing to another device)
# Encodes {"token":"tt_xxx","username":"..."} — scan with any QR reader
tokscale qr

# Submit your usage data to the leaderboard
tokscale submit

# Submit in CI/headless environments without writing credentials
# Precedence: TOKSCALE_API_TOKEN env > saved credentials file (~/.config/tokscale/credentials.json).
# When the env var is set, the saved file is ignored for that invocation.
TOKSCALE_API_TOKEN=tt_xxx tokscale submit

# Revoke a token: visit Settings > API Tokens on the leaderboard site
# (https://tokscale.ai/settings) and click "Revoke" on the token row.
# Revocation takes effect immediately — subsequent requests with that
# token will get HTTP 401 "Invalid API token".

# Submit with filters
tokscale submit --client opencode,claude --since 2024-01-01

# Preview what would be submitted (dry run)
tokscale submit --dry-run

# Logout
tokscale logout
CLI Submit
Unpriced usage is excluded from submission

Before anything is submitted, every message must resolve to an authoritative price that covers every token bucket the message populated (input, output, cache read, cache write). Messages that cannot be priced are skipped and reported as Warning: excluded N unpriced provider/model message(s) — unknown models never submit invented or guessed spend, and all remaining priced usage still submits normally.

The exclusion reasons:

  • no authoritative model-to-price mapping — the model ID is absent from LiteLLM, OpenRouter, models.dev, and your custom overrides.
  • generic routing label has no authoritative model-to-price mapping — the ID is a router label (auto, gemini-default, …) whose underlying model varies per request, so it is refused outright. An explicit entry for the label in custom-pricing.json is the supported way to assert a rate you know applies.
  • pricing does not cover every populated token bucket — a price row was found, but it is missing a rate (most often cache read or cache creation) that this usage actually populates.
  • model price match does not establish the requested provider — a price row was found only by matching the model part of the ID, or by trying a provider prefix, which does not prove your provider bills at that row's rate.
  • model price match does not exactly name the requested model — a fuzzy or provider-scoped match was found, but nothing proves the priced key names the model you actually used.
  • model price lookup is ambiguous across non-equivalent candidates — several candidate rows matched and they quote different prices.

To include previously excluded usage, add an exact-match entry to custom-pricing.json (see Custom Pricing Overrides) — an explicit 0 declares a genuinely free model — then re-run tokscale submit --dry-run until no warnings remain. tokscale pricing <model-id> shows which entry matched. The file is keyed by the model ID alone — the model half of the provider/model pair shown in the warning.

Autosubmit

Autosubmit schedules the normal tokscale submit flow with the operating system scheduler. It is useful for keeping your public profile current without a manual terminal run.

# Enable periodic submission. Uses launchd on macOS, systemd user timers on Linux
# when available, cron as a Linux fallback, and Windows Task Scheduler on Windows.
tokscale autosubmit enable --interval 24h

# Keep the same client and date filters you would pass to submit.
tokscale autosubmit enable --interval 2h --client opencode,claude --week

# Show saved settings and the last run/error.
tokscale autosubmit status
tokscale autosubmit status --json

# Run once now, even if the saved interval has not elapsed.
tokscale autosubmit run --force

# Disable autosubmit and remove the scheduler entry.
tokscale autosubmit disable

Scheduled runs are non-interactive: they never prompt for GitHub auth or star confirmation. Run tokscale login --token tt_xxx once, or set TOKSCALE_API_TOKEN in the scheduler environment. Tokscale records scheduler state in settings.json, writes logs under ~/.config/tokscale/autosubmit/, and uses a lock file so overlapping scheduler ticks do not submit twice.

Cursor IDE Commands

Cursor IDE support uses Cursor's web API export, cached by Tokscale at ~/.config/tokscale/cursor-cache/usage*.csv. Tokscale does not parse local Cursor Agent CLI state under ~/.cursor, and it does not treat the desktop SQLite DB as a usage ledger.

When the Cursor desktop app is installed and signed in, tokscale cursor login prefers the local cursorAuth/accessToken from Cursor's state.vscdb and builds the session cookie automatically. tokscale cursor sync also refreshes that token when available. Usage rows still come only from Cursor's usage-export API.

Setup (desktop auto-login):

  1. Sign in to the Cursor desktop app.
  2. Run tokscale cursor login --name work (auto-detects the local desktop session when available).
  3. Run tokscale cursor sync --json to populate ~/.config/tokscale/cursor-cache/usage.csv.
  4. Run tokscale --client cursor or any report command.

Fallback (manual browser cookie), if desktop login is unavailable:

  1. Open https://www.cursor.com/settings in your browser and sign in.
  2. Copy the WorkosCursorSessionToken cookie value:
    • Network tab: make any request to cursor.com/api/*, then copy the value after WorkosCursorSessionToken= from the Cookie request header.
    • Application tab: open Cookies -> https://www.cursor.com, then copy the WorkosCursorSessionToken value.
  3. Run tokscale cursor login --name work and paste the token when prompted.
  4. Continue with tokscale cursor sync --json as above.

Treat the session token like a password. It is stored locally in ~/.config/tokscale/cursor-credentials.json.

# Login to Cursor (auto-detects Cursor desktop login; falls back to browser cookie paste)
# --name is optional; it just helps you identify accounts later
tokscale cursor login --name work

# Check Cursor authentication status and session validity
tokscale cursor status

# List saved Cursor accounts
tokscale cursor accounts

# Manually refresh cached Cursor usage
tokscale cursor sync --json

# Switch active account (controls which account syncs to cursor-cache/usage.csv)
tokscale cursor switch work

# Logout from a specific account (keeps history; excludes it from aggregation)
tokscale cursor logout --name work

# Logout and delete cached usage for that account
tokscale cursor logout --name work --purge-cache

# Logout from all Cursor accounts (keeps history; excludes from aggregation)
tokscale cursor logout --all

# Logout from all accounts and delete cached usage
tokscale cursor logout --all --purge-cache

By default, Tokscale aggregates usage across all saved Cursor accounts by reading cursor-cache/usage*.csv. The active account syncs to usage.csv; additional accounts sync to usage.<account>.csv.

When you log out, Tokscale moves cached usage to cursor-cache/archive/ so it is no longer aggregated. Use --purge-cache to delete cached usage instead.

Antigravity Commands

Antigravity sync currently works on macOS and Linux only. The Antigravity-enabled editor must be running and its local language server available; tokscale reads usage from that local language server and caches normalized artifacts locally.

# Check whether tokscale can see running Antigravity language servers
tokscale antigravity status

# Sync usage from local Antigravity language servers into tokscale's cache
tokscale antigravity sync

# Delete the cached Antigravity artifacts
tokscale antigravity purge-cache

Cache location: ~/.config/tokscale/antigravity-cache/

How it works: tokscale antigravity sync discovers local Antigravity session candidates, fetches confirmed usage data from the local language server RPC, and stores normalized JSONL artifacts for tokscale-core to parse later. Run sync before reports if you want the freshest Antigravity data.

Trae Commands

Trae (ByteDance's AI IDE) ships in two international product lines — Trae IDE and Trae Solo. They share the same account-level usage data (same backend, same JWT), so tokscale reports them as a single trae client. You can install either or both desktop apps; tokscale auto-discovers credentials from whichever is present.

Credentials are identified per desktop app via --variant:

  • --variant ide — credentials from Trae IDE (~/Library/Application Support/Trae/)
  • --variant solo — credentials from Trae Solo (~/Library/Application Support/TRAE SOLO/)

tokscale trae sync calls the official query_user_usage_group_by_session API exactly once per run (regardless of how many desktop apps are installed) and persists the raw JSON to a local cache.

# Log in (auto-detects credentials from any installed Trae desktop client)
tokscale trae login

# Manual JWT entry (for environments where auto-detect can't find storage.json,
# e.g. Linux/Windows or a headless server). Open https://www.trae.ai/account-setting#usage
# in your browser, then F12 → Network → filter `query_user_usage` and copy the
# `Authorization` header value.
tokscale trae login --manual --variant solo

# Show which variants have cached credentials
tokscale trae status

# Sync usage (uses the first available credential source)
tokscale trae sync --since 30

# Forget cached credentials for one variant
tokscale trae logout --variant solo

Cache location: ~/.config/tokscale/trae-cache/

How it works: tokscale either decrypts the desktop client's iCubeAuthInfo://* blob (globalStorage/storage.json) to recover a JWT, or accepts one pasted via --manual. It then calls POST /trae/api/v1/pay/query_user_usage_group_by_session paginated and stores the raw JSON. Run sync before reports if you want the freshest Trae data.

Sync-lock recovery during upgrades

Antigravity and Trae syncs use a legacy-compatible sync.lock file to avoid overlapping an older tokscale binary during a rolling upgrade. After a crash or forced stop, that file can remain. Tokscale intentionally fails closed instead of replacing it, because an older binary may still be creating or updating the same path. Confirm that no tokscale antigravity sync or tokscale trae sync process is active, remove the exact quoted sync.lock path printed by the command, then retry. Do not remove the lock while a sync may still be running.

Note on pricing: Trae cost figures are vendor-reported — tokscale surfaces the dollar_float value returned by Trae's own API rather than recomputing cost from token counts through tokscale's pricing engine. Numbers will match what you see on trae.ai/account-setting#usage, not what tokscale would otherwise calculate for the same usage.

China variants: The China editions (trae.com.cn) are intentionally not supported. The CN backend does not expose a session-level usage query API. Trae CN / Trae Solo CN support will be added once an official endpoint becomes available upstream.

Warp/Oz Commands

Warp/Oz does not expose local token transcripts. Tokscale only syncs the aggregate request and spend counters returned by Warp's GraphQL API, then reports them as warp / aggregate-requests rows with zero token buckets.

# Save a bearer token or Cookie header copied from an authenticated Warp request
tokscale warp login

# Inspect credential/cache state and diagnostics
tokscale warp status

# Sync aggregate requests and spend into tokscale's local cache
tokscale warp sync

# Remove saved credentials; add --purge-cache to delete synced usage too
tokscale warp logout --purge-cache

Cache location: ~/.config/tokscale/warp-cache/usage.json

How it works: tokscale warp sync calls Warp's authenticated GraphQL API for account and workspace aggregate counters. Tokscale preserves request counts as message counts and vendor-reported spend as cost, but it never converts requests into synthetic tokens. Warp is excluded from default submit data because the public leaderboard accepts token-attributed usage, not aggregate request counters.

Task-Attributed Report

The report command generates a task-attributed usage breakdown. It uses an LLM t


README truncated. Continue reading on GitHub