Releases: ZeuLeg/Claude-Usage-Monitor
Release list
v0.14.0
Highlights
Reliability fixes
- Widget no longer falls behind other windows — topmost status is re-asserted every 2 seconds (Windows 11 silently demotes topmost layered windows)
- Widget no longer jumps to the left edge of the screen when the tray area can't be located; it now falls back to the taskbar's right edge or keeps its current position
- Widget repositions correctly after display/DPI changes and explorer restarts
Notification timing
- Session-reset notification now fires when the timer actually elapses, not minutes later when the API reports the next window
- No more spurious reset notification on app startup
New: usage insights
- Burn-rate tracking with depletion estimate — if your current pace will hit the limit before the session resets, the widget shows a warning like
~1h20m - Optional weekly Opus breakdown on the 7d row (shown when your plan reports it)
- New
HighUsageCooldownMinutessetting: repeat high-usage alerts at a chosen interval instead of only once per window
Usability polish
- Left-click the tray icon to refresh, double-click to open notification settings
- Clearer pace indicator: subtler on-pace band with an explicit "you should be here" marker
- Clearer startup state (
load…instead of...), tidier notifications dialog with an explanatory tooltip on Test Notification - Settings-file parse failures are no longer silently swallowed
Full Changelog: v0.13.0...v0.14.0
v0.13.0
v0.12.0 — Configurable usage threshold + simpler notifications
Full Changelog: v0.11.0...v0.12.0
v0.11.0 — Phone notifications + on-pace band
New features
Phone notifications (ntfy.sh + shell command)
Get notified on your phone when:
- 5h session or 7d weekly reaches 90% (high usage warning)
- Limit reached (~100%) — with reset time
- Quota resets — new window starts
Open Notifications… from the tray menu to configure:
- ntfy topic: enter a topic name, subscribe to the same topic in the ntfy app on your phone
- Shell command: run any command on notification (supports
{message},{event},{percent},{quota}placeholders) - Toggle each event type on/off independently
Zero-config: if ntfy/shell fields are left empty, only Windows balloons fire (existing behavior).
Grey on-pace band in the taskbar widget
The progress bars now show a grey ±5% band centered at the expected (linear-pace) usage for the current time window. This is the visual equivalent of the existing ▲/•/▼ pace glyph:
- Fill ends left of band → under pace (green ▼)
- Fill ends within band → on pace (yellow •)
- Fill ends right of band (band disappears) → ahead of pace (red ▲)
Changes
- New:
src/Infra/Settings.cs— JSON settings inLocalAppData/ClaudeUsageMonitor/settings.json - New:
src/Polling/NotificationEvaluator.cs— stateful edge-trigger event evaluator (tested) - New:
src/App/Notifier.cs— balloon + ntfy HTTP POST + shell command dispatch - New:
src/Ui/NotificationsDialog.cs— settings dialog - Changed:
src/Ui/TaskbarWidget.cs— grey on-pace band inDrawSolidBar - Changed:
src/App/MainForm.cs— removedMaybeAlert, wired evaluator/notifier, added menu item
v0.10.2 — Suppress false login prompt on wake
Bug fix
Spurious "run claude login" balloon on wake from sleep — fixed.
After waking from sleep, the network isn't always immediately available. The first token refresh attempt could fail due to a network error, which set the 5-minute throttle. If the app then received a 401/403 while the throttle was still active, it declared the token permanently invalid and showed the "run claude login" balloon — even though a successful refresh was only a few minutes away (as confirmed by logs).
Root cause: ForceRefreshAndGetAsync returned null for both "throttled" and "actually failed" cases. The caller (UsagePoller) couldn't tell the difference and always raised AuthExpired.
Fix: TokenRefresher.TryRefreshAsync now returns a RefreshResult enum (Success, Throttled, Failed). When the reactive refresh is throttled, the poller backs off silently. AuthExpired is only raised when a refresh was genuinely attempted and failed — meaning credentials are revoked or the user is not logged in.
v0.10.1 — Fix UI freeze on wake from sleep
Bug fix
Tray menu unresponsive after wake from sleep — fixed.
After waking from a long sleep, the OAuth token is always expired. The token refresh code (claude auth status → claude update) used a synchronous WaitForExit call that blocked the WinForms UI thread for up to 75 seconds. During this time the tray menu appeared to open but clicks were silently queued and never processed. Closing and reopening the app resolved it because the token had been refreshed.
Root cause: TokenRefresher.RunClaudeAsync called the blocking proc.WaitForExit(timeoutMs) from the UI thread (timer callback path). No await yielded control back to the message loop during that wait.
Fix: Replaced WaitForExit with await proc.WaitForExitAsync(linkedCts.Token), using a CancellationTokenSource.CancelAfter for the timeout. Both stdout and stderr pipes are drained concurrently so child processes never stall on a full buffer. On timeout, Kill(entireProcessTree: true) cleans up any spawned child processes.
Also warms up ClaudeCodeInfo.Version off the UI thread at startup, eliminating a secondary 3-second block on the very first poll.
v0.10.0 — Automatic token refresh
What's new
- Automatic OAuth token refresh — token expires every ~8 hours but the app now self-heals. Before each poll the app checks
expiresAtand, if expired, delegates to the officialclaudeCLI (claude auth status→claude update) to refresh. No credentials are written directly. After a singleclaude login, the app stays logged in indefinitely. - Reactive 401/403 recovery — if the token expires between the expiry check and the HTTP call, the app performs an emergency refresh and retries the fetch automatically. Only shows the "run claude login" balloon if refresh genuinely fails.
- Source priority fix —
CLAUDE_CODE_OAUTH_TOKEN(set viaclaude setup-token) was previously read first and shadowed the working credentials file, causing HTTP 403 (user:profilescope required). Now: Credential Manager → credentials file → env var (last resort, with a scope warning in the log).
Upgrade
If you previously set CLAUDE_CODE_OAUTH_TOKEN, remove it — it's no longer needed and caused HTTP 403 on the usage endpoint:
reg delete "HKCU\Environment" /v CLAUDE_CODE_OAUTH_TOKEN /f
Then restart the app. One claude login is all you need going forward.
v0.9.0
v0.8.0
v0.7.0
What's Changed
New Contributors
Full Changelog: https://github.com/ZeuLeg/Claude-Usage-Monitor/commits/0.7.0