Skip to content

Releases: InfinityScripter/claude-control-bar

Claude Control Bar 0.7.11

Choose a tag to compare

@InfinityScripter InfinityScripter released this 23 Aug 06:01
a028e61

The update menu now shows one set of release notes instead of two competing versions.

  • When notes for the running version are still unseen and a newer release is available, the menu shows only the newer version.
  • Notes for the running version remain available when no update is being offered.
  • A four-state regression matrix prevents the duplicate from returning.

The app and DMG are universal arm64 + x86_64 builds. This machine has no Developer ID certificate, so the DMG is ad-hoc signed and not notarized; macOS may require right-clicking the app and choosing Open once, as documented in the README.

Claude Control Bar 0.7.10

Choose a tag to compare

@InfinityScripter InfinityScripter released this 22 Aug 09:51
953449c

The Crab's moods are now easier to read at menu-bar size and feel less static:

  • cigar mode gets a smug asymmetric squint and a stronger puff pose;
  • overheating visibly pants and sweats;
  • the fire state has explicit >< eyes, clenched teeth, stronger claw flails, and livelier flames;
  • permission waiting raises the watch more clearly;
  • the connected shell, claw hinges, and planted feet stay intact through every non-walking cycle.

Both English and Russian READMEs now show the six production animations. Their GIFs use opaque full frames, so Markdown viewers no longer create a false gap between the Crab's head and body.

The original walking animation remains unchanged.

v0.7.9 — the Crab comes alive

Choose a tag to compare

@InfinityScripter InfinityScripter released this 22 Aug 07:01
0d0a2df

The Crab's load states now move like distinct actions instead of rigid variations of one sprite. Every cycle has readable anticipation, action, hold and recovery while keeping the tiny menu-bar silhouette intact.

Changed

  • Sleep breathes in place. The feet stay planted, the face and crown move together, and the Zs drift across the loop.
  • Permission waits on purpose. Only the watch claw rises, the watch hand advances, and the Crab looks from the watch back to the screen.
  • The cigar scene has a complete gesture. The cigar-side claw lifts, the ember reacts and smoke travels upward before the pose settles.
  • High load has real escalation. Overheating pants and sweats; fire alternates its flailing claws beneath changing flame heights.
  • The original twenty-frame run stays untouched for the normal two-to-three-session load.

Fixed

  • The head and claws stay attached. Squash-and-stretch grows from the connected shell instead of moving a rectangular layer, both claw hinges retain their roots, and every non-walking cycle keeps all four feet planted.
  • Loops close cleanly. Each mood includes readable holds and returns to its resting body pose before restarting.

Verified with 139 Python tests, 30 Node tests, the complete Swift model suite, direct lossless runtime-frame inspection, and a universal arm64 + x86_64 app build.

The DMG is not notarized because the project does not yet have a Developer ID certificate. On first launch, right-click the app and choose Open, or allow it in System Settings > Privacy & Security. The plugin channel and the in-app source update are unaffected.

v0.7.8 — the Crab shows the load

Choose a tag to compare

@InfinityScripter InfinityScripter released this 21 Aug 13:27
ef95d91

Crab Walking is now a small, readable load indicator instead of one animation for every situation. It rests when little is happening, keeps the familiar walk at normal load, and visibly struggles when too many Claude Code sessions work at once.

Added

  • The Crab shows the current workload. With no working sessions it sleeps; with one it relaxes with a cigar; two or three use the original walk; four or five make it turn red, sway and sweat; six or more set its head on fire. Only sessions currently thinking or running a tool count, so open but idle sessions do not inflate the load.
  • Permission requests have their own waiting scene. The Crab checks its watch, looks back at the screen and blinks. A yellow warning dot stays beside the animated mascot, while the shorter Needs you text keeps the menu bar readable.

Changed

  • Crab Walking is the default on a fresh install. Existing animation choices remain untouched after an update.
  • The README documents every load state in both English and Russian, including the permission override and the active-session counting rule.

The DMG is not notarized because the project does not yet have a Developer ID certificate. On first launch, right-click the app and choose Open, or allow it in System Settings > Privacy & Security. The plugin channel and the in-app source update are unaffected.

