01 · Name
Count what burns, and what it costs
计然 (Jīrán) is the strategist in the Records of the Grand Historian credited with counting both what a state burned and what it earned. That is the whole product in two words: the tokens your AI tools spent, and what those plans actually cost you.
It shipped as Token Monitor up to v0.47.0-rev.36. The rename is not a reset: the old user-data folder is copied over on first launch, and the old environment variables and headers keep working.

知斗则修备,时用则知物,二者形则万货之情可得而观已。
02 · Ask
Three numbers, read from your own disk
Every tracked tool already keeps transcripts, session databases or caches on your machine. Jiran reads those — the data already lives on your disk, so that is where the counting happens.
01Usagesample data
How much have I used?
Tokens and cost, broken down by tool, model, device, project and individual session, with a durable daily history.
02Limitssample data
How much of my plan is left?
Per-provider quota windows — session, weekly, billing, credits. The Hub probes them and publishes one sanitized snapshot to every device; in local-only mode the Limits page is empty by design.
03Costsample data
What am I paying for it?
A hand-kept subscription ledger sits beside the model price list: what a plan costs, when it renews, and what this month would have cost at API prices.
03 · Rules
Honest about what is measured
A usage dashboard that quietly mixes measurements with guesses is worse than no dashboard. These rules hold on every surface.
“~” means estimated
Where a tool never stored real token counts, the total is estimated from the text it did store and shown with a leading “~”. The basis of each estimate is documented in the matrix notes.
Credits are their own unit
A provider that bills in credits (Qoder is the case in point) reports exact credits beside “~”-marked tokens; credits are never folded into a token total.
A refresh never interrupts you
Frames arrive every few seconds. While a dropdown or a half-typed value is open the rebuild is deferred, expanded rows and scroll positions are kept, and nothing is written when nothing changed.
liveHover the number: new frames waitA number belongs to the tab that measured it
Day, Month and Total come from the collector’s fixed windows; Yesterday and Week are calendar ranges resolved on request. Everywhere a total is reported, the week starts on ISO Monday.
9.61Mon request · ISO MondayA greyed device is a silent device
A device whose last report is older than 10 minutes is marked stale on purpose, rather than being shown as if it were live.
04 · Flow
Four surfaces, one product
Local mode is the default: launch the desktop app and it starts tracking this device — no Hub, no agent, no .env. To gather several machines, run a Hub with Docker Compose on a machine you control.
local transcripts / session DBs / caches
| Surface | Role | Needs a Hub |
|---|---|---|
| Desktop appElectron · Windows / macOS / Linux | Collects this machine and shows the full UI | no |
| HubDocker Compose + MySQL | Ingest, aggregation, SSE, and the same dashboard as a web app / installable PWA | — |
| Headless agentNode.js | The collector with no GUI, for servers and WSL distros | yes |
| AndroidKotlin / Compose | Reads the fleet and the quotas on a phone; collects and posts nothing | yes |
05 · Edge
Local-first is the architecture, not a slogan
No telemetry, no analytics, no hosted backend, nothing sent to the maintainer. Network access happens only for features you use: the update check, the exchange-rate lookup, the Hub you deploy, and the providers behind quota accounts you configured there.
Never leaves this machine
- Prompts and replies
- Source code and file contents
- Absolute workspace paths
- OAuth credentials, access / refresh tokens
- Provider cookies and API keys
- Raw provider responses
With sync on, goes to your own Hub
- Device identifiers and metadata
- Aggregate token and cost totals
- Tool, model, session and project attribution
- An optional workspace folder label (never a path)
- Subscription details you typed in
This website follows suit: no analytics scripts, no cookies. Its only outside request asks GitHub for the latest version number.
Full privacy policy ↗06 · Sources
Fifty-nine sources, wired in one place
The client list is defined once and every runtime always collects all of it — there is no per-tool opt-in that could silently under-count. A tool with no entry here is not tracked.
- Claude Code
- Claude Desktop
- Codex
- OpenCode
- Hermes Agent
- OpenClaw
- Cursor
- Antigravity
- Cline
- Kimi CLI / Kimi Code
- Qwen CLI
- Grok Build
- GitHub Copilot
- Pi / Oh My Pi
- Zed
- Kilo Code
- Command Code
- MiMo Code
- ZCode / GLM
- Kiro
- CodeBuddy
- WorkBuddy
- Proma
- DeepSeek Harness
- Qoder / Qoder CN
- Reasonix
- Gemini CLI
- Roo Code
- Amp
- Droid
- Mux
- Kilo CLI
- Crush
- Goose
- Codebuff / Freebuff
- Trae
- Warp / Oz
- Gajae-Code
- Jcode
- Junie
- OpenCodeReview
- Devin CLI / Devin Desktop
- Senpi
- Augment Code
- Kimchi
- Prime Agent
- Cherry Studio
- MiniMax Code
- Fx
- LM Studio
- Unsloth
- Hindsight
- DeepSeek
- OpenRouter
- Minimax
- Volcengine
- Ollama
- Third-party APIs
- Sakana (Fugu)
07 · Get
Download it, open it, it starts counting
First run needs no setup. Packaged builds check GitHub Releases and surface an update indicator.
Current releasev1.2.1 ↗published
Suggested for your system
macOS 12+ · signed and notarized
Windows 10 / 11 · code-signed
A Hub read client — needs a Hub
Headless agent needs Node.js 22.13+; the Hub runs on Docker Compose
Several machines: run a Hub
The root docker-compose.yml is the only supported deployment. The Hub serves the dashboard on the same port (17321), installable as a PWA; the image is ghcr.io/igngserver/jiran-hub.
Hub deployment guide ↗cp .env.example .env
# JIRAN_SECRET + MySQL passwords
docker compose up -d
curl http://127.0.0.1:17321/api/healthDevelopment and verification concentrate on Windows 11, a Docker Compose Hub, and Ubuntu running the headless agent. Anything outside that has not been fully verified and may misbehave.
