the bar B
One strip, 24 CSS pixels tall by default, sitting in the gap above your terminal and following that window as you move it. When there is no room above a terminal, it hides instead of relocating.
what the chips read
the whole surface is one text file
{
"bar": { "height": 24, "gap": 8, "fontSize": 12,
"fontFamily": "Cascadia Mono", "backgroundTint": "#FBF2E2",
"backdrop": "acrylic", "radius": 8 },
"modules": {
"cpu": { "enabled": true, "warnAt": 85 },
"ram": { "enabled": true, "warnAt": 90 },
"clock": { "format": "{MMM} {dd} ({Wkk}) {HH}:{mm}" }
}
}
Every key is optional. Delete one and the built-in default applies. The file is written once, as an annotated template, on first run and then only ever read, saving it hot-reloads the bar with no restart, so hand edits survive.
your own chip
token usage C
The bar reads the session logs your AI coding tools already write to your own disk and totals the tokens in them. It shows the running total on the bar and lays the rest out in a dashboard. Nothing is uploaded anywhere.
sources are declared by you, in the same config file
"tokens": {
"enabled": true,
"sources": [
{ "app": "zai", "path": "~/.zai/agent/sessions" },
{ "app": "pi", "path": "~/.pi/agent/sessions",
"recursive": true }
]
}
the dashboard, with example numbers
| window | tokens | requests |
|---|---|---|
| today | 1,240,918 | 312 |
| last 7 days | 6,802,440 | 1,704 |
| last 30 days | 21,519,063 | 5,388 |
| app | input | output | cache R | cache W | total |
|---|---|---|---|---|---|
| pi-wsl | 610,400 | 188,220 | 391,004 | 51,294 | 1,240,918 |
| zai | 248,910 | 71,002 | 140,558 | 19,004 | 479,474 |
how a total is built
- total
- input + output + cache read + cache write
- input / output
- the raw counts, cache excluded
- cache R / W
- the rest of the total, broken out; the four columns sum to it
- reasoning
- kept as a breakdown, never added again
- estimates
- a route with no usage block at all, a local app driven through a bridge, is estimated from its own transcript, capped, and estimateMissingUsage: false drops those turns instead
subscriptions D
The subscription board watches your coding plans and shows how much of each time window you have left. Chocobar never asks you to sign in: each entry points at the login file another tool already saved, and the request for remaining quota goes to that plan's own website.
what each provider reads
| type | login it looks for | shows |
|---|---|---|
| chatgpt | ~/.codex/auth.json, a Codex CLI login | 5h and weekly windows |
| zai | ~/.zcode/v2/config.json, a Z.ai CLI config | windows the config declares |
| antigravity | no default path, you name the file | Gemini and Claude/GPT rows |
| generic | any REST endpoint, described in config | up to six JSON-path windows |
the board, with example numbers
| plan | window | used | limit | resets |
|---|---|---|---|---|
| ChatGPT | 5h | 41 | 180 | in 2h 14m |
| ChatGPT | week | 612 | 2,400 | Tue 09:00 |
| Z.ai | week | 1,180 | 3,000 | Mon 00:00 |
a generic plan is config, not a feature request
{ "type": "generic", "label": "MyPlan",
"url": "https://api.example.com/v1/quota",
"auth": { "header": "Authorization", "prefix": "Bearer ",
"path": "~/.example/auth.json", "key": "access_token" },
"windows": [
{ "label": "5h", "used": "$.data.five_hour.used",
"total": "$.data.five_hour.limit" },
{ "label": "week", "remaining": "$.data.weekly.remaining",
"total": "$.data.weekly.limit" } ] }
Shipped defaults read nothing. Every usage source and board provider ships switched off, so an untouched install performs no scan and makes no request; the update check is opt-in and only ever reports. A plan you switch on talks to that plan's own API, with the login that plan already saved on your disk.