Skip to content

0.9.4 — tabs drag the way Chrome's do, the context ring reads at a glance, and search reaches inside a project

Choose a tag to compare

@github-actions github-actions released this 12 Sep 05:45
· 71 commits to main since this release
v0.9.4
354fe3e

Four things you can see, and one that only shows up when Claude works on this
repo. Every one of them was driven in the running app over CDP before it landed,
which is how the bugs listed under each were found.

Tabs drag the way Chrome's do. Dragging a tab used HTML5 drag-and-drop, so
what followed the pointer was Chromium's translucent bitmap, free to wander over
the terminal and out of the window, while the tabs underneath stayed put until
the pointer crossed a neighbour's centre — at which point one jumped a whole slot
with no animation. Between 100 and 290 px of travel bought you nothing at all.
The real tab moves now, locked to the strip and clamped to it, and its neighbours
slide aside as it passes them. Pressing a tab selects it immediately, releasing
settles it into the gap, Escape puts everything back, and the strip scrolls
itself when you reach its edge. The order is committed once, on release, instead
of on every slot crossed. Terminal panes are rendered in an order a reorder
cannot change, so moving the tab you are working in no longer moves the xterm
node out from under your focus.

The context ring reads at a glance. It ran on two thresholds with the healthy
state drawn in the brand accent, and it was never allowed to turn red. It has
four bands now, on the percentage you can actually read on screen: green to 30,
orange to 60, red to 80, and from 81 a solid red disc. The colours are solved per
theme against the page behind them rather than reused from the warning palette,
which renders gold and salmon on the dark themes. The status bar, the sidebar,
the launcher and the phone all take the same rule from one module instead of
three hand copies.

Bypass mode stops shouting. With bypassPermissions as your default, every tab
carried a dashed amber ring forever — an alarm colour for a setting, at ten times
the contrast of the ring it was drawn on, in the same tone as the arc inside it.
It is a row of slate beads in the theme's own neutral now, and any bead the arc
would touch is dropped rather than half-covered. Amber is left for things that
are actually happening.

Every plan-limit bar is the same length again. Each row of the usage panel
laid out its bar and its reset text on one line, with the text column sized to
its own content — so the bar got whatever was left. A row reading "ahead · resets
Mon 09:00 · in 3d 14h" left it exactly 0 px, and the percentages slid 139 px
sideways down the panel. The text sits on its own line now and the bar has the
one below it, so every bar starts and ends in the same place at every interface
scale, and the pace marker is comparable between rows.

Search reaches inside a project. The sidebar matched project names, paths and
labels, and nothing else: chats were invisible until you expanded the project
holding them. It now indexes every session's title and opening message across
every project — reading only the first and last chunk of each transcript, about
115 ms for the 95 on this machine — and shows the matching chats under their
project with the hit highlighted. Cmd+K had its own matcher that ignored folder
labels, so a renamed project could not be found by the name you gave it; both
surfaces share one rule now.

Working notes. CLAUDE.md is 27 KB rather than 155 KB, because Claude Code
injects it into every session and every subagent before a word is typed. Each
gotcha's full text moved, byte for byte, into path-scoped rule files under
.claude/rules/ that load only when the code they describe is opened; CLAUDE.md
keeps one checked line each, so the numbers cited across 62 files still resolve.
Two review passes over that move caught index lines that would have misled
whoever read them, and corrected claims the code had outgrown.
-----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgRMU791FgMe8r+DfqyzVBFQ6kaz
8vnoPpPI8Ui7gGH3MAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5
AAAAQEzN1yj5NGZxwxRkK8fSw5A9WQ2l735g9IhqR2LK+Xmqi4JvWkYZdck2tOx5PzW561
wCle6WV5Wh0Sf6pq2fCg4=
-----END SSH SIGNATURE-----