Full details are in CHANGELOG.md.

v0.7.7 — the bars stop lying

Choose a tag to compare

@InfinityScripter InfinityScripter released this 13 Aug 12:14

The limit bars stop lying about how much quota is gone. This release also carries 0.7.6, which was committed but never published.

Fixed

  • The limit bars tell the truth now. The 5h/7d gauge used to floor its fill at the bar's own height — 3pt of a 20pt track — so every value from 0 to 15% drew the same stub, and the rounded fill shape ate what little width was left: 18% of the weekly quota read as almost empty. The fill is now a straight-edged rect clipped by the track capsule, the way the system battery gauge draws its charge, and its width is round(percent × track width) in device pixels — with a one-pixel floor above zero, so "critically low" never looks like "empty". Pinned by pixel-measuring tests on the actual drawing code in the model suite.

Changed

  • The bar no longer polls the system for Claude Desktop. It used to ask macOS for the full list of running applications on every idle tick; now it subscribes to the workspace launch/terminate notifications and just reads a flag. Before the app would quit itself it re-checks with a live, targeted query, so a missed notification can delay the quit but can never close the bar while Claude Desktop is actually running. Ported from upstream claude-status-bar 0.4.4 (issue m1ckc3s#53).

The DMG is not notarized (no Developer ID yet): on first launch macOS will object — right-click → Open, or allow it in System Settings → Privacy & Security. The plugin channel and the in-app source build are unaffected.

Full details in CHANGELOG.md.

v0.7.5 — the window earns its name

Choose a tag to compare

@InfinityScripter InfinityScripter released this 12 Aug 14:54

The "What's new" window earns its name: it now looks like release notes instead of a wall of plain text.

Changed

  • The "What's new" window looks like the app talking, not a text dump. It gains a header with the app icon, a large title and the version with its release date; section names render as small colored labels (added green, fixed blue, changed amber); the changelog's bold lead sentences actually show bold in full text color while the prose around them steps back to secondary, and inline code gets a monospaced face — so the window scans like release notes instead of a wall of matter-of-fact text. The panel content moved to its own source file and is rendered to an image by a bare harness, which is how both light and dark appearances were reviewed before shipping — main.swift never links into any test.

The DMG is not notarized (no Developer ID yet): on first launch macOS will object — right-click → Open, or allow it in System Settings → Privacy & Security. The plugin channel and the in-app source build are unaffected.

Full details in CHANGELOG.md.

v0.7.4 — updates stop being invisible

Choose a tag to compare

@InfinityScripter InfinityScripter released this 12 Aug 14:25

An update — either channel's — now announces itself and shows its changelog, the way auto-updating apps are supposed to.

Added

  • Updates stopped being invisible. The plugin channel rebuilds and swaps the app with no user action — convenient exactly until you wonder why the app behaves differently and nothing anywhere says it changed. Every update now announces itself the way auto-updating apps do (VS Code, Raycast, Chrome): a notification on the first launch of the new version, and a one-time "What's new in X" menu row that opens the changelog section for exactly that version — read from the CHANGELOG.md the build now ships inside the bundle, so it matches the running copy and works offline. The row retires once opened; a fresh install says nothing, and a deliberate rollback stays silent too — announcing a downgrade as "updated" would report the opposite of what happened.
  • An available update explains itself before you take it. The daily release check already downloads the release notes with the tag; they were dropped on the floor. A newer release now raises one notification per version — never a daily drumbeat — and the update section of the menu gains "What's new in X" showing those notes, so the decision to update comes with the reasons in hand. No new network requests and nothing new sent anywhere: the same single releases/latest call as before.

The DMG is not notarized (no Developer ID yet): on first launch macOS will object — right-click → Open, or allow it in System Settings → Privacy & Security. The plugin channel and the in-app source build are unaffected.

Full details in CHANGELOG.md.

v0.7.3 — a build gets its hour

Choose a tag to compare

@InfinityScripter InfinityScripter released this 07 Aug 14:56

A working session stops being called idle, and the plugin's own build stops being able to hang or orphan anything.

Fixed

  • A 20-minute build is a working session, not an idle one. There is no "still running" hook, so the flat 15-minute cap read any long tool call as idle — and hid its row mid-build. A tool call now gets an hour (a dead one is caught far earlier by the interrupt net and the process reap); thinking keeps 15 minutes, but a transcript still streaming — its mtime moving — extends it. Two tempting designs are recorded in the code as measured dead ends: a tool's transcript is silent by design until completion, and "the process has children" is always true (idle sessions hold their MCP servers).
  • A plugin build past its ceiling dies as a group and logs, instead of crashing — or hanging — the SessionStart hook. The whole process group is killed, the compiler's last stderr words land in problems.log, the drain is bounded so an escaped descendant cannot hold the hook hostage, and the inner ceiling (240s) now keeps real margin under the hook's outer 300s — with a test pinning the two apart.
  • A hand-edited or foreign JSON file with the wrong top-level shape cannot crash a refresh or a hook. The shape check moved into read_json itself, in all three copies of the helper; 0.7.2 had patched the same class twice at single call sites.

Changed

  • The session state machine is out of main.swift and under the model checks — caps and both recovery nets each pinned by a test, the js→swift state-file seam closed from both sides, and model-test timestamps now use the fractional-second format real transcripts write (the bare format only ever exercised the parser's fallback branch).
  • The toolchain probe left the menu-open path — warmed once in the background at launch instead of a synchronous spawn inside the first menu open.

The DMG is not notarized (no Developer ID yet): on first launch macOS will object — right-click → Open, or allow it in System Settings → Privacy & Security. The plugin channel and the in-app source build are unaffected.

Full details in CHANGELOG.md.

v0.7.2 — quit means quit

Choose a tag to compare

@InfinityScripter InfinityScripter released this 07 Aug 12:19

Five confirmed bugs from a full-project review, each closed with a failing test first.

Fixed

  • Quit sticks. Resuming a session — --resume, --continue, a laptop waking, a compaction — no longer brings the app back after an explicit Quit. Only a genuinely new session (or /clear) is fresh consent.
  • The limits poll survives a changed answer. The usage endpoint is undocumented; an unexpected response shape used to crash the poll invisibly and freeze the limits. It now reads as a failed poll, and one malformed window no longer drops the rest.
  • No more orphaned MCP servers. A probed server that ignores SIGTERM used to outlive its probe and multiply every ten minutes. The teardown now escalates to SIGKILL and reaps what fell.
  • A corrupted state file shows a wrong number instead of crash-looping. Eight trapping Int(Double) conversions on file-fed values — including hand-editable uiconfig.json — now clamp.
  • Backups of settings.json are owner-readable only, including the first one ever taken. Born with owner bits at creation; a per-refresh sweep also fixes existing ones.

Added

  • The JS→Swift and Python→Swift schema seams are pinned by cross-language contract tests — a key rename now fails a suite instead of silently emptying the menu.

The DMG is not notarized (no Developer ID yet): on first launch macOS will object — right-click → Open, or allow it in System Settings → Privacy & Security. The plugin channel and the in-app source build are unaffected.

Full details in CHANGELOG.md.

v0.7.1 — the click finishes the journey

Choose a tag to compare

@InfinityScripter InfinityScripter released this 07 Aug 08:08

The click now finishes the journey: an extension-panel session opens as that very conversation, not just as the editor it lives in.

Deep link into the session

The Claude Code extension registers a URI handler: <scheme>://anthropic.claude-code/open?session=<id> resumes exactly that session in the editor's Claude panel, and the row click for an extension-panel session now sends it. The scheme is read from the editor's own Info.plist — Cursor registers cursor, VS Code vscode, every fork brings its own — so there is no catalog to maintain, and open -b pins the receiving app in case two forks claim one scheme. An editor whose extension lacks the handler still comes to the front as before.

A session running in an integrated terminal keeps app-level focus on purpose: deep-linking one of those would open a second copy of a conversation that already lives in the terminal.

The DMG is not notarized (no Developer ID yet): on first launch macOS will object — right-click → Open, or allow it in System Settings → Privacy & Security. The plugin channel and the in-app source build are unaffected.

Full details in CHANGELOG.md.