Skip to main content

StatStrip

Live CPU, RAM, disk, GPU — and your Claude Code + OpenAI Codex usage limits — inside the Windows taskbar.

No extra window, no wasted screen space: the numbers sit in the empty part of the taskbar itself.

StatStrip running in the Windows taskbar, showing CPU 13%, RAM 40%, DISK 38%, GPU0 0%, GPU1 0%, CLAUDE 5h 79%, WEEK 16%, CODEX 7d 18% to the left of the taskbar icons

That's the real thing, in a real taskbar — not a mockup.

If you use Claude Code or Codex all day, the question you actually care about isn't CPU — it's how much of my 5-hour block have I burned? StatStrip keeps that answer on screen, next to your hardware stats, without spending any of the quota it's reporting.

  • Real plan limits, not estimates. Percent-of-your-actual-limit, read from the same sources the tools use themselves.
  • Costs you nothing to watch. The Codex gauges run no model — zero tokens. The Claude gauges reuse your existing login.
  • Never lies to you. A number it can't verify is marked with its age or hidden outright. Stale figures that look live are treated as bugs, not features.
  • Nothing leaves your PC. No API keys, no accounts, no telemetry, no server.

Install (2 minutes, no technical knowledge needed)

  1. Download: click the green Code button at the top of this page → Download ZIP, then right-click the file → Extract All.
  2. Run: open the extracted folder and double-click install.bat.

That's it. The installer finds Python (and downloads it automatically if it's missing — this can take a few minutes the first time), installs StatStrip, and starts it. The stats appear in your taskbar right away and come back every time you log in. To remove it, double-click uninstall.bat in the same folder.

If the automatic Python download fails (older Windows without winget), install Python once from python.org/downloads — tick "Add python.exe to PATH" — and run install.bat again.

What the gauges mean

On the strip Meaning
CLAUDE 5h 75% 75% of your Claude 5-hour block used
WEEK 16% 16% of your Claude weekly limit used
CLAUDE 5h idle No active 5-hour block right now
CODEX 7d 14% 14% of your Codex weekly limit used
~ prefix An estimate from your own history, not a real plan limit
(3h ago) A held reading — this old, not current. See Honest numbers
reset That window rolled over; the old number is known to be wrong
login required No usable login for that tool
usage unavailable No trustworthy reading right now (transient — it retries)

Codex names its own windows, and StatStrip shows whatever your plan reports rather than assuming. On a Plus plan that's a single weekly window (CODEX 7d 14%); other plans report more, including a 5-hour one.

Privacy — no API keys, nothing leaves your PC

  • No API keys, no accounts, no signup. The Claude gauges reuse the Claude Code login already on your PC — the same request Claude Code makes when you run /usage. No Claude Code? They show "login required"; set STATSTRIP_CLAUDE=off to hide them.
  • The Codex gauges don't spend any of your quota. They ask your local codex CLI for your usage (account/rateLimits/read, the same call behind its /status), which runs no model and costs zero tokens.
  • Your stats stay on your machine. Hardware numbers are read locally and served only on 127.0.0.1. Nothing is uploaded, logged, or shared — there is no server, no telemetry, no third party.

Honest numbers

Most of the engineering here is about not showing a plausible wrong number. A usage gauge that quietly drifts is worse than no gauge, because you'll trust it.

  • Readings carry the instant they were taken, and the display ages them itself. A collector that wedges shows a reading growing visibly older ((3h ago)), never one frozen at "just now".
  • A window that has since reset shows reset, not a number known to be stale.
  • "Login required" is reserved for an actual missing login. A rate limit, a network blip, or an endpoint hiccup says usage unavailable instead — sending you off to re-authenticate for a problem that isn't about auth is a bug.
  • StatStrip backs off instead of making things worse. Claude's usage endpoint rate-limits; polling straight through a 429 keeps the limit alive, so failures back off exponentially and let it clear.
  • Anything outside a source's expected contract is refused, not guessed at — an unparseable timestamp, a percentage outside 0–100, a renamed field.

Configuration

All optional, set as environment variables before launching.

