chocobar

A thin bar that sticks to the top of your terminal window and follows it around your screen. System readouts, token usage, and coding-plan quota in one strip.

Download chocobar.exe v1.5.0
Runtime
Native Win32, one file
Needs
No installer, no admin rights
Config
%USERPROFILE%\.wizbar\config.json
Updates
Manual, from the tray menu
Source
github.com/mnsky-tyan/chocobar
conhost · class: Windows Terminal bar: 24px · gap 8 · radius 8 example values
A gpu 12% cpu 34% 61°C ram 58% 40% 90% Oct 17 (Fri) 23:33

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

$ gpu · cpu · cputemp · ram · volume · battery · clock
gpu, cpu and ram come from Windows performance counters; cpu temperature from HWiNFO shared memory (the chip shows an em dash without it); volume from Core Audio.
cpu, temperature and memory each take a threshold you choose and turn red once they cross it, so a rise is visible before it matters.

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

# any command's first line of stdout becomes the chip text
{ "icon": "moon", "label": "Focus",
  "command": "C:\tools\focus.bat", "toggle": true }
Give it an intervalMs instead and the same entry polls on a timer, that is how a metric the bar has no reader for gets on the strip.

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 }
 ]
}
A store is newline-terminated JSONL with usage numbers in it. fields renames the keys for a harness that spells them differently; providers and exclude decide which routes a store counts.

the dashboard, with example numbers

Illustrative figures for layout only, not a reading of any machine.
windowtokensrequests
today1,240,918312
last 7 days6,802,4401,704
last 30 days21,519,0635,388
Per-app breakdown, also example values.
appinputoutputcache Rcache Wtotal
pi-wsl610,400188,220391,00451,2941,240,918
zai248,91071,002140,55819,004479,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

typelogin it looks forshows
chatgpt~/.codex/auth.json, a Codex CLI login5h and weekly windows
zai~/.zcode/v2/config.json, a Z.ai CLI configwindows the config declares
antigravityno default path, you name the fileGemini and Claude/GPT rows
genericany REST endpoint, described in configup to six JSON-path windows

the board, with example numbers

Illustrative figures for layout only, not a reading of any plan.
planwindowusedlimitresets
ChatGPT5h41180in 2h 14m
ChatGPTweek6122,400Tue 09:00
Z.aiweek1,1803,000Mon 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.