Repository navigation
Releases: mlcousek/claude_trayapp
Release list
Claude Usage Tray 0.1.6
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.6-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.6-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
ef2e616c7baf1545efe8888b2f3084e59f1b5a2db2ba9ebc2b124ee853ee70af ClaudeUsageTray-0.1.6-win-arm64.zip
13e8a04189f9a9958326d9552e7e134b58dca842615035fc55ff9d51c18aad20 ClaudeUsageTray-0.1.6-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.6-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.6-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.6
Fixed
- A rate-limit answer asking to retry after hours could stop polling for that long;
Retry-Afteris now honoured
only up to the 30-minute backoff cap. - Launching the app a second time while the first instance was still starting could do nothing at all; the second
launch's request to show the flyout is now kept until the first instance is ready for it. - A Claude Code CLI refresh that timed out could leave an unobserved error behind in the background.
- The release zip's README described the pre-0.1.3 behaviour: it now mentions the automatic token refresh, Start with
Windows being on by default, the weekly update check and the two registry values the app writes.
Full Changelog: v0.1.5...v0.1.6
Claude Usage Tray 0.1.5
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.5-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.5-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
1b6b682c9fb22955cc1b5db0ca3ea2b8877c56537a1a47bc11427d35078759cb ClaudeUsageTray-0.1.5-win-arm64.zip
078e44832f984680c58082b57974982e73513908d725f49ef660f4c9a5f6995d ClaudeUsageTray-0.1.5-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.5-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.5-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.5
Fixed
- Using only the Claude Desktop app left the percentages frozen: the access token in Claude Code's credentials file
lives about eight hours and only the Claude Code CLI renews it, while the Desktop app signs in on its own and the
Claude Code it hosts gets its token from the Desktop app, so the file went stale and every poll and manual refresh
reported an expired sign-in until the CLI happened to be started. The app now starts the CLI once in the background
when the token has expired (print mode with its input closed, so it renews the sign-in and exits without sending a
prompt, starting an MCP server or writing a session file), reads the file again and carries on. The attempt is
throttled to one per minute, killed after ten seconds, and never touches the file or an OAuth endpoint itself. It
finds the CLI on PATH or, failing that, the build bundled with Claude Desktop, and says so when neither exists. - The expired and signed-out messages now say to run the Claude Code CLI instead of "open Claude Code", which
opening the Desktop app does not satisfy.
What's Changed
- fix(credentials): Renew credentials automatically by @matejdrlik in #5
New Contributors
- @matejdrlik made their first contribution in #5
Full Changelog: v0.1.4...v0.1.5
Claude Usage Tray 0.1.4
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.4-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.4-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
e164411372d51489b036275c1e30cc0f77af6f2c51f59a7484ad6f8e8c34e4fc ClaudeUsageTray-0.1.4-win-arm64.zip
22e6b104d0f0ba3807fc9e5a8ac6b0aa91a0ddacf63055cf80c13f97988afe3b ClaudeUsageTray-0.1.4-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.4-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.4-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.4
Fixed
- With monitors at different scaling (a 200 % laptop screen beside 100 % displays), or after reconnecting monitors,
the flyout could open half its width and as tall as the screen, with the Refresh and Settings buttons stretched to
fill it, and stay that way until the app was restarted. Moving to a monitor with another DPI made Windows rescale
the window, which WPF applies as a manual resize: the width was halved and the height stopped following the
content. The flyout now steps onto the target monitor before measuring itself, puts its width and content-driven
height back before every placement and after every DPI change, ignores the resize events its own placement causes
instead of re-placing in a loop, and stays anchored to the icon it was opened from rather than to wherever the
cursor is when the DPI changes.
Full Changelog: v0.1.3...v0.1.4
Claude Usage Tray 0.1.3
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.3-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.3-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
72f26ce3c2993bd6e539070b2a4f925529f6a468aa2c5eb89ed849b11acca124 ClaudeUsageTray-0.1.3-win-arm64.zip
ad48308684539e20eecd667ff7af65450667a33c796ac751d7d98f45dccec881 ClaudeUsageTray-0.1.3-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.3-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.3-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.3
Added
- The app now starts with Windows by default. The first launch creates the per-user startup entry and records
that it has done so, so it happens exactly once: clear Start with Windows and it stays cleared. Nothing
is elevated, and the entry is still the sameClaudeUsageTrayvalue underHKCU\Software\Microsoft\Windows\CurrentVersion\Run
it always was.
Changed
- Start with Windows has moved to a Startup section at the top of the Settings window, where it is the
first thing you see, instead of sitting inside Tray icon. The note beside it now appears only when
Windows refuses the change. - The startup entry sits behind an
IAutostartEntryinterface, so the behaviour around it is covered by tests
that never touch the real registry.
Fixed
- A damaged
history.dbstopped everything that reads it: every session-log scan failed and the flyout's charts
froze on stale data, which looked like history not being saved at all (database disk image is malformedin the
log). The app now checks the file once at start; a damaged one is set aside ashistory.corrupt-<time>.db, never
deleted, and a fresh database starts with every history row and usage event that can still be read. Usage events
refill from the session logs; the percentage history cannot, which is why it is salvaged. - Each chart now loads on its own, so one failing query leaves only that chart empty instead of freezing them all.
- Screenshot runs (
--capture-flyout,--capture-settings) no longer run the session-log scanner, the history
recorder or the update check, and never rebuild the database. They skip the single-instance check, so they can run
beside the real app, and a second process writing the live database is the prime suspect for the damage.
Added (tests)
LocalAnalyticsProvider, previously untested: the initial scan, the file watcher, manual rescans, the safety-net
rescan when the session-log folder appears later, debouncing of rapid requests, a failing scan that is logged
without stopping the loop, and prompt shutdown.UpdateCheckService: nothing is asked while the setting is off or before a check is due, a release is announced
once and a later one in its turn, and a failed or throwing check is recorded without an announcement.SettingsCoordinator: retention and the scanner cutoff applied at start without pruning, an immediate prune on a
retention change, and a pricing file that reloads only when its path really changes.UpdateNotifier,IconConverter, the ring and chart geometry helpers, and the note-line visibility converter.
Full Changelog: v0.1.2...v0.1.3
Claude Usage Tray 0.1.2
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.2-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.2-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
35aca6f5533cd1a28a7f597e3901792f0ca4d1f43d70fe56821ffe90ce5f1c1a ClaudeUsageTray-0.1.2-win-arm64.zip
a1a31e53d4dae24152869c2406daa3d51024e0fda19468aff94eafdf9a062d4d ClaudeUsageTray-0.1.2-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.2-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.2-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.2
Added
- An update check: once a week the app asks GitHub whether a newer release exists and says so once in a tray notification. It sends nothing about you, downloads nothing, and can be turned off under Updates in Settings, which also shows the version you are on and links to the releases page.
- winget manifests under
packaging/winget/, validated locally, plusdocs/packaging.mdcovering both the winget submission and the SignPath code-signing setup that would end the SmartScreen prompt.
Changed
- When the usage endpoint answers with readable JSON that carries no usage windows at all, the app now says the format may have changed and suggests checking for a newer version, instead of showing the same "percentages unavailable" as a network outage. The log records the top-level keys it saw, which is what a diagnosis needs.
Fixed
- A rapid double refresh (for example a UI double-click) could leave a spare wake-up signal behind and fire one extra fetch on the next cycle, ignoring the manual-refresh floor; the leftover signal is now drained. A
Task.Delaystarted for a wait that ended early (a refresh or an options change) no longer keeps running unobserved for up to 30 minutes. - Today's totals and the daily chart used the offset in force now to find local midnight, which is wrong by the DST delta on a transition day; midnight is now computed for the correct offset.
- A
pricing.jsonentry missing (or misspelling)inputoroutputwas silently priced at $0 instead of "cost unknown"; such an entry is now skipped, matching how an unrecognized model id is already handled. - The three main view models were never disposed when the app quit, so a background poll or scan event could still fire while the host was tearing down the SQLite store; they are now disposed before the host stops. A second launch signalling in the last instant of shutdown could throw past a closed flyout window; it is now guarded.
- The "extra usage" progress bar was bound to a
Statusproperty that does not exist on its data context (silent, no visible effect, but a continuous binding-error trace); it now uses its own style. --capture-settingssilently skipped forcing a solid background because the helper only looked for aBorderdirectly underWindow.Content; it now finds the settings window's root through itsScrollViewer.
Added (tests)
- Regression and gap-filling tests from a full code review: the manual-refresh floor, the DST-safe day boundary, the pricing fallback,
JsonShapeDescriber's PII redaction,UsageAggregator,UsageSnapshotFormatter,EpochTime, the JSONL scanner's locked-file path,SingleInstance,TrayIconController.IconPixelSize,UsageWindowViewModel's status text and sparkline gating, andTrayIconViewModel.Applydriven through a real instance.
Full Changelog: v0.1.1...v0.1.2
Claude Usage Tray 0.1.1
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.1-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.1-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
db48a19c7c2a55b29a0fd33a553ef5d9b219561ec2bd5027cc732eb2d7192e57 ClaudeUsageTray-0.1.1-win-arm64.zip
0c2da8fe491cff7fc8ab9b5d7ab15e4f4e8eadb647e2a76ae32e44fe9ad5362e ClaudeUsageTray-0.1.1-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.1-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.1-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.1
Added
- Settings to hide the extra-usage line (
showExtraUsage) and to show the endpoint's inactive codename windows (showInactiveWindows). - An icon of the project's own (a terracotta ring on a dark tile, drawn by
tools/make-icon.py) for the executable and the settings window.
Changed
- Defaults: the flyout now starts with the endpoint's numbers only.
showLocalAnalyticsandshowExtraUsagedefault to off (maskEmailstays on); turn them on in Settings. - Codename windows the endpoint reports at 0 % with no reset time (for example "Nimbus quill") are hidden by default in the flyout, the tooltip and the history chart; the documented windows are always shown.
Full Changelog: v0.1.0...v0.1.1
Claude Usage Tray 0.1.0
Unofficial tool. Claude Usage Tray is a community project. It is not affiliated with, endorsed by, or supported by Anthropic. It relies on an undocumented endpoint that can change or stop working at any time.
Downloads
| File | For |
|---|---|
ClaudeUsageTray-0.1.0-win-x64.zip |
Windows 11 on x64 |
ClaudeUsageTray-0.1.0-win-arm64.zip |
Windows 11 on Arm64 |
Unzip anywhere and run ClaudeTrayApp.exe: no installer, no .NET runtime to install, no admin prompt. The executable is not code-signed, so SmartScreen may ask once (More info, Run anyway). Claude Code must be installed and signed in; the app reads its token and never writes to ~/.claude.
SHA256 checksums
7062d5295f78535abc144817b7857cdd925078421b870960a7898bdcec409a4d ClaudeUsageTray-0.1.0-win-arm64.zip
4bd44781500cec2659979958f2c4ff849cd537683e680bd220e549d0f085b5df ClaudeUsageTray-0.1.0-win-x64.zip
Verify before unzipping with Get-FileHash .\ClaudeUsageTray-0.1.0-win-x64.zip in PowerShell or certutil -hashfile ClaudeUsageTray-0.1.0-win-x64.zip SHA256 in Command Prompt, and compare with the line above (SHA256SUMS.txt is attached as well).
Changes in 0.1.0
First release. Everything below is new in this version.
Added
- Release workflow (
.github/workflows/release.yml) onv*tags: builds and tests the tagged commit, publishes the self-contained single-file exe for win-x64 and win-arm64 with the version taken from the tag, zips each withpricing.json,LICENSE.txtand a shortREADME.txtasClaudeUsageTray-<version>-win-<arch>.zip, writesSHA256SUMS.txtand creates the GitHub release with the checksums, this file's section for the version and the generated notes in its body. A re-run for an existing release replaces its assets and notes. - Settings window (tray menu, or the Settings button in the flyout) backed by
%APPDATA%\ClaudeTrayApp\settings.json, written with defaults on first run and hot-reloaded: poll interval (floor 180 s, applied to the wait in progress), the window shown in the tray icon, history chart range, history retention with a Clear history action, threshold notifications (off by default, each threshold once per window and period), show or hide local analytics, mask email, theme override, pricing file path. A file that does not parse is left untouched and reported. - Start with Windows: an opt-in, per-user Run entry, toggled from the tray menu (checkable) or the Settings window.
- One instance per session: a second launch opens the running instance's flyout and exits.
- Windows notifications from the tray icon when a usage window passes a chosen threshold.
--capture-settings <png>development switch.- Charts in the flyout, drawn by hand from theme brushes (no charting package): the current 5-hour block with its recorded percentages, a dashed projection at the current pace and the projected limit marked when it lands before the reset; utilization history of every window over 24 h, 7 d or 30 d; tokens per day for the last two weeks, split by model on request. Hover readouts, a one-sentence text equivalent per chart, peak-preserving downsampling, and an honest "no data yet" state. Sparklines in the hero and in every window row.
- The flyout re-places itself when its height changes, never grows past the work area (the body scrolls instead), and loads chart data off the UI thread only while it is visible.
- Local analytics from Claude Code session logs: incremental JSONL scanning with per-file offsets in SQLite, deduplication by message id and request id, tolerant of malformed and half-written lines and locked files, near-live updates through a debounced file watcher. Derives today's tokens, per-model and top-project breakdowns, the current 5-hour block's burn rate and, from the endpoint's own percentage, when the limit lands relative to the reset.
- Data-driven pricing:
pricing.jsonnext to the binary with an effective date shown in the UI; unknown models show "cost unknown", never a number. - History: every fresh snapshot is recorded per window in
history.dbwith 90-day retention and pruning; the aggregator labels the source of every figure. - Flyout sections for pace and projection, Today with API-equivalent cost and a details disclosure by model and project, and a footer line naming the sources.
- Flyout: an acrylic tool window anchored to the taskbar edge next to the icon, DPI aware (PerMonitorV2 manifest), dismissed by click-outside or Esc, never in Alt-Tab, warmed up so it opens in under 150 ms. The 5-hour window is the hero: a large Claude-coloured ring with the percentage, a plain-language status, the reset countdown and clock time; other windows are compact rows; extra usage, status banner, honest "percentages unavailable" state, and a footer with relative time, Refresh and Settings.
- Account header from Claude Code's
.claude.json(read-only): plan tier and the email, masked by default with a Show/Hide toggle. --capture-flyout <png>development switch for screenshots without the account line.- Tray icon rendered at runtime: ring-arc of the primary window around a compact numeral, colour by status, dimmed when stale, redrawn on data, DPI and theme changes, legible at 16 px on light and dark taskbars.
- Right-click menu with Refresh (debounced, explains refusals in a notification), Open logs, About and Quit; Settings and Start with Windows are placeholders until milestone 7.
- Theme tokens (
Theme.xaml) with dark and light palettes that follow the Windows apps and taskbar settings. - Crash logging for UI-thread, app-domain and unobserved task exceptions.
--render-icons <dir>development switch that writes icon contact sheets.- Usage domain model (
UsageSnapshot,UsageWindow,OverageInfo) with humanised window names, status thresholds and locked-window support. - Credential discovery from Claude Code's credentials file: read-only, honours
CLAUDE_CONFIG_DIR, parses only the Claude OAuth section and never the MCP tokens, detects expiry. - OAuth usage provider sending the headers Claude Code sends, with defensive schema parsing (unknown windows still render, extra usage scaled from minor units) and a one-time redacted shape log.
- Polling state machine: 180 s floor, exponential backoff capped at 30 minutes, Retry-After honoured, debounced manual refresh, cached snapshot served on launch.
--probeswitch: one live fetch, redacted summary in the log, exit code 0 or 2.- Solution scaffold:
ClaudeTrayApp.Core(net9.0),ClaudeTrayApp(WPF, net9.0-windows) and xunit.v3 tests with Shouldly and NSubstitute. - Shared build settings (
Directory.Build.props), central package management,global.jsonSDK pin,.editorconfigenforced bydotnet format. AppPaths: resolves app folders and the Claude Code home from the environment, honouringCLAUDE_CONFIG_DIR.- Composition root with generic host and Serilog rolling file logs in
%LOCALAPPDATA%\ClaudeTrayApp\logs. - Architecture test that fails the build if Core references a UI assembly.
- CI workflow (build, test, format check on Windows), Dependabot, issue templates.
- Documentation:
CLAUDE.md,docs/architecture.md,docs/data-sources.md, Mermaid diagrams.
Changed
AppPathshonoursLOCALAPPDATA,APPDATAandUSERPROFILEwhen the process has them set to rooted paths, falling back to the shell's known folders otherwise, so a run can be pointed at a fresh profile (used to verify the not-signed-in, expired-token and offline states against the published exe).
Fixed
- Single-file publish failed with IL3000: the Start with Windows wiring fell back to
Assembly.Location, which is empty in a single-file app. It now falls back to the exe next toAppContext.BaseDirectory. - Core awaits use
ConfigureAwait(false)and the host starts and stops off the UI thread, so quitting no longer waits five seconds for the polling loop.
Full Changelog: https://github.com/mlcousek/claude_trayapp/commits/v0.1.0