Skip to content
Free · Open source · MIT

Local usage analytics
for opencode.

Cost, tokens, models, agents, tools, skills, and sessions — tiled by day. A native desktop dashboard for the data opencode already keeps on your disk.

100% local* read-only no telemetry MIT
Chronotile dashboard: stat cards, daily cost area chart, daily token bar chart, and a 12-month contribution-style heatmap.
Features

Everything opencode already knows about your work.

Just made legible. Eleven pages, filterable by project and time range, down to a single session.

Every stat that matters

Spend, tokens (including reasoning and cache), models, agents, tools, skills, projects, sessions, and errors — filterable by project and by 7d / 30d / 90d / MTD / all time.

The cost opencode hides

Subscription and OAuth-plan messages are stored as $0 — on a real database, most of them. Chronotile prices their tokens from models.dev and shows reported and estimated side by side.

Instant on multi-GB databases

An incremental rollup cache answers every query in milliseconds, no matter how large your history grows.

Local & read-only

Your opencode databases are opened read-only — nothing is modified. No usage data ever leaves your machine; the app makes two requests, an update check and a public price list*.

Session tree & transcripts

Expand any session into its subagent children, then read the whole conversation: messages, tool calls with durations, reasoning, file patches, and errors.

GitHub-style heatmap

A full year of daily spend or token intensity, always shown in full — with the range you picked highlighted and the rest dimmed.

Multiple databases

Auto-detects the default opencode DB and lets you register any number more — e.g. per-profile databases from ocp. Switch with one click, or rebuild a source's index on demand.

Skill analytics

Which skills actually get loaded, and how — preloaded by a task or invoked directly — with sessions, projects, and first/last use per skill.

Models down to the variant

Per-model and per-agent cost, tokens, and median output tok/s measured from your own traffic — expandable into each reasoning-effort variant.

Updates in place

Signed updates install from inside the app on macOS, Windows, and Linux AppImage. The launch check is silent unless a new version exists — and can be switched off.

How it works

A read-only mirror, not a live query.

The dashboard never touches your opencode database at query time. That's why it stays fast.

  1. 01 — Ingest

    Rust engine mirrors opencode

    A Rust ingest engine opens each opencode SQLite database read-only and mirrors it into a compact local rollup cache — roughly 15 MB per 10 GB of sources.

  2. 02 — Incremental

    Indexed range scans, not full rescans

    Every cycle is an indexed range scan past a stored rowid watermark — never a full rescan. In-flight messages wait until their cost and tokens are final. A cycle runs every 60 s, or whenever you hit refresh.

  3. 03 — Query

    Dashboard reads from the cache

    The UI never queries opencode directly — it reads only from the local rollup, and polls the ingest status every 5 s so new data lands on its own. Instant, even alongside a running opencode.

Built with  ·  Tauri 2  ·  Rust  ·  React 19  ·  Tailwind 4  ·  shadcn/ui

Everything is local. opencode databases are opened read-only. Chronotile writes only to its own app directory. No telemetry, no accounts, no analytics.

  • “no analytics” — Chronotile makes exactly two network requests, and neither one is your data. The first asks GitHub whether a newer release exists: a single file, releases/latest/download/latest.json. The second downloads a public price list from models.dev — the same api.json anyone can open in a browser — so subscription usage, which opencode records as $0, can still be costed. Both send nothing but the request itself: no usage data, no identifiers, no analytics, and there is no server to send them to. The update check runs once at launch, silent unless an update is waiting; the price refresh runs in the background at most once a day. Switch both off under Settings → Preferences and the app makes no network calls at all — a price snapshot ships inside the binary, so cost still works offline.
  • “100% local” — refers to your analytics. Every session, token, and dollar is read, rolled up, and queried on your own machine. Nothing is uploaded, and there is no server to upload it to.