Skip to content

Ceiling 1.5.34

Choose a tag to compare

@github-actions github-actions released this 18 Aug 22:50
· 80 commits to main since this release
419d69a

[Ceiling] 1.5.34 - 2026-08-18

Charts opens in about two seconds instead of about thirty. Each local transcript is now parsed once into a small index beside your settings rather than re-read from the top by every card, every time, and the cards keep their last result so a restart is not a cold start. The numbers are unchanged: an indexed scan is checked against a full re-parse, and the index is discarded outright whenever model prices move.

The rest of this release is about surfaces reporting a state they could not actually reach. Signing out of StepFun could leave a live token behind if a refresh was in flight, Gemini treated a token endpoint it could not reach as a signed-out account, a countdown could read "0m" while a window still had a minute in it, and About labelled a failed download as a failed update check and said it in half-translated English.

Fixed

  • Charts opens in a couple of seconds instead of half a minute. On a machine holding gigabytes of Codex and Claude transcripts, opening Charts started three separate walks of the same logs at once, and each one read every file from the top: Estimated API value scanned ninety days when the furthest period it shows reaches back sixty, the activity heatmap scanned thirty, and the provider charts scanned again on top. Nothing was kept, so switching tabs paid for all of it again, and clicking Yesterday or 30 days re-ran a full scan for numbers the card already had in hand. Each transcript is now parsed once and its records are kept in a small index beside your settings; a file that grew since is resumed from where the last read stopped rather than re-read from the start, and a file that was replaced rather than appended to is read again in full. Providers are scanned at the same time instead of one after another, both cards keep their last result on disk so a restart is not a cold start, and the work runs in the background shortly after launch for anyone who opens these cards, so the wait lands where nobody is watching it. The numbers are unchanged: an indexed scan is checked against a full re-parse, and the index is discarded outright if model prices move, since it stores the dollars they produced.
  • Signing out of StepFun no longer leaves a live Oasis token in the keyring. A successful refresh wrote the new token to the OS keyring (codexbar-stepfun / api_key), and Revoke stored credentials only cleared Preferences, cookies, and token-accounts. The next fetch then read the leftover and stayed signed in. Revoke now asks the provider to delete that copy. A keyring error fails the revoke instead of reporting success while the token remains.
  • Gemini no longer treats a still-refreshable seat as signed out. The quota poll used the access token until the exact expiry second and turned a 401 into AuthRequired, so a valid refresh token still produced one failed 5-minute cycle each hour. Gemini now refreshes five minutes early, like Claude and Vertex, and a 401 retries once after refresh. A revoked refresh token is still AuthRequired.
  • Reset countdowns agree at a remaining day and in the last minute. The CLI statusline used hours > 24, so 24h 10m stayed "24h 10m" while the tray and the TypeScript hooks already said "1d 0h". The native tooltip and taskbar strip floored a still-future 30s remainder to "0m", the stuck-timer leftover SBS-621 fixed in the hooks. Every reset surface now floors one total of minutes, clamps a sub-minute remainder to 1, and cuts a day at 1440 minutes. A user looking at the tray, the CLI, and the tooltip at 24h 1s sees "1d 0h" (or "Resets in 1d" in the locale sentence); at 30s they see "1m", never "0m".
  • A failed update check no longer tells you that you are current. Checking for updates treated a GitHub outage, a rate-limit, or an unreadable release payload the same as "no newer release", so About said you were up to date. Only a successful "latest is not newer" is Idle now. Failures, including the existing 15s timeout, are Error, and About shows that the check could not run. A second check after a download is ready no longer clears Install & Restart.
  • codexbar cost and serve /cost now include Grok. CostScanner and Charts already read ~/.grok/sessions (costUsdTicks). The CLI and the local HTTP endpoint still treated Grok as unsupported and said only Codex and Claude have local logs. After the usage command started enumerating enabled providers (default claude, codex, cursor, grok), every bare codexbar cost listed Grok as unavailable. The same machine's Charts tab already showed those sessions. codexbar mcp get_spend used the same Codex/Claude-only list. Cursor, Gemini, and Copilot stay unsupported.
  • WSL.md no longer documents automatic browser-cookie import or gcloud auth login for Gemini. Cookie extraction is disabled; Gemini reads the Gemini CLI file ~/.gemini/oauth_creds.json. The site no longer calls cookies "browser imports".

What's Changed

  • Parse each transcript once when Charts opens by @tsouth89 in #329
  • Map update-check failures to Error, not Idle (SBS-931) by @tsouth89 in #327
  • Align reset countdown formatters at 24h and the last minute (SBS-927) by @tsouth89 in #324
  • Clear the leftover StepFun Oasis token on revoke (SBS-920) by @tsouth89 in #322
  • Refresh Gemini tokens before expiry and retry a 401 (SBS-928) by @tsouth89 in #323
  • Stop documenting automatic cookie import and gcloud Gemini login (SBS-933) by @tsouth89 in #326
  • Include Grok in CLI and serve local cost scans (SBS-934) by @tsouth89 in #325
  • Retake the strip shot and put the heatmap on the site by @tsouth89 in #321
  • Release 1.5.34 by @tsouth89 in #330

Full Changelog: v1.5.33...v1.5.34