github getagentseal/codeburn desktop-v0.9.28
CodeBurn Desktop 0.9.28

one hour ago

0.9.28 - 2026-11-07

Added

  • The macOS menu bar forecasts when a quota window runs out. The forecast uses the pace of the last hour on short windows and the last six hours on long ones, waits for two readings ten minutes apart, and covers the five-hour window too. It shows as "· out 15:40" in the second row and under the heatmap, or "lasts until reset" when the pace reaches the reset first. When the forecast lands before the reset, a second alert fires once per cycle, and the 80% alert threshold is now a picker with 70, 80 and 90.

  • The guard stops loops while they run. An identical tool call repeated 4 times in a row gets a warning and the 8th is denied; a shell command that failed 3 times in the session gets a warning and the 5th try is denied. The reason names the call, the count and the session cost so far, and the end-of-session note says what the calls after the first warning cost. The four limits are in the guard settings (null turns one off), codeburn guard status prints them, and codeburn guard allow lifts the stops for the session.

  • Three new Optimize findings for premium spend. one-hour-cache-unused prices one-hour prompt-cache writes that no pause over five minutes ever needed. fast-mode-background prices fast mode on subagent calls, where nobody waits for the speed. long-context-premium prices prompts that crossed a model's long-context tier, with the threshold read from the price data.

  • Sessions show their cache hit rate. A Cache column in codeburn sessions, the interactive table and the desktop Sessions page (sortable), and cacheHitPercent on each --format json row. Every view now uses one formula, cache reads over input plus reads plus writes, so the session drawer, Compare and the menu bar can read lower than before where cache writes are large. A session with no cache data shows a dash, not 0%.

  • Exports say where every dollar comes from. Each call carries costBasis: recorded (the tool's own bill), calculated (tokens at list price), estimated (the calls the ~ marks), included (subscription usage at $0) or unpriced. Sessions, days and the menu bar's current period carry the recorded, calculated and estimated shares of their cost. It appears in codeburn export (JSON and a CSV column), sessions --format json, the menu bar JSON and the MCP get_usage totals.

  • A one-time GitHub star request on desktop, menu bar and Windows tray. From the third launch or popover open, a small prompt asks for a star with Star on GitHub and Not now; either button ends it for good. On the menu bar and the tray it replaces the star strip that showed from the first launch, and anyone who closed that strip is not asked again.

  • CodeBurn as a Claude Code plugin. /plugin install codeburn --marketplace getagentseal/codeburn adds the MCP server (get_usage, get_savings) and a /codeburn:cost skill that summarizes today's spend. The plugin pins the CodeBurn version it runs and links the privacy page, which the README now links too. The server is also listed in the official MCP Registry as io.github.getagentseal/codeburn.

  • codeburn web works behind an authenticating reverse proxy. --host sets the listen address and --allowed-host (repeatable) admits exact hostnames in the Host and Origin headers. Without the flags nothing changes, and any other host still gets a 403. The dashboard has no login of its own, so keep the port reachable only from the proxy. Thanks @MarcelRoozekrans.

  • The desktop session view has three screens. Inspect shows a prompt as request cards with an insights strip, Agents shows each subagent's lifecycle and cost, and Story tells a prompt in plain sentences.

  • Claude usage is split by the account that was active. A machine that switches between a personal and a team organization stops reading as one blended total, and the macOS menu bar shows one row per account once two have been seen.

  • Contracted-rate discounts, opt-in. A discounts section in the price config takes a percentage off list price by tool, model or token kind. It applies only to costs calculated from tokens, never to what a tool billed. Closes #1856.

  • Sessions kept after their transcript was removed are marked. The sessions list, the export and the per-PR report say so.

  • New Optimize finding idle-compaction-blocked for an autoCompactWindow that stops Claude Code's idle compaction from ever running. Closes #1799.

  • The Windows tray forecasts when a quota window runs out and alerts before it does, like the menu bar.

  • Optimize shows each fix's saving once and no longer archives slash commands you use.

Changed

  • Telemetry is on by default in every region, including the EU, EEA, UK and Switzerland, where it was off by default: the Windows tray asks once with Accept and Decline, and the desktop app and the macOS menu bar start with it on. Settings turns it off at any time, a choice already made is kept, and the README lists what is sent.
  • CodeBurn needs Node.js 22.15 or newer. Older Node has no Zstandard support, which Codex history now needs. On Node 22.14 or older the CLI exits with codeburn requires Node.js >= 22.15.0 and the current version, and the VS Code extension reports its runtime as too old.
  • The JSON export has fixed keys. codeburn export --format json used the CSV column headers as JSON keys, so a program had to read API Calls and a Cost (USD) key that changed with the currency setting. The document is now codeburn.export.v3 with camelCase keys (apiCalls, cost, inputTokens, and so on) and the currency stated once at the top. The CSV files keep their headers. Scripts reading the v2 JSON need their key names renamed once.
  • Dependencies and security: the zip crate (critical advisory) and Tauri 2.12 in the Windows tray, minimatch 11 and msal-node 7 in the VS Code extension, hono 4.13.13 (GHSA-5r4p-p66f-jhc7), @hono/node-server 2.1.6, zod 4, follow-redirects 1.16.2 in the desktop app, and vitest 5 (GHSA-qxg6-89mg-rqv8). Release signing jobs now wait for an approval in a release environment, and every CI action is pinned to a commit.
  • The first refresh after the update takes longer, once. Settled days re-derive for the provider fixes below, and the Optimize, Compare and cache stores rebuild once.
  • Compare and Optimize read history once per transcript. Each transcript keeps its own facts, so a period view stops re-reading everything, Compare scans self-corrections only inside the compared period, and the app no longer prefetches both pages.
  • The punchcard request no longer runs the Optimize scan, and the desktop decodes CLI output as UTF-8 with a cap on the answer.
  • The session view stays under the desktop's 16 MiB limit, and sessions --id --why opens a session with thousands of helpers without running out of memory.
  • codeburn serve sheds memory when the heap is under pressure, not by resident size.
  • The menu bar finds the desktop app's bundled CLI when none is on PATH.

Fixed

  • Codex history stored compressed is counted again. Codex moves older rollouts to rollout-*.jsonl.zst, which CodeBurn skipped, so most Codex history was missing; on one machine reports went from 3 sessions to 1,358. A session in both forms counts once, a damaged file prints a warning, and settled days pick up the recovered usage after the update.
  • Codex web search, tool search and image generation show in the tool breakdown as WebSearch, ToolSearch and ImageGeneration, counted once across status updates and fork replays. Cost does not change.
  • Codex requests on the ultrafast service tier are priced at the ultrafast rates (6x the base rate on gpt-6-astra and gpt-6.1-sol) instead of standard.
  • Text that only mentions a tool no longer becomes a tool call. In Codex, mcp-cli ... call <server> <tool> counts only when mcp-cli is the command being run, not inside a commit message, an echo or a comment. In Kiro, tool names come from the structured tool fields only, not from markup inside file contents or command output. Both fixes also keep such names out of sync, and cached sessions re-parse once. Thanks @Enclavet.
  • Copilot agent requests in VS Code chat count every model call. Copilot Chat 0.69 keeps only the last call of an agent request in its metadata, so CodeBurn showed a fraction of the output and cost. It now reads the request's totals (all calls, with the cache split when VS Code records it), and a request that records GitHub's credits costs exactly that bill (1 credit = $0.01) in reports and plan credits. A chat session that also ran on the agent host is counted once, from the agent host. In Copilot plan credits each chat request is rated on its own. Past Copilot days re-derive once after the update.
  • Copilot showed claude-sonnet-4-6 as "Sonnet 4" instead of "Sonnet 4.6".
  • Copilot OTel spans billed cached tokens twice. VS Code Copilot Chat writes a span's input tokens as the full prompt, cache included, and CodeBurn priced that input and the cache again on top. The cache is now subtracted before pricing. Only installs with github.copilot.chat.otel.enabled are affected; cached calls re-parse once after the update, and calls whose spans the extension already pruned keep their old figure.
  • Warp conversations use Warp's billed cost again. Warp 0.2026.10 replaced the cost field CodeBurn read, so conversations without streamed charges fell back to the credits estimate. The new billed figure is read, and settled days re-price.
  • Day token totals no longer grow with each cache upgrade. A day holding a session total with tokens but no calls (Hermes, Copilot) had those tokens added again on every cache upgrade. Caches already inflated heal on load. Calls and cost were never affected.
  • Today shows exact session counts in the headline, provider and project totals instead of marking them partial. Closes #1785. Thanks @ozymandiashh.
  • The desktop Overview no longer crashes when a refresh or period switch adds or removes the ~ on a total. Closes #1760. Thanks @ozymandiashh.
  • Claude Code messages that call several tools in parallel keep every call. Only the last tool call of such a message was counted, so tool, MCP and shell breakdowns and the turn categories missed most of them; on one day 1,172 of 1,589 tool calls were missing. Calls, tokens and cost do not change. Thanks @kimlj.
  • Claude Code on Windows: the PowerShell tool counts as a shell tool, so its commands reach the shell breakdown and turns classify as testing, git or build like Bash turns. Thanks @hasanAbbas2004.
  • Claude Code thinking tokens appear in the reasoning breakdown. They were shown as 0. Thinking already bills inside output tokens, so cost does not change.
  • Claude Code subagent messages from before version 2.1.307 get an estimated output. Those versions recorded only the first streamed chunk's output count, about 10 tokens, for subagent messages. Output is now estimated from the message content when that is higher, and those dollars carry the ~. Output and cost only go up, and settled days re-derive once after the update.
  • Claude plan labels cover every Max multiplier and Ultra. Any multiplier other than 5x and 20x read "Max 5x"; now max_10x reads "Max 10x", an Ultra tier reads "Ultra", and an unknown tier shows its own name. Same in the CLI, desktop, menu bar and Windows tray.
  • A Claude login in a non-default config directory reads as connected on macOS. Claude Code keeps that login in its own Keychain item, which codeburn quota, the desktop app and the VS Code extension now read for CLAUDE_CONFIG_DIRS, CLAUDE_CONFIG_DIR and the configured directories. An expired credential file no longer hides a live Keychain login.
  • Cursor 3.27 sessions connect again. Cursor 3.27 encrypts its app session, which CodeBurn read as an expired login. It is now unlocked with the Cursor Safe Storage Keychain item, and when that item cannot be read CodeBurn says so instead of asking you to sign in again. Closes #1801. Thanks @avs-io.
  • A Cursor message copied into several conversations is counted once. On one machine local Cursor calls went from 1,680 to 1,438. Synced imports already hid most copies, so most users see a smaller change.
  • Antigravity CLI sessions belong to their workspace. They were all filed under one antigravity-cli project; each now goes to the repository it ran in, also for sync push --attribution. Closes #1840. Thanks @aaronbronow.
  • Antigravity sessions read the first prompt, so turns classify as Coding or Exploration instead of Conversation, the sessions list shows the task, and PR links in the prompt are found. Closes #1792. Thanks @dcaldr.
  • Hermes helper-model usage is counted. Compression, title, vision and other helper calls were recorded only outside the session totals and were missing. They now add tokens and cost to their session, without adding turns.
  • Optimize prices each finding from the calls it points at. Findings used one blended rate close to the cache-read price, so MCP schema findings were about ten times too low ($6.83 against $63.90 over 30 days on one machine). Sessions are now priced at their own model's rates, and low-worth sessions at their real cost. codeburn act report and the desktop "Saved by fixes" line price realized savings the same way; fixes applied before the update keep their old baseline.
  • Optimize's read/edit ratio ignores new-file writes, so setups where agents write reports no longer get a false "edits more than it reads" finding.
  • Menu bar quota alerts fire once per window. Claude's reset time jitters by a second or two, which could re-arm the 80% and 100% alerts inside one window.
  • The Windows tray finds a working CLI when the desktop app's launcher is broken, trying PATH, Volta and npm installs in turn and listing every path it tried when none works. The desktop app no longer overwrites a CODEBURN_BIN you set.
  • The Windows Capacity Dock keeps its saved provider when a quota refresh misses one, instead of replacing it with whichever provider answered. Thanks @Brandin.
  • The terminal dashboard keeps provider totals through the background refresh; a provider-filtered headline could drop to zero. Closes #1769. Thanks @ozymandiashh.
  • The session drawer says a turn touching several PRs is split evenly between them, which is what it does.
  • Pricing no longer crosses a model version boundary. A model with no price of its own is not priced from a different version. Droid versions are kept, Qwen cached tokens are counted once, and Hermes reasoning tokens are counted once. The long-context tier shows in the session why view.
  • Codex no longer counts a rate-limit ping as a call, no longer shows negative output when a counter restarts, and counts fork replays once.
  • Goose timestamps are read as UTC, and Kimi subagents are counted per session.
  • Cursor stops billing old conversations as today. The workspace map refreshes, each prompt is read from its own row, and a malformed stored value skips one row instead of dropping all of them.
  • Cursor agent-only requests now appear, including those past the per-parse lookup limit on a database that stopped changing. JetBrains Copilot turns keep their first day.
  • Copilot chat journals next to a trace database count once per chat, Auto mode requests are priced, and JetBrains parsing is linear in the session size.
  • Copilot enterprise hosts route correctly, and the Windows path is found.
  • The macOS Keychain asks once per action. Reads in the desktop app happen only on an explicit click, the prompt stops at Deny, and unrelated settings changes no longer ask again.
  • ZCode token windows use the exact boundary, and an expired Gemini login is reported once instead of on every refresh.
  • Cline family tools keep their recorded costs, Antigravity RPC output is counted, and Warp attributes usage to the right day. Zed waits out a busy store instead of showing partial data, and Vercel retries transient errors instead of clearing cached spend.
  • Grok Bot keeps requests that slid out of its window through resets and partial slides. Hermes rebuilds keep observation days, Quick Desktop drops estimates once usage is metered, and Warp running exchanges and plan changes are handled.
  • The guard no longer blocks normal test loops or polling, and the agent cannot lift the stop itself. A loop stop stays in place after a deny, failing polls may wait, and env and multi-line waits are counted.
  • Ultrafast calls survive cache upgrades, rows are restored on a busy read, and a stale status snapshot is never replayed.
  • Day totals fill missing sealed days for every provider, model aliases are part of the daily-cache hash, and the weekly budget covers seven days.
  • Placeholder calls count only their estimated output as estimated spend.
  • A tool or model named constructor or toString no longer crashes the parse. A config file with a syntax error is no longer wiped, and plugin names are checked before removal.
  • Optimize counts a transcript line read before its newline once.
  • Currency labels follow the selected currency in the macOS menu bar, and the GNOME budget alert no longer applies the exchange rate twice.
  • Codex native tool events are attributed to their tools. Thanks @uttamdeb.
  • Bundled model prices refreshed from the upstream list with rules that keep an upstream reshuffle from repricing a model: retired rows keep their last price, a maker's price wins only when it is not an outlier, and a tier upstream dropped stays while the model's base price is unchanged.

Don't miss a new codeburn release

NewReleases is sending notifications on new releases.