{"id":50664330,"url":"https://github.com/projectvelox/claude-usage-widget","last_synced_at":"2026-06-12T09:01:15.239Z","repository":{"id":362974066,"uuid":"1261473759","full_name":"projectvelox/claude-usage-widget","owner":"projectvelox","description":"Always-on-top floating widget that shows your claude.ai plan usage in real time. Cloudflare-immune OAuth auth via ~/.claude/.credentials.json. Windows-first, portable EXE, 7-day history graph, configurable thresholds and reset hooks.","archived":false,"fork":false,"pushed_at":"2026-06-11T02:42:52.000Z","size":3153,"stargazers_count":11,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-11T08:24:23.042Z","etag":null,"topics":["always-on-top","anthropic","claude","claude-ai","claude-code","claude-usage","claude-usage-widget","desktop-widget","electron","oauth","rate-limit","system-tray","usage-monitor","usage-tracker","windows"],"latest_commit_sha":null,"homepage":"https://github.com/projectvelox/claude-usage-widget/releases","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/projectvelox.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://paypal.me/joshuaoducado","https://github.com/projectvelox/claude-usage-widget/blob/main/SPONSOR.md"]}},"created_at":"2026-06-06T18:26:51.000Z","updated_at":"2026-06-11T07:41:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/projectvelox/claude-usage-widget","commit_stats":null,"previous_names":["projectvelox/claude-usage-widget"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/projectvelox/claude-usage-widget","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectvelox%2Fclaude-usage-widget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectvelox%2Fclaude-usage-widget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectvelox%2Fclaude-usage-widget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectvelox%2Fclaude-usage-widget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/projectvelox","download_url":"https://codeload.github.com/projectvelox/claude-usage-widget/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectvelox%2Fclaude-usage-widget/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34236552,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["always-on-top","anthropic","claude","claude-ai","claude-code","claude-usage","claude-usage-widget","desktop-widget","electron","oauth","rate-limit","system-tray","usage-monitor","usage-tracker","windows"],"created_at":"2026-06-08T05:00:42.636Z","updated_at":"2026-06-12T09:01:15.194Z","avatar_url":"https://github.com/projectvelox.png","language":"JavaScript","funding_links":["https://paypal.me/joshuaoducado","https://github.com/projectvelox/claude-usage-widget/blob/main/SPONSOR.md"],"categories":[],"sub_categories":[],"readme":"# Claude Usage Widget\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/demo.gif\" width=\"340\" alt=\"Demo: the widget responding to a usage tick. The Current session bar slides up from 42% to 91%, the dot turns red and pulses, and a desktop notification fires at the critical threshold.\" /\u003e\n\u003c/p\u003e\n\n**An always-on-top floating widget that shows your claude.ai plan usage in real time, on Windows.** Built specifically around the OAuth token Claude Code already keeps on your machine, so it cannot be broken by Cloudflare changes that take down cookie-scraping trackers.\n\n➡ **[Download the latest portable .exe](../../releases/latest)** — ~88 MB, single file, no install. Tested on Windows 11.\n\n\u003e First-launch note: the EXE is unsigned (we have applied for free open-source code signing through the [SignPath Foundation](https://signpath.org/) — once accepted, future releases will be signed by SignPath Foundation's certificate at no cost). SmartScreen will say \"Windows protected your PC.\" Click **More info → Run anyway**. One-time click per machine.\n\n\u003e **If your antivirus calls it `Trojan:Win32/Wacatac` or similar:** this is a known false positive that hits every unsigned Electron app (Discord, VS Code, Notion all had it before they signed their builds). The `!ml` suffix on the detection name means it came from Windows Defender's machine-learning heuristic, not a real signature match. To verify the file you have is identical to what I published:\n\u003e ```powershell\n\u003e Get-FileHash -Algorithm SHA256 .\\ClaudeUsageWidget-*.exe\n\u003e ```\n\u003e and compare against `SHA256SUMS.txt` on the [release page](../../releases/latest). If the hash matches you have the canonical build. The v0.2.17 release binary has already been independently scanned:\n\u003e\n\u003e - **Portable EXE** (`ClaudeUsageWidget-0.2.17-portable.exe`): [0 / 64 engines detected as malicious](https://www.virustotal.com/gui/file/27fa0046cef6ba50ee670116a067069aaba1513480de4f6fc1b50201b0c3d36f)\n\u003e - **Installer EXE** (`ClaudeUsageWidget-0.2.17-setup.exe`): [0 / 68 engines detected as malicious](https://www.virustotal.com/gui/file/de62ec183f7451db66c0f084591e136984b39d19dfabb278113cfba46b1836c3)\n\u003e\n\u003e Every signature-based engine on VirusTotal — including Microsoft's own — comes back clean. The Wacatac flag on real Windows machines comes entirely from Defender's cloud-delivered ML model (the `!ml` suffix), which doesn't run on VirusTotal's static scans. To work around it on your machine: Defender → **Virus \u0026 threat protection** → **Protection history** → restore + allow. Permanent fix (code signing via SignPath Foundation) is in flight — once it lands, this section goes away.\n\n## What it shows\n\nThe same bars as **Settings → Usage** on claude.ai, plus things they don't:\n\n- Current session (5-hour rolling window)\n- Weekly · all models / Sonnet / Opus / Cowork — whichever your plan exposes\n- Extra usage credits if your plan has a credit pool — with the dollar amount used and the monthly cap (e.g. `$225 of $5,000 used`), not just the percentage\n- Reset countdowns per limit\n- A **pace marker** on each bar — a vertical line that turns red when you're burning faster than the timer\n- An optional 7-day SVG history graph for any limit you pick\n- Threshold notifications and shell hooks that fire when a limit resets\n- A **pill / minimal mode** that collapses the widget to a tiny ~156×44 capsule showing just the worst-utilized limit %, ideal for non-developers who want ambient awareness without giving up screen real estate\n- **Claw'd**, a pixel-art crab mascot that walks the widget's bottom edge and reacts to your usage — strolls when you're fine, panic-skips with \"!\" marks at critical, sleeps with floating Zs when rate-limited, and gets grumpy if you click him while he's napping\n- **In-app update check** — once a day the widget pings GitHub Releases and surfaces a small `↑ v0.2.X` link in the footer when a newer build is out, so you never run a stale version without knowing\n\n## How it's different\n\n\u003e **TL;DR.** It's the only Windows widget that combines the Cloudflare-immune OAuth auth path with an always-on-top floating UX, a 7-day history graph, multiple tray icon styles, per-quota reset hooks, and a snapshot-tested parser.\n\n| Feature | This | jens-duttke | SlavomirDurej | thanoban | Usage4Claude | ClaudeMeter |\n|---|:---:|:---:|:---:|:---:|:---:|:---:|\n| OS | Win | Win | Win/Mac/Linux | Win | macOS | macOS |\n| OAuth Bearer auth (Cloudflare-immune) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |\n| Always-on-top floating widget | ✅ | ❌ tray | ✅ | ❌ tray | ❌ menu bar | ❌ menu bar |\n| 7-day history graph | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |\n| Multiple tray icon styles | 4 + dynamic | 1 | 1 | 1 | 1 | 6 |\n| Dynamic tray icon (reflects live state) | ✅ | ❌ | ❌ | ❌ | ❌ | partial |\n| Per-quota reset shell hooks | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |\n| Configurable warn + critical thresholds with per-state colors | ✅ | partial | ✅ | ❌ | ✅ | ✅ |\n| Desktop notifications at thresholds | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |\n| Adaptive polling (active / idle / deep idle / locked) | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ |\n| Reset-aligned refresh (bar zeroes the instant the window rolls) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |\n| Snapshot tests for the API response shape | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |\n| Codex / other-provider support | planned | ❌ | ❌ | ❌ | ✅ | ❌ |\n\nBuilt from the lessons learned across all of the above. Borrowed patterns:\n\n| Pattern | From |\n|---|---|\n| OAuth Bearer from `~/.claude/.credentials.json` | jens-duttke/usage-monitor-for-claude |\n| Adaptive polling tiers + 10 s manual-refresh debounce | jens-duttke + f-is-h/Usage4Claude |\n| Honor `Retry-After`, exponential backoff, stale-data badge | jens-duttke |\n| Re-read credentials on 401 (picks up token refreshes from other Claude Code sessions) | this project |\n| Always-on-top re-assertion every 30 s | niccolo-sabato/claude-usage-widget |\n| \"Essential\" compact layout | niccolo-sabato |\n| Light/Dark/System theming, draggable header, circular countdowns | SlavomirDurej/claude-usage-widget |\n| Configurable warn/critical thresholds + native notifications | eddmann/ClaudeMeter |\n| Pace marker / burn-rate indicator | jens-duttke + eddmann |\n| `on_reset_command` shell hook per quota | jens-duttke |\n| Multiple tray icon styles | eddmann/ClaudeMeter |\n\nWhat we explicitly **avoided**:\n\n- DPAPI Chrome cookie SQLite reads (thanoban) — breaks on every Chrome key rotation.\n- Hitting `claude.ai` directly from Node — Cloudflare blocks the runtime's TLS fingerprint.\n- Hardcoding three quota types — the OAuth endpoint returns a dynamic set; we iterate.\n\n## Install\n\nYou need [Claude Code](https://claude.com/claude-code) installed and logged in either way, because the widget reads the OAuth token it maintains at `~/.claude/.credentials.json`.\n\n### Windows — download the EXE\n\n1. Download the latest **portable .exe** from [Releases](../../releases/latest).\n2. Double-click it. SmartScreen → **More info → Run anyway**.\n3. Right-click the tray icon for options, or click the cog inside the widget for the full settings panel.\n\n### macOS, Linux, or anyone who'd rather build from source\n\nYou already have the perfect tool to set this up: your own Claude Code. Paste the prompt below into a Claude Code session and let it handle the install. Works on macOS (Apple Silicon and Intel), Linux, and Windows.\n\n````\nSet up the Claude Usage Widget from https://github.com/projectvelox/claude-usage-widget on this machine.\n\n1. Clone the repo into ~/Applications/claude-usage-widget (create the parent\n   directory if needed; on Linux feel free to use ~/.local/share instead).\n2. Run `npm install` in that directory.\n3. Run `npm start` and confirm the floating widget appears in a corner of my\n   screen. If it does, leave it running.\n4. If I ask for a redistributable binary, run `npm run build:mac` (macOS),\n   `npm run build:linux` (Linux), or `npm run build` (Windows) and tell me\n   the path of the artifact under dist/.\n\nIf Node 18+ is not installed, install it via Homebrew (macOS) or my system\npackage manager (Linux) after asking permission. Do not modify shell rc\nfiles. The widget reads ~/.claude/.credentials.json, so once it launches\nit should start showing live usage within ~60 seconds.\n````\n\nAfter the first run, you can use whichever pattern you prefer for re-launching:\n\n- macOS: double-click the built `.app` (inside the `.dmg`), or `npm start` from the cloned dir.\n- Linux: run the `.AppImage`, or `npm start` from the cloned dir.\n- Windows: double-click the portable `.exe`, or `npm start` from the cloned dir.\n\nTo make it auto-launch with your OS: open the widget, click the settings cog → **Startup → Start with [OS]**.\n\n### For developers\n\n```powershell\ngit clone https://github.com/projectvelox/claude-usage-widget\ncd claude-usage-widget\nnpm install\nnpm start\n```\n\n**Branch model.** `main` is the production branch — every tag-push there cuts a public release. `dev` is the working branch where day-to-day commits land. Pushing to `dev` runs the full test suite and, if green, opens (or updates) a single \"Promote dev → main\" PR. Merging that PR is the only path code takes into production.\n\n```powershell\ngit checkout dev                       # work here\n# edit, commit\ngit push origin dev                    # CI runs tests, opens promote PR if green\n\n# when you're ready to release:\ngh pr merge \u003cPR#\u003e --merge              # promote dev → main\ngit checkout main; git pull\nnpm version patch                      # bumps + tests + tags + pushes; CI builds + publishes\n```\n\n`npm version` runs `npm test` before bumping (preversion hook) and `git push --follow-tags` after (postversion hook), so a single command takes you from \"I have a fix on main\" to \"release is live.\"\n\n```powershell\nnpm test                 # parser snapshot tests + updater semver tests + display geometry tests\nnpm run icons            # regenerate the tray + window icons\nnpm run demo-gif         # regenerate assets/demo.gif (main demo)\nnpm run pill-gif         # regenerate assets/demo-pill.gif (minimal mode demo)\nnpm run layouts-png      # regenerate assets/layouts.png (layout comparison)\nnpm run trays-png        # regenerate assets/trays.png (tray icon styles)\nnpm run themes-png       # regenerate assets/themes.png (dark vs light)\nnpm run thresholds-png   # regenerate assets/thresholds.png (OK / warn / critical)\nnpm run history-png      # regenerate assets/history.png (7-day graph showcase)\nnpm run settings-png     # regenerate assets/settings.png (full settings panel)\nnpm run mascot-preview   # regenerate assets/claw-d.png + per-mood capture frames\nnpm run og-image         # regenerate the 1280x640 social-preview PNG\nnpm run build            # portable EXE in dist/\nnpm run build:installer  # NSIS one-click installer in dist/\n```\n\n## Make it yours\n\nThe widget is built to disappear into your workflow. Almost every part of how it looks, where it sits, and when it interrupts you is configurable from the settings cog — no config-file editing required.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/settings.png\" width=\"720\" alt=\"The full settings panel: Layout, Look, Tray icon, History graph, Thresholds, Notifications, Reset hooks, Startup, and About — every option visible on one screen.\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/layouts.png\" width=\"640\" alt=\"Four layout options side by side: Expanded (full bars + countdowns), Compact (tighter spacing), Essential (bars only, no chrome), and Minimal (pill showing worst limit only).\" /\u003e\n\u003c/p\u003e\n\n### Layout\n\nFour density modes, swap any time from the header chevron or settings:\n\n- **Expanded** — the full experience: header, bars, reset countdowns, pace markers, optional history graph.\n- **Compact** — header + bars, countdowns hidden. Saves vertical space.\n- **Essential** — tightest spacing, footer hidden, smaller fonts. (Pair with the \"Hide header\" toggle if you want bars-only with no chrome at all.)\n- **Minimal (pill)** — single capsule showing the worst-utilized limit's % and severity color. ~156×44 px. Click the chevron inside the pill to expand back. Designed for **non-developers who want ambient awareness without giving up screen real estate**.\n\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"assets/demo-pill.gif\" width=\"320\" alt=\"Pill mode animating from 30% (green) up through 78% (yellow warn) to 91% (red critical), then resetting.\" /\u003e\n  \u003c/p\u003e\n\nPlus: always-on-top, optional click-through (let clicks pass through the widget), show/hide header, pace marker, stale badge, reset countdown toggle.\n\n### Look\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/themes.png\" width=\"640\" alt=\"The widget rendered in Dark and Light themes side by side, showing the same data with different surface colors.\" /\u003e\n\u003c/p\u003e\n\n- **Theme:** System / Dark / Light, follows OS by default.\n- **Accent color:** pick any hex — recolors the bars, dots, and gauge.\n- **Opacity:** 40 – 100 % so the widget can sit unobtrusively over other windows.\n- **Corner radius:** 0 – 28 px (sharp corners to fully rounded).\n- **Font scale:** 85 – 160 %, plus optional custom font family.\n- **Background blur:** toggle the glass-blur backdrop on systems where it's expensive.\n\n### Tray icon\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/trays.png\" width=\"720\" alt=\"Five tray icon styles side by side: Bars (three stacked bars), Battery (fill level), Gauge (circular progress), Minimal (solid dot), and Dynamic (gauge tinted by live severity).\" /\u003e\n\u003c/p\u003e\n\nFive styles, all redraw live as your usage changes:\n\n- **Bars** — three stacked bars, abstract but on-brand.\n- **Battery** — fill level mirrors your worst utilization, just like a phone battery.\n- **Gauge** — circular progress arc.\n- **Minimal** — solid colored dot, severity-tinted.\n- **Dynamic** — picks the right representation automatically and colors it by the live worst-limit severity.\n\n### History graph\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/history.png\" width=\"360\" alt=\"The widget with the 7-day history graph expanded under the weekly bar: a smooth SVG sparkline shaded underneath, with the current % shown beside the series label.\" /\u003e\n\u003c/p\u003e\n\nToggle on/off. Pick any single limit to plot (all-models, Sonnet, Opus, session, or extra) — 7 days of samples, drawn as a smooth SVG sparkline inside the widget body.\n\n### Claw'd, the resident crab\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/claw-d.png\" width=\"900\" alt=\"Four panels showing Claw'd in each mood: ok (orange, casual stroll), warn (yellow with a blue sweat drop above his head), critical (red with red exclamation marks floating up), and paused (grey, slumped over with a floating cyan Z above his head).\" /\u003e\n\u003c/p\u003e\n\nA pixel-art crab inspired by the Claude mascot, recreated as a tiny SVG that ships with the code (no bundled assets). He walks back and forth along the widget's bottom edge and his mood mirrors your worst limit:\n\n| Mood | Trigger | What he does |\n|---|---|---|\n| **ok** | worst limit \u003c 75% | Casual 14-second stroll. Anthropic orange. |\n| **warn** | 75% – 90% | Hurried 8-second trot with a side-to-side wiggle. Tinted with your `--warn` color. A blue sweat drop beads above his head. |\n| **critical** | ≥ 90% | Panic-skip — 4-second fast run with intermittent anxious jumps and body tilt. Tinted with `--critical`. Three red \"!\" marks float up and fade. |\n| **paused** | rate-limited ≥ 2 min | Asleep. Body slumped at -22°, eyes closed as thin lines, slow breathing, three staggered Zs (small → large) drift up from his head. |\n\nHe also reacts to interaction:\n\n- **Click him** to make him hop (squish-jump-land in 0.45s).\n- **Click him while he's sleeping** and you get a random grumpy speech bubble (`\"5 more minutes…\"`, `\"Hmph.\"`, `\"Rude.\"`, etc.) instead of a hop. He goes back to sleep after 2 seconds.\n- When a quota actually resets, he stops walking and waves side-to-side for ~1.6s before resuming.\n\nToggle him on/off in **Settings → Layout → \"Show Claw'd\"**. Hidden automatically in pill and essential layouts where there's no room.\n\nOpen [`assets/claw-d-states.html`](assets/claw-d-states.html) in a browser to see all four moods animating side-by-side with interactive buttons — no app launch required.\n\n### Thresholds \u0026 notifications\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/thresholds.png\" width=\"720\" alt=\"The same widget rendered at three severity states side by side: OK (green bar + dot) at 32%, Warn (yellow) at 78%, and Critical (red) at 91% with a pulsing dot.\" /\u003e\n\u003c/p\u003e\n\n- **Warn %** and **Critical %** (defaults: 75 / 90) — controls when bars change color and when notifications fire.\n- **Per-state colors** for OK / warn / critical — fully customizable.\n- **Native desktop notifications** at warn level (optional) and critical level (on by default).\n\n### Reset hooks (power-user)\n\nRun any shell command when a specific quota window rolls over. The command gets these env vars:\n\n- `CLAUDE_RESET_ID` — which limit reset (e.g., `seven_day_sonnet`)\n- `CLAUDE_RESET_LABEL` — the human-readable label\n- `CLAUDE_RESET_AT` — the new reset timestamp\n\nUseful for: piping a notification to Slack, triggering a \"fresh start\" script, kicking off a batch job that was waiting on quota.\n\n### Startup\n\n- **Start with Windows** — registers the widget as a login item.\n- **Open hidden** — launch straight to the system tray, no widget popup on boot.\n\n---\n\nConfig persists to `%APPDATA%\\claude-usage-widget\\config.json`; history samples to `%APPDATA%\\claude-usage-widget\\history.json`.\n\n## Auth — and what we don't touch\n\nThe widget reads the OAuth access token that Claude Code already maintains. There is no separate login, no browser cookie scraping, no Cloudflare hassle.\n\nIf the token expires:\n\n1. The widget shows an `auth` badge.\n2. On the next poll, it re-reads the credentials file. If Claude Code (or another concurrent Claude session) has refreshed the token, the new value is used immediately.\n3. If the token is truly expired, run `claude` in a terminal to refresh, and the widget catches up on the next poll.\n\nThe token is sent only to `https://api.anthropic.com/api/oauth/usage` — Anthropic's official endpoint, and nothing else. See [SECURITY.md](SECURITY.md) for the full statement.\n\n## File layout\n\n```\nsrc/\n  main.js       Electron main process, IPC, tray, login items, reset hooks\n  preload.js    Sandboxed bridge between renderer and main\n  usage.js      OAuth Bearer fetch, normalize, auth-retry on 401\n  poller.js     Adaptive polling, reset detection, backoff\n  history.js    Append-only sample store, 7-day trim\n  config.js     Persisted settings + deep merge\n  icon.js       Pure-Node PNG encoder + 4 tray icon styles + dynamic gauge\n  updater.js    Daily check against GitHub Releases, semver compare, footer badge feed\n  geom.js       Pure rect-overlap helpers for rescuing the widget when a monitor disconnects\nrenderer/\n  widget.html / .css / .js     Always-on-top floating widget + SVG history graph\n  settings.html / .css / .js   Live-editing settings panel\n  demo.html                    Self-contained widget clone for GIF capture\n  demo-pill.html               Self-contained pill-mode clone for the pill GIF\nassets/\n  claw-d-states.html           Self-contained Claw'd mood preview (open in any browser)\ntests/\n  normalize.test.js   Snapshot tests against the live response shape\n  updater.test.js     Semver parsing + comparison for the GitHub Releases check\n  geom.test.js        Display-rect overlap math (monitor disconnect rescue)\nscripts/\n  launch.js             Strips ELECTRON_RUN_AS_NODE before spawning the GUI\n  build-icon.js         Pre-bakes tray + window + preview icons\n  build-demo-gif.js     Headless Electron capture + gifenc → assets/demo.gif\n  build-pill-gif.js     Same pattern → assets/demo-pill.gif (minimal mode)\n  build-layouts-png.js  Side-by-side layout showcase → assets/layouts.png\n  build-trays-png.js    Five tray icon styles, captioned → assets/trays.png\n  build-themes-png.js   Dark vs light theme comparison → assets/themes.png\n  build-thresholds-png.js  OK/warn/critical severity comparison → assets/thresholds.png\n  build-history-png.js     Widget + 7-day history graph → assets/history.png\n  build-settings-png.js    Two-column shot of the live settings panel → assets/settings.png\n  capture-mascot-preview.js  Headless Electron capture → assets/claw-d.png + per-mood frames\n  build-og-image.js     Headless Electron capture → assets/og-image.png (social card)\n.github/\n  workflows/release.yml        Builds the portable EXE on tag push\n  ISSUE_TEMPLATE/              Bug + feature templates\n```\n\n## Roadmap\n\n- Multi-account / multi-org switcher (cross-cutting top demand)\n- Codex usage alongside Claude (Usage4Claude has this, we want it)\n- Burn-down projection line on the history graph (\"at this rate, you hit 100% by Thu 6 pm\")\n- Mac and Linux builds in the same CI workflow\n- Signed Windows binary via [SignPath OSS](https://signpath.io/)\n- `winget install` distribution\n\nSee [open issues](../../issues) for the current state.\n\n## Changelog\n\n[CHANGELOG.md](CHANGELOG.md) is auto-regenerated from git history on every push to `main` by [`.github/workflows/changelog.yml`](.github/workflows/changelog.yml). Per-release notes (with download links and the SmartScreen blurb) live on the [Releases page](../../releases).\n\n## Contributing\n\nPRs welcome — please skim [CONTRIBUTING.md](CONTRIBUTING.md) first. Security issues go through [SECURITY.md](SECURITY.md), not the public issue tracker.\n\n## License\n\n[MIT](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprojectvelox%2Fclaude-usage-widget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprojectvelox%2Fclaude-usage-widget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprojectvelox%2Fclaude-usage-widget/lists"}