chore: release 0.9.24

This commit is contained in:
iamtoruk 2026-09-04 02:05:03 -07:00
parent f908b520f2
commit a0e0b9f866
13 changed files with 67 additions and 22 deletions

View file

@ -1,9 +1,53 @@
# Changelog
## Unreleased
## 0.9.24 - 2026-09-04
### Added
- **The CLI now computes the anonymous usage aggregate the desktop app and the Windows tray send, so both report the identical shape.** `codeburn status --format menubar-json` gains a `telemetrySnapshot` block (schema 2) built by `src/telemetry-snapshot.ts` from the payload and its own turn-level reports. Its headline signal is the model x task cross: up to 8 models, each with a cost bucket, a turn bucket, a one-shot rate and up to 6 task categories with their share of that model's turns, alongside up to 12 task categories with their top models, providers, MCP servers, skills, tools, a session count and median-length bucket, and cache-hit and retry-tax shares. Every magnitude is a bucket label, never an exact dollar amount, count or duration, and every name is a model or configuration identifier: nothing in the block is derived from a working directory, project name, branch name, file path or message text. The desktop app sends the block verbatim as the once-daily `usage_snapshot` event when the CLI provides it and falls back to its own renderer-side builder for an older CLI, and it adds five name-only interaction events (`optimize_apply`, `plan_set`, `export`, `compare_view`, `settings_change`). Telemetry remains consent-gated behind the onboarding screen, off by default in the EU/EEA/UK/CH, and switchable at any time in Settings > Privacy & data; README documents exactly what each event carries. `STATUS_SNAPSHOT_VERSION` moves to 4 so persisted status snapshots re-derive with the new field.
- **Bundled pricing is refreshed for this release.** The primary LiteLLM snapshot moves from 4669 to 4739 models: 71 added, 1 removed (`azure_ai/deepseek-v4-flash-0731`, re-added under LiteLLM's new casing) and 18 repriced. The fallback table moves from 200 to 203 rows: 4 added (`claude-fable-5.1:batch`, `gemini-3.8-flash:batch`, `glm-flash-latest`), 1 removed and 4 repriced. Among models CodeBurn users actually run, `kimi-k2.5`, `kimi-k2.6` and their Azure rows plus `azure_ai/deepseek-v4-flash` and `azure_ai/deepseek-v4-pro` gain a cache-write price; `deepseek-v4-flash-0731` moves to $0.20 input and $0.40 output per million; `mistral-medium`, `magistral-medium-latest` and `magistral-small-latest` are repriced with a cache-write rate added; `Qwen/Qwen3.8-2.4T-A95B` drops to $2.00 input and $6.00 output per million with its cache-write rate halved; and `gpt-realtime-2` output rises from $16 to $24 per million. New rows of note are `gemini-3.8-flash`, `grok-build-latest`, `gpt-6-astra`, `glm-5p3-flash`, `azure_ai/kimi-k2.7-code` and the us-gov Bedrock Claude Opus 4.8 and Sonnet 5 rows. (#1254)
- **`codeburn quota` prints live capacity for every coding tool you are signed in to on this machine.** The new command lists each provider's quota windows as a table, or as machine-readable output with `--format json`. Ten adapters ship with it: Antigravity, Claude, ClinePass, Codex, Copilot, Cursor, Gemini, Grok, Kimi and Z.ai. It landed together with the Windows Capacity Dock, which is its first consumer. (#1228)
- **A provider that records tokens but no dollar cost stays visible in the agent tabs.** The tabs filtered strictly on `cost > 0`, so Hermes on a flat subscription, free-tier models and any unpriced model vanished from the strip even though their usage existed. The menubar payload now carries a per-provider activity signal and the tab strip keys visibility off that instead: a provider with real usage stays listed at $0 recorded cost, while a provider merely discovered on disk stays hidden. The same rule is applied across the macOS menubar, the Electron renderer and the Windows payload, and an older payload without the signal keeps the previous detected-provider behaviour. (#1214) Thanks @MiguelMachado-dev.
### Added (macOS)
- **The Capacity Dock hover panel is now a glance card with running sessions, today's spend and every quota window.** The panel opens with the provider's logo, name and plan, then one pill per running session showing project and branch, model and elapsed time, context used and tokens left; the pill fills left to right to the context percentage in a severity tint, pills idle for more than two minutes dim, and the list scrolls past four. Below it a Today row reports what that provider burned with input, output and call count, and a column per quota window the provider reports gives the percent used, its label and the reset time, in four severity bands (yellow at 70, orange at 80, red at 90). Feeding it, `codeburn status --format menubar-json` gains an add-only `liveSessions` block covering sessions active in the last 10 minutes with model, branch, context tokens and window, start, last activity and `idleSeconds`, stripped by `sanitizeForSharing` and the MCP redactor, and costing about 115 ms warm on roughly 6900 transcripts. The Today figures are the hovered provider's, not the machine's: `providerDetails` entries gain optional `inputTokens`, `outputTokens` and `sessions` (absent rather than zero until a day reports them, `STATUS_SNAPSHOT_RENDER_VERSION` moves to 5), the section hides rather than borrow a global figure when the payload carries no breakdown, and a tile that stands for more than one CLI row now sums them, so Cursor covers `cursor` and `cursor-agent`, ClinePass covers `cline` and `cline-cli`, and Droid maps onto `droid`. The staleness line gets its own band with the same inset, padding and divider as every other block instead of sitting crammed under the header, and the panel now appears when a full-screen app is frontmost, where it had been ordered into a space you were not looking at and could be covered by any floating window. (#1237, #1246, #1247, #1249)
- **The macOS menubar can show your Grok Build quota.** A native adapter reads the Grok CLI's own `auth.json` under `$GROK_HOME` read-only, keeps the bearer token in memory for the request only over an ephemeral cookie-free session, and never copies the credential into CodeBurn storage. It offers the same single-click connection flow as the other local providers and surfaces plan, quota usage, reset timing and actionable connection errors. (#1222) Thanks @avs-io.
- **The macOS menubar can show your Z.ai Coding Plan quota.** A native adapter surfaces the 5-hour and weekly credit windows in Settings and the Capacity Dock, reusing an existing Pi Z.ai login read-only with a provider-scoped Keychain override as the fallback. A follow-up reads Z.ai's body-level `code` and `success` fields before parsing limits, so a rejected login is reported as an authentication error rather than a parse failure when the HTTP status is 200 but the body carries 401 or 403. (#1202, #1204) Thanks @MiguelMachado-dev.
- **The macOS menubar can show your Cursor quota.** A CodeBurn-owned adapter discovers the existing Cursor app session in one click, reads Cursor's state SQLite read-only with a WAL-aware immutable fallback, validates the local token's subject and expiry, and keeps the token in memory only with no CodeBurn Keychain copy and no dependency on another provider's runtime. Monthly, Auto, API, on-demand and team-pool usage are normalized for the Capacity Dock, and Cursor appears as a live provider in Settings. (#1174) Thanks @avs-io.
- **The Capacity Dock size slider goes down to 60 percent.** The lower bound moves from 70 to 60 percent in the same 5-point steps, and a persisted value below the old bound clamps to the new one. (#1209)
### Added (Windows)
- **Windows gets a Capacity Dock, the edge-docked quota rail the macOS menubar has.** A second frameless, transparent, always-on-top window rests against a screen edge with one capacity ring per provider reporting `available: true`; hovering widens the same window into a detail panel listing every quota window per provider with its label, percent used, plan and reset countdown, and the glance bubble from the macOS dock is there too. The dock drags and snaps to any of the four edges, slides in and out from the edge, persists its placement, and has settings for scale, edge, shades and gauge shape. Data comes from `codeburn quota --format json`, refreshed every five minutes and on demand by double-clicking the rail; a CLI too old to have the `quota` subcommand shows a quiet "CLI update needed" line instead of an error storm. The tray menu gains a "Show Capacity Dock" checkbox, off by default and persisted to `~/.config/codeburn/windows-dock.json`, and switching it off closes the window outright rather than leaving a hidden live view running. The desktop app bundles and installs the tray MSI, owns the Menu bar and Sidebar switches in its bottom-left corner, shows the tray's Menu bar and Capacity Dock settings when they are on, and lists Plugins as coming soon on Windows; the Store route ships the tray exe inside the AppX. A second launch of the tray app could also deadlock it during startup and leave every later launch, `--quit` included, stuck as a windowless process; the single-instance callback now defers to the event loop and the desktop app waits for a quit to finish before relaunching. Verified on a Windows 11 ARM64 VM with installed release builds; multi-monitor and mixed-DPI behaviour is unverified on that single-display machine. (#1228)
### Changed
- **The Linux snap now asks for only the paths its parsers actually open, and one credential file moved off the automatic grant.** `$HOME/.claude/.credentials.json` leaves the auto-connect `ai-agent-session-logs` plug and becomes its own read-only single-file `claude-quota-credentials` plug with no auto-connect requested, so the optional Claude plan and quota tile now needs `snap connect codeburn:claude-quota-credentials` once; it already degrades gracefully when the file is unreadable. `~/.config/github-copilot` is removed entirely because it holds the Copilot OAuth credential files, so JetBrains Copilot sessions are not discovered under the snap, which `docs/providers/copilot.md` now says. `GitHub.copilot-chat` was capitalised and matched nothing on a case-sensitive filesystem; it is corrected to lowercase and joined by the Code - Insiders and VSCodium variants. Grants are narrowed to what is read (`~/.cline/data` to its `tasks` subdirectory, `.omp/agent` and `.pi/agent` to their `sessions` subdirectories so `.pi/agent/auth.json` is no longer covered, `.cursor/ai-tracking` to `ai-code-tracking.db`, the claude-dev, roo-cline and kilo-code global storage entries to their `tasks` subdirectories, and the Antigravity roots to the five directories the parser reads) and added where a parser reads a path that was never granted, including Cline sessions, the clawdbot, moltbot and moldbot agent directories, Cursor `workspaceStorage`, `~/.copilot/session-store.db`, IBM Bob, lingtai and zerostack. `app/scripts/snap-grants.test.ts` enforces the shape, including that no credential path appears in the auto-connect plug. On the CI side, `snapcraft upload` exits non-zero whenever the store answers "will need manual review", which every personal-files snap gets, so the publish job now treats that answer as a successful upload while any other failure still fails. (#1195, #1223, #1224)
### Fixed
- **Hermes sessions on a flat subscription stop reporting $0.00, and provider totals stop leaking stale or false-zero figures into the menubar.** Hermes writes `estimated_cost_usd = 0.0` rather than NULL when its `cost_status` is `unknown` or `included`, and any non-null estimate was treated as a recorded amount, so the placeholder zero beat the token-based calculation forever; only a positive recorded estimate is trusted now, a zero falls through to the calculation, and a non-null `actual_cost_usd` still wins including an explicit $0. Around that, `providerDetails.hasUsage` becomes authoritative and fails closed for legacy payloads, provider history and cache are scoped to active provider periods so a stale provider cannot contribute a false zero, Hermes measured and estimated provenance is preserved through a version 3 session ledger with migration handling, provider paging arrows stay navigational, and versioned Claude family labels are derived so an observed id such as `claude-fable-5-1` displays as `Fable 5.1` without a hand-maintained entry. The refresh path snapshots its cache keys atomically and joins an all-provider refresh already in flight instead of launching competing work, and reconciles cost and call mismatches independently rather than accepting a partially stale payload. `DAILY_CACHE_VERSION` moves to 31, so settled days re-derive once on the first run after upgrading and then stay cached, and the upgrade-path check discovers the derived version instead of hard-coding one that drifts at every accounting bump. (#1213, #1234, #1235) Thanks @MiguelMachado-dev and @avs-io.
- **The desktop Trend and Spend charts group models the same way `codeburn models` does.** The per-day rows behind those charts were built from the raw provider and model string while `codeburn models` merged by alias-resolved canonical id, so the same day's data produced two different ideas of what counts as one model: the Trend tooltip listed `minimax/MiniMax-M3` and `MiniMaxAI/MiniMax-M3` as separate rows against a single "MiniMax M3" row in the command. `history.daily[].topModels` now merges by the same normalized display name, and a merged row carries a new optional `rawModels` field so a cached and an uncached route stay visible; `codeburn models` gains the same field in its JSON, and the desktop tooltip appends the route list when more than one raw id fed a segment. Both changes are add-only to the CLI and app payload contract. Fixes #1239. (#1241)
- **`codeburn plan` estimates Copilot AI credits and says when the total is incomplete instead of printing a confident wrong number.** Only the Copilot CLI's `~/.copilot/session-store.db` rows carry an exact credit figure, so VS Code chat sessions, transcripts, the OTel database, JetBrains stores and the CLI session-state JSONL contributed nothing: the headline could read `3.9 / 20000 AI Credits` while GitHub showed 19,326. Requests without an exact figure are now estimated from tokens at the model's listed API rate with 1 credit equal to $0.01, which is how GitHub bills credits including the cache-read and cache-write split, and the headline says so whenever anything is estimated, for example `Copilot Max: ~9800 / 20000 AI Credits (estimated; 4 of 473 requests carry GitHub's exact figure)`. The bar and `percentUsed` follow the estimate while any request is unrated and the exact figure once every request carries one, and a session that carries any exact figure is never estimated on top of, so paired store rows and JSONL twins cannot double count. New add-only plan fields are `estimatedCredits`, `creditRatedCalls`, `creditUnratedCalls` and `creditsNote`; `docs/providers/copilot.md` documents which sources carry exact credits. Fixes #1199. (#1201)
### Fixed (menubar)
- **The macOS menubar app no longer burns 5 to 7 percent CPU while sitting idle.** Activity Monitor had it at roughly two thirds of Chrome's daily energy on the same machine, with about 650 wakeups a second and nothing on screen. Three causes are fixed. The status-item popover's hosting controller lived for the app's lifetime with the wordmark's repeating gradient sweep and the loading pulse inside it, so the closed, invisible popover re-rendered at display cadence; those animations now start when the popover appears and stop when it closes, and the popover's content view is built fresh on every open and released on close so nothing survives to churn. Every scaled Capacity Dock dimension is rounded to a whole point, because at any dock scale other than 100 percent the fractional sizes made SwiftUI's fitted content disagree with the pixel-aligned frame and re-run layout forever. And the dock's bubble panel is released on dismiss and rebuilt on the next hover rather than kept alive hidden. Measured on the same machine, idle CPU goes from 5 to 7 percent sustained to 0.1 percent, including the case that reproduced it most reliably, opening the popover during the first data load. (#1208, #1210, #1220)
- **Copilot quota is found when you are signed in through the Copilot CLI or `gh` rather than the legacy editor plugin files.** The ring only looked for `~/.config/github-copilot/hosts.json` and `apps.json`, which only older plugins write, so a fully signed-in user saw "No GitHub Copilot credentials found" with no hint that usage tracking was unaffected. Discovery is now a read-only chain, first hit wins and every rung tolerant of missing or malformed data: those two files, then `~/.copilot/config.json` and `settings.json` (taking the first value with a GitHub access-token prefix and skipping `ghr_` refresh tokens), then `COPILOT_GITHUB_TOKEN`, `GH_TOKEN` and `GITHUB_TOKEN`, then `gh auth token` cached for five minutes behind a 5 second deadline and never on the main thread, then a token pasted in Settings and kept in CodeBurn's own provider-scoped keychain item. The Copilot CLI's own Keychain item is deliberately not read because every read would raise the macOS access dialog, and VS Code's encrypted secret storage stays out of scope. The message now reads "No GitHub Copilot credentials found. Usage tracking still works." followed by the three ways to connect. Separately, a Free or Individual plan reports a `premium_interactions` window with entitlement 0, which both the menubar and the desktop decoder had drawn as a 100 percent used ring; windows with entitlement 0 or `unlimited: true` are now skipped in both readers. Fixes #1198. (#1200)
- **Grok unified-billing accounts show 0 percent after a weekly reset instead of an unrecognized-payload error, and only those accounts do.** SuperGrok Heavy unified billing drops `creditUsagePercent` from its billing response after a weekly reset, and treating that as an unrecognized payload showed no usage where grok.com showed 0 percent, so an omitted percent inside an active billing period is now read as 0 percent used, matching Grok's own client; a published percent or a usable used-over-cap ratio still wins, and an expired window without a percent is never invented as 0. That rule is then scoped to unified-billing accounts only, since it had applied to any account with an open window; everyone else falls back to unknown as before. (#1242, #1253) Thanks @mh7whmyz6z-alt.
- **The CodeBurn wordmark stops vanishing from the popover header.** The letters were drawn hidden and made visible only through an animated gradient masked by their shapes, so any frame where the mask or the gradient frame was not laid out yet, such as the first frame after opening or an animation retargeting on reopen, showed nothing at all. The letters now carry a static flame gradient fill of their own and the sweep is an overlay that can only brighten them, slowed from 1.5 s to 4 s each way. (#1240)
- **Checking whether a provider's credentials are present can no longer deadlock the app.** The presence check and the credential store's mutation path took the same lock in opposite order; the acquisition order is now consistent so a presence read never waits on the write path. (#1212) Thanks @MiguelMachado-dev.
- **The Capacity Dock stops drifting out of position as you hover it.** `NSHostingView` intrinsic window resizing is disabled for the rail and detail panels so AppKit is the sole owner of their geometry, and SwiftUI content-size updates can no longer race the hover frame animations and accumulate a position offset. (#1205) Thanks @MiguelMachado-dev.
- **Capacity Dock hover works over any frontmost app, not just Chrome.** Hover was synthesized from a global mouse-moved monitor, and macOS only delivers those events while the frontmost application itself requests them, so hovering was dead over the Finder desktop or Terminal. A 10 Hz pointer poll on the main run loop now feeds the same passthrough and hover path the monitors use, with a same-position guard that makes idle ticks free and a lifecycle tied to the existing monitors so a disabled dock costs nothing. (#1197)
### Fixed (Windows)
- **A Codex quota refresh can no longer overwrite a login that changed while it was in flight, and the tray and desktop apps stop losing each other's settings writes.** A quota read refreshes the Codex token and writes the rotated one back; if you signed in as someone else, or signed out and in again, while that request was outstanding, the response belonged to the old login and overwrote the new credentials. The refresh now checks the account id, the refresh token it started from and the id-token subject before writing, and discards the response if any of them moved, in both copies of the reader. Separately the Rust tray app and the Node desktop app both write the same preference files, so a read-modify-write from two processes lost updates and a torn read parsed as `{}`, silently collapsing every dock setting to its default; one cross-process lock now covers all three write sites on both sides, including the dock's enabled, provider and placement writes. The cross-process test was proven to fail without the lock, and was later reduced from 100 rounds a side to 24 so that it stops starving itself against the production 2 second lock budget on a loaded CI runner, and it still catches a lost update as reliably as before. (#1248, #1251)
### Internal
- **A repeatable performance harness with baselines pinned to main.** An isolated-HOME fixture generator and metric runner (`npm run perf:all`) measure wait-path latency through the same CLI and `serve` arguments the desktop app and menubar already use: cold session parse, incremental reparse, first and warm period switches, cold-start wait paths, refresh and view-switch proxies, and RSS after a cold load. Baselines for each are pinned in `perf/BASELINES.md` against a 28 MB synthetic fixture, no product hot path is touched, and the generator refuses to write under a real home. (#1173) Thanks @avs-io.
- **Release builds are hermetic.** The live LiteLLM update no longer runs as part of the release build path, the dashboard release build uses `npm ci`, and the reproducible-build contract is documented in `CONTRIBUTING.md` and pinned by tests. (#1236) Thanks @avs-io.
- **The cache-refresh lock heartbeat writes atomically, ending a long-running JSON flake.** The heartbeat rewrote the lock file in place, so a concurrent reader could see an empty or partial body and fail with `Unexpected end of JSON input`. It now writes the next body beside the lock and renames over it, which is atomic on POSIX and a replacing move on Windows; a refused replace skips the tick and cleans up, absorbed by the nine-heartbeat staleness window. A new regression test doing 400 plain reads against a 1 ms heartbeat fails on the old code every run and passes with the fix. (#1196)
- **Real people and machines are scrubbed out of the test fixtures and docs.** An audit of every commit since v0.9.23 found no credentials, hosts, customer data or committed logs, and five places where a real value stood in for an invented one: an absolute path into a private audit workspace and a personal detail in `perf/README.md`, a private product name as a fixture working directory, and the maintainer's OS username and two machine names inside tests that assert such strings are redacted. Every change is a rename, no assertion is weakened, and a device name that survived in `codeburn-desktop-wireframes.html` was caught in a follow-up. (#1250, #1253)
- **Maintainer docs match the tree again.** The provider registry gains the missing Codebuff, Mux, Open Design and Zed rows with new pages for Codebuff and Open Design derived from their parsers, Gemini and Antigravity point at their real test files, the architecture page's eager provider list and test inventory are corrected, the Gemini page's described parsing behaviour is corrected, and `CONTRIBUTING.md` stops hard-coding a test-case count that rots on every PR and names the commands that actually work as the full-suite gate. (#1221)
- **Contributing rules for the full-suite gate, agent accountability and affiliation disclosure.** Verification means the full suite on your branch against main with zero new failures, contributors answer posted review findings before opening more PRs and are accountable for what their agent submits, and a new-provider PR must disclose affiliation with the tool being added. (#1194)
- **A budget test no longer fails on every branch when CI runs before noon UTC.** It seeded the current month's spend at today 12:00 UTC, which is in the future for any run between 00:00 and 12:00, and future-dated rows never surface in the overview, so the budget line never rendered. It now seeds five minutes in the past, pinned to the month start on the 1st. (#1216) Thanks @MiguelMachado-dev.
- **Two payload comparisons ignore the wall-clock fields the new `liveSessions` block carries.** The menubar parity test builds the payload twice over one warm cache and expects a match, and `idleSeconds` differs by one across a second boundary, so `stableShape` now zeroes it the way it already blanks the `generated` stamp. The upgrade-path check comparing a payload built with and without workers strips `liveSessions` outright, since `idleSeconds` and `lastActivityAt` differ between the two invocations by design. (#1238, #1245)
- **An overridden Claude home is a strict credential-source boundary.** Isolated tests and sandboxed probes no longer fall through to the operator's login Keychain, while normal file-then-Keychain discovery is unchanged when no override is active. (#1172) Thanks @avs-io.
## 0.9.23 - 2026-08-29

View file

@ -32,12 +32,12 @@
<td align="center" width="50%">
<strong>Desktop</strong><br/>
<img src="https://raw.githubusercontent.com/getagentseal/codeburn/main/assets/desktop.jpg" alt="CodeBurn Desktop" /><br/>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.23/CodeBurn-0.9.23-arm64.dmg"><img src="https://img.shields.io/badge/macOS-Apple_Silicon-F97316?logo=apple&logoColor=white" alt="Download for macOS (Apple Silicon)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.23/CodeBurn-0.9.23.dmg"><img src="https://img.shields.io/badge/macOS-Intel-F97316?logo=apple&logoColor=white" alt="Download for macOS (Intel)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.24/CodeBurn-0.9.24-arm64.dmg"><img src="https://img.shields.io/badge/macOS-Apple_Silicon-F97316?logo=apple&logoColor=white" alt="Download for macOS (Apple Silicon)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.24/CodeBurn-0.9.24.dmg"><img src="https://img.shields.io/badge/macOS-Intel-F97316?logo=apple&logoColor=white" alt="Download for macOS (Intel)" /></a>
<a href="https://apps.microsoft.com/detail/9P0R4ZL5XMB8"><img src="https://img.shields.io/badge/Windows-Microsoft_Store-F97316?logo=microsoft&logoColor=white" alt="Get CodeBurn from the Microsoft Store" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.23/codeburn-desktop_0.9.23_amd64.deb"><img src="https://img.shields.io/badge/Linux-.deb-F97316?logo=debian&logoColor=white" alt="Download for Linux (.deb)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.23/codeburn-desktop-0.9.23.x86_64.rpm"><img src="https://img.shields.io/badge/Linux-.rpm-F97316?logo=redhat&logoColor=white" alt="Download for Linux (.rpm)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.23/CodeBurn-0.9.23.AppImage"><img src="https://img.shields.io/badge/Linux-AppImage-F97316?logo=linux&logoColor=white" alt="Download for Linux (AppImage)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.24/codeburn-desktop_0.9.24_amd64.deb"><img src="https://img.shields.io/badge/Linux-.deb-F97316?logo=debian&logoColor=white" alt="Download for Linux (.deb)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.24/codeburn-desktop-0.9.24.x86_64.rpm"><img src="https://img.shields.io/badge/Linux-.rpm-F97316?logo=redhat&logoColor=white" alt="Download for Linux (.rpm)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.24/CodeBurn-0.9.24.AppImage"><img src="https://img.shields.io/badge/Linux-AppImage-F97316?logo=linux&logoColor=white" alt="Download for Linux (AppImage)" /></a>
</td>
<td align="center" width="50%">
<strong>Web</strong><br/>
@ -56,7 +56,7 @@
<img src="https://raw.githubusercontent.com/getagentseal/codeburn/main/assets/menubar-app.jpg" alt="CodeBurn macOS menubar" /><br/>
<code>codeburn menubar</code><br/>
<a href="https://apps.microsoft.com/detail/9P0R4ZL5XMB8"><img src="https://img.shields.io/badge/Windows-Microsoft_Store-F97316?logo=microsoft&logoColor=white" alt="Get CodeBurn from the Microsoft Store" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/tag/windows-v0.9.23"><img src="https://img.shields.io/badge/Windows-Tray_app_.msi_(preview)-F97316?logo=windows&logoColor=white" alt="Download the CodeBurn Windows tray app developer preview (.msi)" /></a>
<a href="https://github.com/getagentseal/codeburn/releases/tag/windows-v0.9.24"><img src="https://img.shields.io/badge/Windows-Tray_app_.msi_(preview)-F97316?logo=windows&logoColor=white" alt="Download the CodeBurn Windows tray app developer preview (.msi)" /></a>
</td>
</tr>
<tr>
@ -358,7 +358,7 @@ Windows gets the same ambient view from the system tray, from the same one comma
codeburn menubar
```
It downloads the `.msi` for your CLI version, verifies its sha256, runs it through `msiexec /passive`, and launches the tray app. Re-run with `--force` to reinstall; an already-installed matching version is just launched. You can also download the `.msi` yourself from the [latest Windows Menubar release](https://github.com/getagentseal/codeburn/releases/tag/windows-v0.9.23).
It downloads the `.msi` for your CLI version, verifies its sha256, runs it through `msiexec /passive`, and launches the tray app. Re-run with `--force` to reinstall; an already-installed matching version is just launched. You can also download the `.msi` yourself from the [latest Windows Menubar release](https://github.com/getagentseal/codeburn/releases/tag/windows-v0.9.24).
Today's spend sits in the tray as a number beside the flame icon (turn it off in Settings, and the tooltip always carries it). Click for the same popover the macOS app shows: agent tabs, period switcher, Trend, Forecast, Pulse, Stats and Plan insights, activity and model breakdowns, optimize findings, and CSV/JSON export. Settings covers launch at login, the tray number, theme, and currency. It refreshes every 60 seconds while the popover is open and every 2 minutes while it is closed.

View file

@ -45,6 +45,7 @@
<category>Utility</category>
</categories>
<releases>
<release version="0.9.24" date="2026-09-04"/>
<release version="0.9.23" date="2026-08-29"/>
<release version="0.9.20" date="2026-08-10"/>
</releases>

View file

@ -42,8 +42,8 @@ modules:
done
sources:
- type: file
url: https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.23/codeburn-desktop_0.9.23_amd64.deb
sha256: bf875a11aef90853bee3891ece965b98a7ddcc5331d98dfd113b72c80e8598ca # TODO: update sha256 for desktop-v0.9.23
url: https://github.com/getagentseal/codeburn/releases/download/desktop-v0.9.24/codeburn-desktop_0.9.24_amd64.deb
sha256: bf875a11aef90853bee3891ece965b98a7ddcc5331d98dfd113b72c80e8598ca # TODO: update sha256 for desktop-v0.9.24
dest-filename: codeburn-desktop.deb
only-arches: [x86_64]
- type: script

4
app/package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "codeburn-desktop",
"version": "0.9.23",
"version": "0.9.24",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "codeburn-desktop",
"version": "0.9.23",
"version": "0.9.24",
"dependencies": {
"@gsap/react": "^2.1.2",
"gsap": "^3.15.0",

View file

@ -1,7 +1,7 @@
{
"name": "codeburn-desktop",
"private": true,
"version": "0.9.23",
"version": "0.9.24",
"description": "CodeBurn Desktop \u2014 Electron app fed by the codeburn CLI",
"main": "dist/electron/main.js",
"scripts": {

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "codeburn",
"version": "0.9.23",
"version": "0.9.24",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "codeburn",
"version": "0.9.23",
"version": "0.9.24",
"license": "MIT",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.29.0",

View file

@ -1,6 +1,6 @@
{
"name": "codeburn",
"version": "0.9.23",
"version": "0.9.24",
"description": "See where your AI spend goes - by task, tool, model, and project",
"type": "module",
"main": "./dist/cli.js",

View file

@ -1,12 +1,12 @@
{
"name": "codeburn-menubar",
"version": "0.9.23",
"version": "0.9.24",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "codeburn-menubar",
"version": "0.9.23",
"version": "0.9.24",
"dependencies": {
"@tauri-apps/api": "^2.0.0",
"@tauri-apps/plugin-opener": "^2.0.0",

View file

@ -1,7 +1,7 @@
{
"name": "codeburn-menubar",
"private": true,
"version": "0.9.23",
"version": "0.9.24",
"description": "CodeBurn menubar (tray) app for Windows, with experimental Linux support. Shares design tokens with the native macOS app under mac/.",
"type": "module",
"scripts": {

View file

@ -476,7 +476,7 @@ dependencies = [
[[package]]
name = "codeburn-menubar"
version = "0.9.23"
version = "0.9.24"
dependencies = [
"anyhow",
"dirs 5.0.1",

View file

@ -1,6 +1,6 @@
[package]
name = "codeburn-menubar"
version = "0.9.23"
version = "0.9.24"
description = "CodeBurn menubar (tray) app for Windows and Linux"
authors = ["AgentSeal"]
edition = "2021"

View file

@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "CodeBurn Menubar",
"version": "0.9.23",
"version": "0.9.24",
"identifier": "org.agentseal.codeburn-menubar",
"build": {
"beforeDevCommand": "npm run dev",