Variable Default Meaning
STATSTRIP_CLAUDE on on: real plan-limit % via Claude Code's usage API. estimate: ccusage heuristic over local logs, shown with a ~ prefix. off: hide the gauges.
STATSTRIP_CODEX on on: live % via codex app-server (zero tokens), falling back to Codex's session logs. log: session logs only — passive, but only as fresh as your last local Codex turn. off: hide the gauges.
STATSTRIP_TASKBAR 1 1: embed in the taskbar, left of the tray icons. 0: float a bar just above it.
STATSTRIP_ALIGN right Position in the taskbar: right hugs the tray icons; left hugs the left edge (use when the readout collides with Windows 11's centered app icons).
STATSTRIP_DISK_PATH C:\ Drive/path to report disk usage for.
STATSTRIP_PORT 5757 Local port the collector serves /stats on.
STATSTRIP_CORS (unset) Access-Control-Allow-Origin for /stats. Unset = no CORS header, so websites can't read your machine stats.
STATSTRIP_STATS_FILE %TEMP%\statstrip-stats.json Where the snapshot JSON is written.
STATSTRIP_LOCAL_REFRESH 2 Seconds between CPU/RAM/disk/GPU polls.
STATSTRIP_CLAUDE_REFRESH 60 Seconds between Claude usage polls.
STATSTRIP_CODEX_REFRESH 60 Seconds between Codex usage polls.
STATSTRIP_CLAUDE_BACKOFF_MAX 1800 Longest wait between Claude retries while its endpoint is refusing us.
STATSTRIP_CLAUDE_STALE_AFTER 600 Age past which a held Claude reading is shown with (… ago).
STATSTRIP_CODEX_STALE_AFTER 900 Same, for a log-sourced Codex reading.

Architecture

Two independent layers, so the data is reusable outside this app — point any script, dashboard, or website at the same local endpoint.

┌──────────────────┐      writes/serves       ┌─────────────────┐
│    collector     │ ───────────────────────▶ │  stats.json      │
│  (psutil/pynvml, │                          │  127.0.0.1:5757  │
│   Claude + Codex │◀───────── read only ─────┤      /stats      │
│      usage)      │                          └────────┬─────────┘
└──────────────────┘                                   │
                                             ┌─────────▼──────────┐
                                             │      display        │
                                             │ (taskbar bar, or    │
                                             │  your own consumer) │
                                             └─────────────────────┘
  • collector.py — extraction only. Polls hardware, Claude and Codex usage, then writes a merged snapshot to a JSON file and serves it on http://127.0.0.1:5757/stats.
  • display.py — consumption only. Renders the bar embedded inside the taskbar (TrafficMonitor-style, transparent, left of the tray icons). It has zero knowledge of collection internals — it's just one consumer of the feed.
  • claude_oauth.py — primary Claude source: the same endpoint Claude Code's /usage uses, authenticated with the token it already stores locally.
  • claude_local.py — opt-in estimate mode (STATSTRIP_CLAUDE=estimate): shells out to ccusage over your local logs and estimates against your own historical maximum (can exceed 100% — it's an estimate, not a plan limit).
  • codex_appserver.py — primary Codex source: asks codex app-server for account/rateLimits/read, the call the Codex TUI makes to refresh its own usage. Runs no model, so it's free to poll — and it reports your whole account, including Codex you ran on another machine.
  • codex_local.py — fallback Codex source (STATSTRIP_CODEX=log forces it): reads the rate-limit snapshot Codex writes into its session logs. Fully passive, but only sees turns run on this machine — measured 6 points behind the live figure — so its readings carry an age marker.

Anything else — a browser tab, another script, an Electron app — can hit the same /stats endpoint or read the JSON directly. (Browser pages need STATSTRIP_CORS; it's off by default.)

Development

Requires Python 3.9+ on Windows. NVIDIA GPU optional — it degrades gracefully.

git clone https://github.com/wassupjay/statstrip.git
cd statstrip
pip install .
statstrip-collector
statstrip-display

Run the tests (no dependencies beyond the package itself):

python -m unittest discover -s tests

Contributions welcome — issues and PRs both. The one house rule is the one above: a gauge must never show a number it can't stand behind. If a source fails, is stale, or returns something outside its contract, say so or say nothing.

License

MIT — see LICENSE.

Metadata

Release files for statstrip 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for statstrip 1.0.0
File Size Uploaded
statstrip-1.0.0.tar.gz 40.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for statstrip 1.0.0
File Interpreter ABI Platform
statstrip-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 69.3 kB

Release files / statstrip-1.0.0.tar.gz

Download URL statstrip-1.0.0.tar.gz
Size 40.6 kB
Tags Source
SHA-256 checksum
How to use checksums
f08b59c130b749d493b9b5ae8e292dd00d0938003a063ee0cbde73fe33b9750d
BLAKE2b-256 checksum
How to use checksums
ece2c01c13130a4636a01bb10565e2cbeeafad38842735d95597bee14fe3d2b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.15

Release files / statstrip-1.0.0-py3-none-any.whl

Download URL statstrip-1.0.0-py3-none-any.whl
Size 28.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
277d089840aff541f5c2066aada530d0238c2b6b09e642029fca16d52b765a3b
BLAKE2b-256 checksum
How to use checksums
301493a5fda224e1f7f5dc1f2ff9bce95d7fd25c002bf2733782e8345e06c9f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.15

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page