Changelog
Every release, in plain words. Updates install themselves.
0.1.150
- The window buttons are macOS's again, untouched. Three releases in a row tried to reposition them into a Safari-style inset and each shipped a differently wrong window; the report that ended it was a real 0.1.149 window whose buttons sat at three uneven positions the code itself had put them in, next to a Finder that was even. The premise was false from the start — on windows that carry a toolbar, macOS already insets the buttons, which is the exact look the feature was chasing — and no reading of a live window is guaranteed to catch the layout mid-flight rather than settled, so there was never a safe moment to impose our own. The whole mechanism is deleted. The buttons cannot be wrong if nothing moves them, and a fresh launch verifies it: identical positions and spacing to Finder, measured through the accessibility API.
0.1.149
- The window buttons sit evenly again, and this time it was measured rather than reasoned about. 0.1.148 claimed this fix and made it worse: it captured whatever spacing it first read and then held the buttons there permanently, so a reading taken mid-layout became that window's spacing for good, where the original bug at least corrected itself on the next redraw. Checked against Finder and Notes through the accessibility API, all three sat their buttons at the same place — and so did Kaisola, before any of this code touched them. macOS has moved the buttons inward on its own; the inset this feature existed to create is now what the system ships. It stands down when the buttons are already where it wanted them, which is the only way to be sure they keep the system's own spacing.
- The left rail is a card again. 0.1.147 made it a full-height surface running seamlessly into the canvas, and that is exactly what left it with no visible edge: both sides of the boundary were deliberately the same colour, so the whole distinction rested on one hairline that the window's own clipping kept swallowing. Two attempts to make that hairline show were treating the symptom. The rail now insets on all four sides, rounds its corners and carries its own edge, holding the window buttons the way Safari's sidebar does.
- Settings gets a white page, room to breathe, and macOS's own group boxes. The panel used to inherit whatever wash the theme was painting behind it, so the page was grey. The cards were the imitation kind — a grey fill with a drawn border — where macOS does the reverse: the box is the lighter surface, white, lifted off a very slightly darker page by nothing but a shadow. Margins go half again wider, so a pane reads as a page instead of a table run edge to edge.
0.1.148
- A finished turn stops saying its subagents are still working. A subagent's chip took the word "working…" from its spawning tool call still being open, and nothing looked again once the turn ended, so every subagent whose completion the adapter never sent left a chip claiming live work, still animating, under an answer that had already landed. Several delegated agents meant several of them. The word now depends on whether the turn is alive: an unreported subagent reads "no report", which is deliberately neither "finished" nor "failed" because both invent an outcome nobody was told. It stops animating too, since a chip that keeps shimmering reads as running whatever its label says.
- Settings is rebuilt on the grammar macOS uses for its own. The group's name moves above its card, so a group is a labelled list of settings rather than a small window with a heading bar and a rule inside it. Rows lose their leading glyph, which System Settings carries in the sidebar and nowhere else, and every control is sized to its own value and right-aligned instead of stretching to whatever width the row had spare, which is what made a two-word choice draw a box most of the pane wide. The sidebar picks up the coloured glyph tiles, the selected row takes the accent as a fill with white text, and the row cadence tightens now that nothing has to clear an icon.
- A whole chat message can be copied. Selecting inside the transcript only ever reaches the end of a paragraph, because a rendered answer is a separate text view per block and selection cannot cross between them. Right-clicking any prompt, answer, or thinking block now copies the whole thing, in the original markdown, so a pasted code fence is still a code fence.
- The left rail rests narrower: a double-click on its divider, and every fresh window, now lands at 180pt rather than 245. Windows already carrying the old width move once to the new one. The hierarchy indent shrinks with it instead of holding a fixed 28pt that would have been a sixth of the column, and the trade is real: a session title draws thirteen characters where it drew twenty.
- The traffic lights sit evenly again. The inset was applied by shifting all three buttons by the delta that moved the first one, which assumed macOS had returned all three to their standard places at the same moment; it relays them out one at a time, so a badly timed relayout spaced the red button a third of a button-width from its neighbours.
- The left rail has a visible right edge again. It looked like a colour problem and was a geometry one: the rail and the canvas deliberately share a colour now, so a single hairline was carrying the whole boundary, and that hairline was laid out exactly on the split view's clip edge — where it was the first thing rounded away. Raising its contrast changed nothing, because the line was never being drawn. It comes from the other side of the boundary now, one point inside a region nothing clips.
- The canvas behind "Start a session" no longer drops to its idle still, which had left the middle of the window flat between two tinted rails at exactly the moment the chooser was up.
- The footer stops truncating your account name and drops it instead. On a narrow rail the name's lane runs out once the usage chip is showing, and a chip drawing "m…" is worse than the avatar standing on its own; the full name is in the tooltip and the account menu either way. Below 160pt a session row likewise gives up its time-in-state label rather than let it squeeze the title.
- Usage keeps up while you watch it. The pane already painted the last known figures from cache, but nothing asked again once it was open; it now refreshes on its own cadence while it stays on screen, and says when it is updating instead of leaving cached numbers looking live.
0.1.147
- The shell you previewed is the shell. 0.1.146 put the next shell behind a Settings switch and left the tab shape deliberately open; pills won, so the switch retires with the answer built into it. One condensed 40pt bar carries the project switcher with the session tabs packed beside it. The left rail is a single full-height card whose rows rest quiet and fill only on selection and hover. The workspace runs edge to edge, with no floating panel drawn around it. The 30pt window corner, defined back in 0.1.133 and referenced by nothing since, finally applies. Settings takes over the workspace instead of opening a window of its own, and the ⌘, that opens it now closes it again. Retired with the old shell: the stacked project strip, the Quick Actions row, the scrolling session strip, the capsule tab variant, and the preview switch itself; a stored preview-era preference is ignored rather than migrated. The pane header's maximize arrow and account button move into the menus that already carried those actions, and the footer gains the update badge beside the bell. About 360 lines came out, net.
- The random quit is fixed. Changing the shell's structure while a window's split view was tracking a drag tore that view down inside AppKit's own event pass, and the crash landed in the divider-peek machinery reading what had just been replaced. A layout switch now applies on a later run-loop turn rather than the one that asked for it, which is the discipline the settings takeover was already holding.
- Tinted flows like water. The brief was a stronger gradient with more life and more flow, water or wind rather than a slow rock, with Refik Anadol's Bosphorus as the reference. One sweep becomes a three-layer field: the palette sweep whose midpoint folds while its endpoints drift, a broad cross-current travelling against its own shear on the opposite diagonal, and a radial ripple wandering two paths at once. Its eight periods run from 19 to 59 seconds with no pair near a whole-number ratio, pinned by test, so the motion never falls into step or visibly repeats. It stays cheap: every animation is render-server owned and capped between 5 and 15 frames a second, and the whole field freezes when the window is covered or minimized or the app hides. Reduce Motion parks it as a static, richer field. Legibility is held exactly where it was: light coverage rises to 0.34 and dark saturation to 0.36, with the intensity ladder re-solved so every rung still clears the worst-patch floor the ink contrast was built on, and the dark flow colours capped so stacking shifts hue rather than brightness.
0.1.146
- The canvas stops going gray, on every path. The glass you actually run samples the desktop through a live system material, and that material's plate tops out visibly below white — so a white-ish desktop landed the rails and canvas at material gray while the app's bars stayed properly white beside them. The live path now gets the same floor the painted one got in 0.1.141: the sampled desktop colour splits the treatment, so a bright near-neutral desktop takes a white lift and reads white-led, a colourful desktop keeps its hue (that is the glass), a dark one takes neither, and the gray no-desktop fallback no longer paints gray tint over anything. Solid, separately, is a true plate again: the tenth of behind-window material it carried meant its white ground was white only when whatever sat behind the window happened to be, and dropping it also stops a live blur compositing under an opaque theme.
- The next shell is a switch you can flip, not a stack of screenshots. Settings ▸ General gains a Shell preview picker (Off, or the new shell with pill or capsule tabs) that applies live, no relaunch, in both layouts. On, you get the revision with this round's corrections built in: one condensed 40pt bar where the session tabs sit packed beside the project switcher at small fixed gaps instead of spreading across the window, a left rail that is a single card whose rows rest quiet and fill only on selection and hover, the Files rail as the same card, and the 30pt window corner applied for real. Off is the shipped shell exactly, held there by contract tests. The tab-shape question stays open on purpose: flip between pills and capsules in the running app and keep the one that feels right.
0.1.145
- The glass drinks more of the desktop. The painted glass was technically tinted but visibly grey next to the wallpaper behind it; the desktop's share of the pane colour rises by about forty percent in both appearances, the saturation ceiling lifts, the warmth layer strengthens, and the light-mode sidebar picks up the live tint it never had. Legibility is untouched: the veil's transmission and the ink-contrast targets stay pinned exactly where they were.
- The effort chip remembers. The reasoning-effort choice was pure session state, reset to the adapter's default on every relaunch. It is now remembered per agent and re-applied through the connect handshake, with the discipline the permission mode earned in 0.1.138: only an adapter-confirmed value is kept, a refusal rolls the chip back and realigns the memory, and a replayed history cannot overwrite the choice.
- Signed in stays signed in, this time at the keychain's level. 0.1.136 fixed the migration that deleted tokens; underneath it, the stored item's own protection was bound to the exact binary that created it, because the legacy keychain never rewrites an item's access rules after creation. Every update therefore arrived as a stranger: macOS re-prompted for keychain access, and denying once read as signed out. The store now refreshes the item's protection one time, recreating it under the stable signing identity, after which updates walk straight in. A surviving session answers one last access prompt and is then rebound; a session already lost to the earlier bug needs one fresh sign-in, which then holds.
- The release script's second blind spot gets the 0.1.144 treatment: the review-threads probe now retries transient reads instead of dying mute.
0.1.144
- Chats come back before terminals do. Opening a project now restores the chat workspace first and lets terminal setup follow, so the conversation you left is on screen without waiting for the slower half of the window; a large new reconnect test bed pins the ordering.
- The one-bar shell direction is written down. The minimal canonical shell contract lives in the docs for the next UI round.
- Releases finish themselves again. The release script survived its tag and assets but died silently before landing the version bump on three consecutive releases; it now retries transient reads and says what failed instead of exiting mute.
0.1.143
- Onboarding's update prompt now opens the Updates pane directly instead of leaving you to find it in Settings.
- The weekly agent-dependency refresh script ships in the repo it runs from; its first commit had raced a merge and the scheduled job would have found nothing to run.
0.1.141
- White backgrounds finally read white. The light glass used to normalize every desktop down to a fixed pale grey before frosting, which kept text legible on dim wallpapers but turned a white background into a grey pane. That target is now a floor instead of a destination: dim desktops still get lifted so ink never lands on a dark surface, and anything brighter shines through at its own lightness — white like Messages, tinted by your wallpaper like Finder. Dark mode is unchanged.
- Files lead the message. A prompt sent with images or files now shows them as small chips at the top of the bubble, an icon and a name each, with your text underneath — instead of a trailing paperclip line under the prompt. Restored and resumed threads pick up the same treatment.
- The agent stack updates itself. The Claude Agent SDK and the sealed Node runtime moved to their newest releases, and a weekly refresh now keeps them there: bumps land through ordinary pull requests so every release gate still applies, and a CI check opens an issue if the pins ever fall behind. The chat adapters for Claude Code and Codex were never pinned — each new chat already launches the newest published adapter.
0.1.140
- The terminal broker is gone. Terminals now run inside the app itself: one in-process PTY engine replaces the detached Node process, its dormant Swift twin, the bootstrap LaunchAgent, and the client, generation, and upgrade apparatus that existed to manage them (about 47,000 lines, net). The trade is deliberate: shells close with the app and reopen at their recorded folder on relaunch, and in exchange there is no second process to spawn, dial, authenticate, crash, or leak. First launch after this update quietly cleans up whatever an older install left behind: the LaunchAgent, cached broker state, and any orphaned broker process still running.
- Agent turns settle again, and faster than before. The engine watches each terminal's own output for the shell's end-of-command mark, so a finished command flips the session from working to responded the moment the prompt returns; a pty exit settles it too, and an agent that never signals its end relaxes the spinner after a few quiet seconds. Review of the new engine also caught that activity frames were addressed with the wrong owner identity and silently dropped, and that the engine claimed the old broker's output batching without implementing it, which would have put every raw chunk on the main thread; both are fixed, and the app keeps its own frame window as the single coalescer in the path.
- The sealed Node helper shrinks to its last real job. What ships now is the pinned node runtime plus the usage and shell-environment modules the app actually calls; the session-broker script, the bootstrap binary, and the schema-2 native-package machinery are deleted, and the package verifier accepts only the one shape that still exists.
- The app stops talking about a process that no longer exists. The History Storage card, the retained-terminal upgrade and rollback menu, and the terminal-continuity onboarding row are gone; restart copy says plainly that terminals close with the app.
0.1.139
- Chats open in about a second instead of thirty. Both shipping adapters advertise session resume as an empty object on the wire, and the capability parser read it with a boolean accessor — so resume always parsed as unsupported and every reconnect fell back to
session/load, which replays the thread's entire history before the connect completes. Presence now counts as the advertisement, and a chat whose transcript is already on disk reconnects throughsession/resumein one round-trip (925ms on the wire in verification, with zero replay traffic). A chat with no local transcript — an adopted session, a lost store — still takes the load path, because the replay is its only source of visible history.
0.1.138
- The remembered permission mode stopped losing races. A mode chosen in the seconds after a relaunch — while the adapter was still spawning — found no session to ask and was silently snapped back; it is now kept, shown, and applied by the connect handshake, with only a real adapter refusal rolling the chip back. And a mode announcement replayed by
session/loadcould rewrite the memory before the restore handshake compared against it, wiping the choice on every launch; adapter-side announcements now update the memory only after the handshake arms them. Verified against both shipping adapters on the wire. - Screenshots drag and paste into chats. The drop target accepted only file URLs, and the macOS screenshot thumbnail — the drag people make right after taking a screenshot — offers image data behind a file promise, so it bounced; image drags now land as attachments under their own name. Cmd+V works too: the field editor owned the paste and dropped images on the floor, so the composer now catches an image paste itself (only when there is no text to insert — text pastes stay the text system's business).
- Background-task notifications stopped impersonating you. The harness injects them as user turns, and the transcript drew each one as a full-width bubble of XML — screenfuls of plumbing, and the main reason a restored chat mounted somewhere other than its end. They fold into one quiet caption line with the extracted summary, and they no longer end a turn: one human exchange has one final answer, and that answer now carries a small "Response" title so it is findable at a glance.
- Chat zoom exists now. The ladder's rungs (
.small … .xLarge) spanned about one point of body text on macOS —.largeIS the system default — so the control read as decorative; the rungs now sit at 85 / 100 / 130 / 170 percent. Cmd+Plus, Cmd+Minus, and Cmd+0 drive it whenever the focused pane is a chat, and keep adjusting the terminal font everywhere else. - The glass defaults to Clear, and the bars go white. Clear (transmission 0.92, with the accessibility fallbacks unchanged) is what three rounds of "extremely more translucent" were asking for. Separately, the app's horizontal bars — pane headers, the find bar, the document strip, the four Mesh bands — spoke five different grey dialects (
controlBackgroundColorwashes and three system materials); they now share one white-led bar surface: unmistakably white over the glass in light, a faint white lift in dark, solid under Reduce Transparency. - The small grey squares behind every card corner are gone, at the source. The chrome card's floating shadow was masked by a frame-bound rectangle, which erased the outward spill the doc claimed and kept only the bounding-box corner notches — four blurred wedges ending at hard 90° edges. The mask now extends past the card by the shadow's full reach, so the float fades continuously into the gutter. And the pane cards rounden a step (12 → 14, the composer with them): the surfaces in view all day now curve closer to the macOS 26 neighbourhood the outer card already lives in.
- The header's controls line up because they are finally in the header. The Show Document / Show Files pair floated as a grey capsule overlay in a different coordinate space — 6pt off the other controls' baseline, and sitting directly on top of the pane's minimize and maximize buttons whenever a panel was hidden, which made those two buttons unclickable. The capsule is retired; the doors are ordinary header controls now, in the pane that owns the workspace's top-trailing corner, drawn and sized exactly like the account switcher and the ellipsis beside them (whose click target also grew to its full slot). An empty workspace keeps the doors at the same corner.
- The sidebar's double-click resets a step narrower. The divider's reset (and a fresh window's opening width) goes 290 → 245 — "1-2cm less wide", as asked — and windows the app itself had parked at 290 move once to the new resting width; a width you dragged yourself stays exactly where you put it.
- A five-lens review panel went over the result against Apple's current design and its confirmed findings landed in the same pass. The bars ride real Liquid Glass on macOS 26 (the white plate stays as the older-OS and Reduce Transparency answer, and it thickens under Increase Contrast). The panel toggles became permanent — a door that deleted itself on click slid the next button under the cursor — and every bare header button answers hover the way the menus beside it always did. The zoom commands say "Zoom In / Zoom Out / Actual Size" under a "Zoom" header instead of claiming to be terminal font controls. The chrome card's newly-visible float softened from popover weight, and the composer's shadow no longer out-weighs the card containing it. The "Response" title outranks the work-run line instead of losing to it, answers keep one line rhythm through lists and quotes, and nine transcript labels moved off the system secondary ink onto the measured one. Status capsules stroke inside their own edge, the app's floating cards curve continuously, and the attachment button and composer chips reach a real pointer size.
0.1.136
- The chat has one header again. The second strip an embedded chat drew under the pane header — zoom, checkpoints, the context fraction, export — is gone; everything it held lives in a single ellipsis menu in the pane's own bar, next to the account switcher. The context readout inside that menu says what the session has actually spent ("Context used: 164k") and drops the "/ 1,000k" denominator outright: the limit read as a wall you were about to hit, and the number that matters is the spend. Standalone chat windows keep their one header with the same single menu.
- The collapsed work line stopped crying wolf. "Ran 32 commands, read 4 files · 2 failed" painted a red suffix over every burst that contained a benign non-zero exit — a grep with no matches, a probe that answered no. The suffix is gone; the call-by-call log behind the click still marks each failed call in red, so real failures are one click away instead of ambient.
- Watching a subagent opens a real card now. The watch click used to anchor a transient popover that vanished on any outside click; it now pops a floating glass card over the chat workspace — Liquid Glass on macOS 26, a material below — with the agent's live feed: a freshness dot that answers "is it actually working", its recent commands and words refreshed every two seconds, and one-click reveal of the full transcript. It stays open beside the stream until you close it; watching a second subagent replaces the first; Mesh columns keep the popover.
- The stream stopped slicing rows while it follows. Following the tail used to be a chain of discrete scroll hops fired ~80ms apart, and every frame between two hops could catch the transcript mid-flight — rows guillotined at the viewport edge, then yanked down. While follow is engaged the scroll view now pins the tail natively through every content-size change (macOS 15+), with the coalesced hop kept as a correction pass; and on macOS 26 the transcript's top edge gets the system's soft scroll-edge treatment, so a row leaving the viewport eases out instead of being cut at the clip line.
- Permission choices survive restarts. The composer's Ask / Accept edits / Full access mode was session-only: every relaunch quietly reset it to the adapter's default, so a chat you had opened up to Full access went back to asking on every launch. The chosen mode is now remembered per chat and re-applied when its session comes back, provided the adapter still declares that mode; a vanished mode keeps the adapter's own current one rather than guessing. Only a switch the adapter confirms is remembered or shown: a refused mode rolls the chip back and realigns the memory instead of replaying the refusal on every launch. Adapter-side switches (plan-mode exits, in-band slash commands) update the memory too, standing Create-Rule approvals already lived on disk and keep working unchanged, and deleting a chat erases its remembered mode with the rest of its footprint.
- A chat opens at its end, instantly. The transcript used to mount at the top and then chase the bottom — which read as the whole history scrolling past on every restart, update, and pane switch — and a chat you had paged back through replayed its entire expanded window on return. Content now mounts already sitting at the tail (the same anchor the iPhone companion has always used), and returning to a chat collapses the render window back to the end, so every open looks the same: the conversation, ready, at its latest word.
- The stream shows the work the way the Codex app does. A burst of tool calls is one quiet line — "Ran 4 commands, read 2 files" — with the call-by-call log behind a click, closed by default; prose, thoughts, subagent chips, and the live tail keep their own lines, and the last still-running calls stay visible so the current action never hides. While a turn runs the status line carries a clock ("Working… · 33s"), and the Copy-response affordance now belongs only to the message that actually ends the turn — interim narration flows as plain prose. The Agent Work / Response captions retired; the shape of the stream says it now.
- Click a subagent to watch it work. A detached agent's chip carries a "watch" invitation: click it and a live panel shows what that subagent is doing right now — its recent commands, reads, and words, refreshed every two seconds from the transcript the harness keeps, with a freshness dot that answers "is it actually working" at a glance, and a one-click reveal of the full transcript file. And once the turn that spawned a detached agent has ended, its chip stops claiming "in background" and says "delegated" — finished work never keeps wearing a working label.
- Signed in stays signed in. Two keychain bugs conspired to log Google accounts out after updates: the legacy-item migration could delete the only surviving copy of the refresh token right after rewriting it, and a missing profile cache destroyed a perfectly good session on the next restore. The migration now deletes the old copy only when the new one provably landed in the protected keychain, and a token that can prove who it is rebuilds the profile from its own claims instead of giving up.
- Chat history keeps everything. The per-chat disk quota goes from 32 MiB and ten thousand rows — cache sizing that truncated real working history — to a runaway-only bound of 2 GiB and a million rows. Disk is deliberately cheap to spend; your transcripts are not.
- The rails' controls go white. The Files rail's header capsule and the subagent chips ride a real control surface — Liquid Glass on macOS 26, a light material below — instead of a grey quaternary wash.
- The two rails select in one voice. A selected file in the Files rail used to get an ad-hoc flat wash (its own radius, one appearance-blind opacity that all but vanished on the dark rail) while a selected chat got the sidebar's designed accent pill. The first panel review against the Safari sidebar and Apple's Landmarks Liquid Glass sample unified them: the Files rail now borrows the sidebar's pill constants outright — same radius, same light and dark coverage, same accent-derived ink and semibold on the selected name — and its rows breathe at Safari spacing instead of the old cram. A new contract test pins the borrowing so the rails cannot drift apart again. The same review caught that the 0.1.134 rounder-ladder pass had pushed the selection pill past its own documented lozenge bound (10pt radius on a 26pt row); the pill is decoupled from the chrome ladder and back at 9pt, where the row it marks says it belongs.
0.1.134
- The chat transcript reads like a conversation with a log in it, the way Claude Code and the Codex app write one. A collapsed tool call is a single quiet line — status mark, kind, title — not a full-width grey card, and a burst of calls tightens into one run between paragraphs of prose. The raw file paths that used to sit under every call wait behind the disclosure now (the Detailed density still spells them out), expanded output indents under its own line, a failed call keeps a standing red wash so it can never pass for a completed one, and a running call's gear pulses until it lands.
- The weird corner borders around a lone chat are gone, at the root. A solo pane used to float as a second bordered card six points inside the big content card, so every corner showed two unrelated arcs a few points apart; a lone pane now fills the card and takes its corners, and only real grids keep gutters and borders, where they separate siblings. The same pass ended the chat's other corner inversions: the composer and the user bubble were both rounder than the pane that clips them and are back on the ladder, a markdown table's border stopped dissolving exactly at its corners, the drop-target ring no longer loses its corners to the pane's clip, and every artifact hairline sits at the same half-point weight as the chrome it lives in.
- The app is rounder at every edge. The whole corner ladder steps up once more, and the floating content card most of all — it now curves in the macOS 26 window family rather than a step tighter.
- The glass rails are strictly white and black now. The light rails' last app-added colour — a faint cool-to-pearl cast at the window edges — is removed outright, so a Glass side panel is white frost, black frost, and whatever your own desktop contributes through the material, nothing else.
- Subagents are visible. When the agent hands work to a subagent, the transcript now shows a distinct chip — the job's name with a live state: working (with a pulse), finished with the report one click away, failed, or honestly "in background" for detached agents the stream will never hear back from. While a turn runs, the status line adds the headcount — "Working… · 3 subagents, 1 working" — so checking on delegated work never means scrolling back to find it. Context compaction, which the adapter reports through the same channel, stops pretending to be a tool call and becomes one quiet line.
- The transcript follows the stream for real now. Following used to hinge on whether the bottom marker was still on screen, and a fast-streaming turn pushed it off between two scroll pins — follow silently died mid-answer and the "New output" pill blinked at you instead. The decision now comes from your hand: only your own scroll up releases the tail, scrolling back (or the pill, or sending a message) re-engages it, and streaming pins are coalesced so a long transcript never burns a core chasing its own tail.
0.1.133
- Parallel agent chats now read like parallel work, not a stack of anonymous chat boxes. Thinking, tool activity, and plans are grouped under an explicit Agent Work boundary; the answer begins under Response, so process is never mistaken for the delivered result. Live tabs and pane headers name what each agent is doing — Thinking, Working, or the current tool — and opening another chat while a visible agent is still running keeps both transcripts on screen side by side. Ordinary idle tab navigation stays compact and continues to reuse the primary pane. A new chat zoom control in every chat header and Settings scales transcript and composer type from 85% to 130%, persists across launches, and reflows text natively instead of magnifying a blurry finished surface.
0.1.132
- One border per pane. Every terminal and chat card in the workspace was drawing its edge as two concentric rings — the border straddled the card's clipped boundary, splitting one line into a pair at every corner. It is one crisp line now: accent when the pane holds focus, hairline otherwise.
- The Glass side panels are white now, not gray. Third report, root fix: the light rails' frost was a thin veil over a deliberately dim underlay, so they always sat a step gray of the canvas. The underlay brightened and the rail veil thickened to where the rails read white-led the way Safari's sidebar does, while the desktop still keeps the majority share of the composite — and the faint lavender edge cast that did much of the "gray" is halved.
- The Files panel always shows its minus. The hide control existed but only appeared when the rail was wider than its own default width, so in practice it lived buried in the "…" menu. It now sits beside the search field at every width, in the same grammar as every pane header's minus.
- The living tint has a volume knob. Tinted's flowing gradient ships deliberately pastel; a new Tint intensity control in Settings — Standard, Vivid, Bold — turns that same composition up without changing its colours. Vivid is half again as present; Bold is the gradient at full voice, and when the living tint is breathing, the deeper rungs breathe deeper too. Standard is exactly what shipped, so nothing changes until you choose. Along the way this fixed a quiet screenshot-harness bug where the tint palette override never actually reached the surface being photographed.
- Merges got fast. The forty-five minute contract suite no longer runs a second copy on every pull request — it runs once, on the main commit the release is actually built and notarized from, and the release still refuses to tag until it is green there. A change now lands behind about four minutes of checks. (This section also carries what was drafted as 0.1.131; that version's release run was cancelled by exactly the duplicate-suite collision this change removes, so its tag never shipped.)
0.1.130
- The launch sheet grew up. Starting a chat or an agent used to open a system alert stuffed with four popups; it now opens a sheet in the same design language as the Start a Session chooser: pick a subscription, pick where it runs, go. Each subscription row carries its own headroom — "38% used · 5-hour limit" — right where the choice is made, the router's suggestion arrives preselected with its reason written underneath, and locations are real rows showing their branch and path instead of entries buried in a popup. The Run Profile popup left the launch flow entirely: new chats start on the default profile, and policies are edited in Settings, not re-decided at every launch.
0.1.129
- "Session Connection Unavailable" is dead, this time at the root. Three releases of broker fixes each cleared a real blockage, and the message kept coming back, because the last cause was a deadlock rather than a stale record: connecting dials every broker generation the registry remembers, a dead one's leftover socket answers "connection refused", and one corpse failed the whole connection — healthy brokers included. Meanwhile the cleanup that removes dead records only ran after a successful connection, so the app could never bury the very record that kept it from connecting. One machine carried four such corpses, back to v0.1.105, in exactly this loop. Startup now buries provably dead records before anything dials; if one dies in the moment between that check and the dial, both the reading and the writing connection skip the corpse instead of dying on it; and a living broker that refuses its dial still fails loudly, because skipping it would silently drop real terminals. The "provably dead" judgment also grew a second witness — the kernel's own record of when the process started — so a clock correction can never get a living broker's records reaped.
0.1.128
- Six subscriptions no longer read as one. Every account card in Usage was showing the default login's numbers with a different name on top, because the helper that reads each account rebuilt its environment from a compatibility allowlist that silently deleted the very variable naming which account to read — and the Codex reader dropped it a second time on its own. The account pointer now rides the helper invocation as an explicit argument, which no environment filter can strip, so each card shows the account it names: its own plan, its own percentages, its own reset times, and its own signed-in state.
- Signing in stopped being chopped. The sheet's phases now flow into each other instead of rebuilding the whole layout per step, a live spinner replaces the static hourglass that made a twelve-second shell probe look like a hang, and success closes the sheet by itself once you've read it — no Done to click, no card behind it stuck saying "Not signed in" until some later refresh. A sign-in that goes quiet says so, opens its transcript, and offers Retry right there — including after you've pasted a code and the CLI went silent; retry keeps the previous attempt's output under a divider instead of destroying the evidence; and a rewording of the CLI's paste-the-code prompt can no longer strand the flow.
- A blocked chat's Sign In actually works now. The five-second verification window used to start the moment the sheet opened, so any real sign-in — browser, approval, code — outlived it and the chat flipped to "could not confirm in time" while you were still signing in. The window is now sized for the real check and runs from when you finish, not from when you start.
- Usage cards and the Accounts list agree. They derived signed-in state from different fields, so the same account could wear green on one screen and orange on the other. Both now speak through one resolver, and a card that needs a sign-in carries the button on its face instead of hiding it behind the ellipsis menu.
- Kaisola routes your subscriptions. A "New sessions" policy on the Accounts card decides how launches pick an account: Manual is exactly what you had; Remember last choice preselects the account you last used with that agent — the default, and invisible until you pick something once; Balance by headroom suggests the signed-in account with the most limit left and says why, right under the picker. Under the balanced policy a Mesh fans its columns across your subscriptions freest-first instead of stacking every column on the project default. Suggestions preselect, never override: your explicit pick always wins, and an account the router can't verify is never suggested at all. Kaisola still holds no provider tokens — every account's credentials stay with its own CLI, in its own directory.
0.1.127
- Tinted comes in five colourways. A Tint palette menu joins Settings when the theme is Tinted: Meadow is exactly the composition you already had, Dusk crosses warm sand into a dusty rose, Harbor a powder blue into seafoam, Graphite two quiet greys, and Desktop takes your wallpaper's own hue and holds it to a pastel — fixed softness, fixed brightness, only the hue is yours, so a saturated wallpaper can never turn the window flat blue the way raw sampling once did. Dark mode keeps each palette recognisably itself rather than falling back to one shared look.
- The living tint is finally visible. The breath was shipped at a depth nobody ever reported seeing; it now swings twice as deep on a curve that lingers at each end, and the whole field swells about three percent on its own slower rhythm. Three motions, three periods, none of them multiples — so nothing ever pulses. Still opt-in, still stilled by Reduce Motion.
- Every theme sits on frosted glass, the way Safari's window does. Solid and Tinted painted their background as one flat plate to the window's edge; now the ground under everything is the same behind-window material Glass uses, with Solid keeping its exact white (or near-black) at nine parts in ten and Tinted flowing its gradient over the material. Your work surfaces — terminals, chats, documents — stay fully opaque in Solid; that promise moved to where it matters. Reduce Transparency still gets the flat plate everywhere, including one Tinted branch that previously ignored it.
- The window is rounder where you actually look. Every corner in the app steps up — the content card most of all — and that card finally casts a shadow into the gutter around it, plus a hairline that closes its lower edge in light mode. It reads as a card floating on the ground instead of a differently-tinted region. With Reduce Transparency or Increased Contrast the card keeps a flat, high-contrast border and no shadow.
- Session rows sit tighter under their projects. Titles drop a point, the little brand marks scale down with them, and each session row gives back six points of height — so the list reads as projects with their sessions tucked underneath, not two lists fighting at the same size.
- The chat looks like it was built this decade. While the agent works, a light sweeps through the status word — Thinking, Working, or the tool's own name — the way Claude Code and Codex do it, owned entirely by the render server and frozen the moment the window is covered or Reduce Motion asks. Your messages sit in proper bubbles with room to breathe, replies keep a steadier rhythm between turns, tool-call headers say less and show more, and the agent's inner thoughts carry a quiet quote rule.
- Connecting no longer loses to the ghosts of brokers past. After a restart, the process numbers of long-dead brokers get handed out again — sometimes to system processes the app has no right to signal, which it read as "still alive". One such phantom from v0.1.105 could never be cleaned up, the cleanup that worked around it kept rewriting the shared registry, and every connection attempt noticed the rewrite mid-handshake and aborted as a safety measure — so the app sat on "Session Connection Unavailable" while a perfectly healthy broker waited to be asked. A broker recorded as started before the last boot is now known dead no matter who holds its old number, every dead record is cleared in one pass instead of one per heartbeat, and a failed handshake closes its connection instead of leaving it dangling.
0.1.125
- Terminals survive a restart of your Mac. Each session broker leaves a lock file while it runs and removes it as it exits — but a broker that dies with the machine never gets to remove anything. On the next launch the new broker saw the old lock, concluded another copy of itself was already running, and quit without writing a single line of log, over and over, all day. A lock now names the process that took it from the moment it exists, one written before the last boot is never mistaken for a living owner however its process number has been recycled, and a lock whose owner is provably gone is cleared and taken over. A lock whose owner is genuinely alive is still respected, and now says so in the log instead of saying nothing.
- Groundwork for a faster, native session engine. The app can now build, package, sign, and launch its Swift terminal broker through the same production contract as the Node one — but only when a developer explicitly asks for it with an environment variable. Nothing changes for normal use: Node remains the engine every launch gets, and the new binary rides along inert in the app bundle until the native engine has earned the switch.
- Glass stays bright when you click away. The window dimmed to grey the moment it lost focus, because the material was treating focus as something to indicate. Glass is the app's surface, not a focus light; it now stays as white unfocused as focused, the way the desktop apps beside it do, and the light veils are brighter across the board.
- Tinted can breathe. Settings has a "Living tint" switch, off by default, that lets the gradient swell and settle about three times a minute — shallow enough that you feel it rather than see it. It stays out of step with the drift so the two motions never pulse together, and it holds still with Reduce Motion on or while the window is covered.
- Other Macs keeps quiet until you have another Mac. The section was showing "The saved Firebase session is unavailable." to people who had never paired a second computer — an error about a connection that was never made. Errors there now appear only once this Mac has actually seen another one, and that knowledge survives relaunches even when the saved snapshot does not load.
- The project sidebar opens at the width long titles need, and remembers yours. Drag it and the width sticks across launches — a stray click on the divider does not count as a choice — and a double-click on the divider goes back to the default.
- The Files rail sits flush against the window. It was drawn as a rounded box floating inside the pane, the only surface in the window with its own frame; it now runs straight to the edges like the project rail on the other side.
- Starting a session answers your pointer everywhere. The chooser's keyboard focus draws a visible ring instead of leaving the first card looking exactly like the other three, Escape steps back before it cancels, and a card or agent row that cannot be clicked visibly dims instead of pretending it might. Project tabs, session tabs, and both + buttons brighten under the pointer, and the New Session row in the sidebar shows its cancel control when you hover it.
0.1.124
- Terminals connect again after updates. A broker with no terminals quits on its own to give its memory back — that part is deliberate — but the app would only replace it if no older brokers were still running. After a few updates there always are: they hold the terminals you had open before. So every launch started a new broker, refused to publish it, watched it give up after thirty seconds, and started another, forever — high CPU and not a single working terminal, while your old sessions sat reachable the whole time. The app now replaces the missing broker and keeps every older one exactly as it was, so the terminals they own survive the same fix that brings new ones back.
- Glass in light mode shows your desktop again. The middle of the window had been made an exact white plane — deliberately, one refinement at a time — until Glass and Solid were the same picture. The canvas is still the brightest surface in the window, but a third of the softened desktop now comes through it.
- Tinted moves. Its colours were in the code and invisible on screen: at eleven percent over white, the sage and the lilac both rounded to white. They are three times stronger now — still pastel — and the gradient drifts, slowly enough that you will never catch it moving, only notice it is somewhere else. In dark mode the tint comes from your desktop's own colour and flows into a neighbouring hue of the same family. With Reduce Motion on, it holds still.
- The session cards light up under the pointer. Terminal, Agent Terminal, Chat and Mesh answered a click but not a hover; they now brighten as you pass over them, and a card that cannot be clicked no longer pretends it might.
- The sidebar opens wider. New windows get the width long project and session titles need; if you dragged yours to a size you like, it stays where you put it.
0.1.120
- Solid and Tinted have a white canvas. The middle of the window was grey in both of them while the sidebar right beside it was white, and those two are meant to be the same surface. The panel holding your terminals and chats was laying a frosted layer over the background no matter which theme you picked, and a frosted layer over white comes out grey. That layer only earns its place over Glass, the one theme that really does show your desktop, so Glass is now the only theme that gets it. Glass itself is a little clearer than it was, for the same reason.
- The account menu is readable. Under your name it was printing four or five lines of engineering detail, several of them carrying a sixty-four character fingerprint and a process number, which is what stretched the menu across the whole window and buried the one clause that meant anything at the end of the longest line. It now says the version, whether you are connected, and one plain sentence if a terminal update is waiting on something. None of the detail is gone: "Copy Diagnostics" puts all of it on the clipboard, in full, which is the form it was wanted in anyway.
- The bottom of the sidebar is bigger. Your picture, your name, and the settings, usage and notification buttons had all been shrunk a point at a time to buy room for a name that no longer needs it, and the three buttons were the faintest things in the window despite being among the few you can actually click. They are larger now and drawn in the same ink as the text beside them.
- A single terminal is no longer framed in blue. The accent border marks which pane you are typing in, which tells you nothing when there is only one pane, so it sat around the terminal all day distinguishing it from nothing while the sidebar was already marking that same session in that same colour. It appears now only when you have a split, which is the only time it answers a question.
0.1.119
- Terminals come back after an update that did not finish announcing itself. Every session broker writes itself down twice, once in the shared list of brokers and once in a file of its own, and one that is interrupted between the two leaves the newest entry in that list with no file beside it. The app read that single missing file as proof the whole list was corrupt. It threw away the healthy brokers named further down the same list, and because a corrupt list is not something it is willing to overwrite, it would not start a fresh broker either. Every terminal you had open went unreachable and relaunching changed nothing. An entry with no file written for it is now read as a broker that never finished starting, which the app already knows how to replace, and the working brokers listed beside it stay available to reconnect to. A file that exists but describes a different broker is still refused, exactly as before.
- The account menu at the bottom of the sidebar reads as a menu. Your email, the version and the connection status sat among the buttons as plain rows, and since a menu row that does nothing is drawn greyed out, all three looked like commands somebody had disabled. They are headings now: sign-out sits under your name, settings and usage go together, reconnect sits with the retained terminal versions, and the build details sit under the version.
- Settings has a third theme, Tinted. Glass shows what is actually behind the window and Solid shows none of it. Tinted sits between the two, taking the colour of your desktop and carrying it across the canvas and both side panels, so the window picks up the hue of the picture behind it without going transparent.
0.1.118
- The sidebar highlights the tab you are on in blue. It used to paint a grey bar behind it and put the colour in the text, which is backwards from every other sidebar on the Mac, and the grey ran the full width of the column while the row it was marking started well to the right of it. The fill is now the accent colour, the name and the little mark beside it match, and the highlight starts where the row does.
- Project names read as headings again. They were the largest, darkest, heaviest text in the column, which meant the folder names shouted over the sessions inside them. They are smaller and quieter now, with a little air above each one so you can see where one project ends and the next begins.
- Opening a second surface beside the first marks both of them. The row for the pane you were not typing in has never been marked at all, so half of a split always looked closed.
- Scrolling the sidebar when there is nothing below the fold no longer makes it jitter. The list was being yanked back into place on every frame of its own bounce, so it fought your finger the whole way.
- Settings has one theme control — Glass or Solid — instead of seven separate glass menus. The recipe behind Glass is now fixed, and it is a better one: the surface shows what is genuinely behind the window, live, rather than a blurred copy of a wallpaper file the app had to go looking for and could not find at all on a rotating or dynamic desktop. Dark mode is properly dark, which it was not, because the panel covering most of the window had been lightening everything under it.
- The notification bell stops moving. It appeared only when something needed you, which shoved the settings gear and the usage percentage sideways every time an agent finished a turn. It now keeps its place and only changes colour. Passing notices no longer land in the middle of the window on top of whatever you are typing into.
0.1.117
- A terminal running an agent no longer shakes when you pull past the newest line. Overscrolling at the bottom is meant to give a little and spring back. Instead, every batch of output the agent produced cancelled the gesture and snapped the view flat, and your next movement pushed it out again, so the pane vibrated in time with the output. The stretch now stays where you put it while the rows keep scrolling underneath it.
0.1.116
- Agent output is cheaper to show, again. Repairing damaged Unicode used to rebuild every chunk of every terminal one character at a time, even when there was nothing to repair — which is nearly always. It now checks first and rebuilds only when a chunk really was split mid-character, about five times faster on a chunk of agent output.
- The window no longer redraws itself for every word an agent types. A running chat published to the whole app on each chunk, so the sidebar, the session strip and everything around them were rebuilt tens of times a second to show a transcript none of them display. They now hear about the things they actually show: titles, running state, permissions.
0.1.115
- Terminals you had open before updating can be typed into again. When a broker from the previous version was still running as 0.1.114 arrived, every restored terminal came back read-only and at the wrong size: the app asked that older broker a question it had no way to answer, then read the silence as a refusal. It now only asks brokers that can answer, and a terminal that comes back owned gets resized to its pane the way it always did.
- Showing agent output costs the machine much less. A CLI agent redrawing a spinner had the broker building every terminal's output twice — one copy went to a reader that threw it away — and handing the other over a few hundred times a second. It now builds it once and sends it a frame at a time.
0.1.113
- Every side pane now hides from its own minus button at its top-right — the file tree's old accent toggle and the preview's tab-less close are gone. While a pane is hidden, its show button floats quietly over the open terminal or chat at the top-right corner, and disappears entirely when everything is open.
- Hiding the document column is non-destructive: your tabs and the open file come back exactly as they were, and unsaved edits still get the save prompt first.
0.1.112
- Fixed the evening's stuck typing for real: the app had been quietly tearing down and rebuilding its terminal streams every ten seconds whenever an emptied-out old terminal service stayed registered. Typing kept going mute mid-word; now the poll loop treats a deliberately-disconnected empty service as what it is, and old services actually get retired instead of waiting behind a busy one forever.
- Keystrokes that arrive while a terminal's ownership is mid-handoff now show the "connection is recovering" notice instead of vanishing silently.
0.1.111
- A terminal that cannot accept input says so — a notice with a reload hint instead of silently eating keystrokes — and input now heals itself within seconds once the blocker releases, announcing when typing is back.
- Signing in shares one authentication context across the keychain, so unlocking once is enough.
0.1.110
- Fixed a crash that hit about twenty seconds into a usage refresh.
- Sign-in works again on installed builds: the account store now falls back to the classic keychain when the system store refuses it.
0.1.109
- Settings reorganized into grouped categories, with honest update status and live usage inside.
- A serious memory diet: terminal scrollback keeps a sensible default depth, parked surfaces trim themselves, and the app responds to system memory pressure instead of hoarding.
- The serif reading face gets a proper measure — long Markdown reads like a page, not a terminal.
0.1.108
- Closed things stay closed: a terminal or project you close can never flicker back after a restart, a quit mid-close, or a reconnect.
- Terminal history is continuous across app updates — scrollback from before a restart pages in seamlessly, and ended terminals still serve their history without respawning.
- Markdown gains a serif reading face. Sign-in moved to the modern protected keychain.
0.1.107
- Terminals survive reboots: after a restart they return as dormant panes that respawn in place — shells automatically, agent CLIs with a resume chip so a paid session never restarts itself.
- Live Preview renders Markdown as you edit, and scrollback recovered from disk pages in cleanly.
0.1.106
- Builds are Apple Silicon-only now, which cut release times roughly in half; a canary lane installs locally-signed builds in one minute.
- Reading old transcript pages no longer re-renders everything already on screen — scrolling deep history is smooth.
0.1.105
- The glass is a quarter less saturated everywhere — the wallpaper's colour arrives calmer while its texture and detail stay exactly as they were. The idle canvas keeps its transparency but reads as glass over the picture rather than the picture at full strength.
- The project now introduces itself as what it is: an open-source IDE GUI for coding agents, native in Swift.
0.1.104
- Custom agents can now reach the chat surface — safely. Declare an npm ACP adapter and whose accounts it uses, then enable it: Kaisola installs the exact package with scripts disabled, pins its whole dependency graph, and runs only that pinned code. If anything about the install changes, chat turns off and says why until you approve again.
- A gentle heads-up when a project's CLAUDE.md or AGENTS.md hasn't changed in months — models move faster than instruction files, and stale ones quietly mislead. Once per project per launch, only when you open a chat there.
0.1.103
- Summon Kaisola from any app with ⌥⌘K — it comes forward and lands in your last chat's composer. Off by default; turn it on in Settings next to notifications.
- Every chat's usage card now shows a per-turn ledger: what each recent turn added to the context (negative when compaction shrank it) and what it cost.
0.1.102
- Switch a chat's model from inside the chat — Opus, Sonnet, Haiku, or any typed model id — and the conversation resumes under it. The account stays put, so nothing restarts from scratch.
- Move a terminal to another project: right-click it in the sidebar or its pane header. It keeps running exactly where it was; only where you see it changes, its tooltip names where it came from, and Return puts it back.
- Decide per event when notifications arrive: permission asks, finished turns, and terminal bells each get Never / When in background / Always.
0.1.101
- The bell is now the all-agents center: every session that needs you, across every project, grouped by project with Permissions / Done / Bells filters. Entries whose session is gone dim and clear with one click.
- Terminal themes are yours to add: import a JSON theme (light and dark palettes, 16 ANSI colors) and switch to it; a theme that can't be used says exactly which color failed.
- New languages highlight without an app update: import a grammar naming its file extensions, fence tokens, and coloring rules. Built-in languages can't be overridden.
- Route unfamiliar file extensions to the preview you want — a .geojson to the JSON table, a .svelte to HTML. Text previews only, by design: nothing can be routed into the PDF or image parsers.
- Every hosted terminal and chat exports KAISOLA=1 and KAISOLA_SESSION_ID, so shell profiles and CLIs can detect they're running inside Kaisola and adapt.
0.1.100
- Switch a chat's subscription account from inside the chat — even mid-conversation. The transcript, draft, and queued prompts stay; the agent restarts on the account you picked.
- An empty canvas is now genuinely transparent to the wallpaper. Open a terminal or a document and the frosted glass fades back in; close everything and the desktop shows through.
- Crisp and Clear go as far as measurement allows: Clear keeps a fifth of its old veil, Crisp sharpens from 18pt of blur to 5.
- Pin a picture for the glass when the desktop rotates or shuffles, and shuffled aerial desktops paint the right still instead of grey.
- The wallpaper's texture survives the veil, and its colour is measured where it is strongest rather than averaged away.
- Usage shows one card per subscription with one meter style, reset times in their own column, and nothing spare.
- Starting an agent session on a nearly-spent subscription says so and names an account with room.
- Split panes mark every session they show in the sidebar, not only the focused one.
- The iPhone Companion runs on the Simulator (
npm run companion:sim), so pairing work no longer waits on hardware.
0.1.1
Version numbers restart here. Kaisola was at 1.3.3; this release is the same
app, renumbered. Updates are unaffected — they are decided by an internal build
number that keeps counting up, not by the version shown in the app.
1.3.3
- Signing in to an account now finds the Claude and Codex commands wherever they are installed, instead of failing with "command not found".
1.3.2
- Sign in to Claude and Codex accounts inside Settings, instead of a terminal opening in whatever project was in front.
- Each subscription keeps its own credentials, so several accounts can be signed in at once and Usage shows them side by side.
- Starting a session on a nearly-spent account now says so, and names one with room left.
- Settings opens large, and Accounts and Usage match the rest of Settings instead of using their own look.
- Usage cards are compact enough to compare several at a glance, with one meter style throughout.
- Software updates have their own place in Settings.
- Clicking a file an agent mentions opens it, even when the file sits deeper than the name suggests.
- Reveal in Finder lands in the nearest real folder rather than an empty window.
- Images copied or dragged into a terminal arrive as the picture, not as the file's icon.
- Drop an image anywhere on an agent chat, not only on the composer.
- Agent replies stream smoothly instead of arriving in lurches.
- The glass backdrop follows a window drag at the display's own refresh rate, and rests when the window does.
- Codex reports a weekly limit only, and it is now named and drawn as one.
- The project mark is a folder, and a working agent is announced once rather than twice.
- Long file names in the Files rail fade out instead of colliding with the options button.
1.2.0
- Glass tracks the desktop behind the window, so moving Kaisola slides the wallpaper underneath it like real glass.
- Glass reads the same on any wallpaper — blues no longer wash out to white, greens no longer oversaturate.
- Glass follows the wallpaper's texture, not just its colour, and re-reads it whenever the wallpaper changes.
- New Appearance controls for glass clarity, blur, and colour.
- The active project reads bold instead of filled, and the open session is marked in blue.
- The sidebar no longer scrolls the first project out of view at launch.
- Real ChatGPT and Claude marks, and a terminal running Claude Code now shows the Claude one.
- Tinted canvas is actually tinted, and Solid is named for what it does.
- Markdown edits as one continuous document, tables and all — no block-by-block, no jumping to the top.
- Panels run to the window's top edge, reclaiming the empty band above them.
- A rebuilt agent composer: model, provider, and reasoning effort all change mid-conversation from one menu.
- Queued messages can be steered into a turn that is already running.
1.1.9
- Text and HTML files edit in a fast offline editor, with the exact bytes on disk still Kaisola's to keep.
- Outlines navigate Markdown, Swift, Python, JavaScript, TypeScript, HTML, CSS, shell, JSON, and YAML.
- PDFs open in a native viewer with selection, scrolling, and zoom.
- Switching files can no longer lose text — the newest edit is saved first.
- Restored drafts, disk conflicts, and save failures explain themselves in notices you can dismiss.
- Rendered Markdown refuses links carrying credentials and paths that leave the project.
- Files and folders move between project directories with collision checks and real Undo.
- Chat and Mesh share one transcript: headings, tables, highlighted code, copy buttons, and clickable project citations.
- Long histories move to a private database, reopen quickly, and page back without losing your place.
- Oversized images are scaled down instead of refused.
- A pop-out that fails to open offers Try Again rather than a blank window.
- Queued Mesh prompts keep their order across restarts, and stay inspectable, removable, and resumable.
- Hide, Stop, Close, and Delete are properly distinct — only Delete discards anything.
- Status reads by shape as well as colour, and Reduce Motion is respected throughout.
- An ended terminal can be recreated in place with its agent, account, title, and draft intact.
- Menus, the command palette, and workspace controls run off one registry, so shortcuts and unavailable states agree everywhere.
- Keyboard shortcuts can be remapped in Settings; a bad override fails safely and leaves the defaults standing.
- Settings unifies app defaults, provider accounts, and per-project overrides, and can check an API key without revealing it.
- First run is a live readiness checklist, and Help opens a real user guide.
- Git stages or unstages everything in one reversible step, and pulls stay to safe fast-forwards.
- Pull-request review shows the full changed-file set and stops if the destination changes under it.
- Agent permission prompts show exactly what was asked for and what a new rule would cover.
- Broker updates roll over to a new generation without disturbing terminals that are still running.
1.1.8
- Projects stay in their saved order instead of moving when selected.
- A slimmer sidebar keeps the hierarchy clear and shows only your first name in the footer.
- Document and Files controls now sit together, and Document closes either a file preview or browser card correctly.
- Both right-side dividers keep their resize cursor and drag behavior along their full height, even beside rendered documents.
- Glass is calmer, subtly warmer, and consistently rounded.
1.1.7
- Cleaner sidebar: slimmer default width, deeper session indentation, and no row highlight boxes.
- Brand icons drawn plain, without background tiles.
- Panel dividers are draggable along their entire length.
- Glass is fully color-neutral — the only tint comes from your wallpaper.
1.1.6
- Glass now reflects your desktop wallpaper only — other windows never show through.
- The active project gets a subtly tinted glass highlight.
- Terminals running Claude or Codex show their brand icon, and the OpenAI logo is now the real one.
- Settings and usage are one click away in the sidebar footer.
- Clearer status colors: blue means working, green means done.
1.1.5
- The sidebar matches its intended design: full-width titles, quieter chrome, visible wallpaper tint.
- Smooth, stable cursor around panel dividers.
1.1.4
- Sidebar rows are fully readable by VoiceOver and automation.
- Terminals hold less memory for long histories.
- Development builds keep their data separate from the released app.
1.1.3
- Terminal bells now mark a session as needing your attention.
- Long terminal histories open much faster.
- Friendlier wording across the app and a working Help menu.
1.1.2
- Large files open instantly in read mode, with Find built in.
- Previews no longer re-parse files while you move around.
- A damaged workspace layout now explains itself and keeps a recoverable copy.
1.1.1
- The Git panel refreshes live and lets you review a pull request before creating it.
- Terminal polish: your chosen font in transcripts, a Clear command, and a jump-to-latest button.
- Safer clipboard handling for terminal applications.
1.1.0
- A redesigned sidebar: your active project on top, other projects below, and live agent status at a glance.
- A broad reliability pass across terminals, chats, previews, Git, and settings.
1.0.0
Kaisola 1.0.0 is the first release from the native-only repository. It contains
the Swift macOS app, iPhone Companion, shared Swift protocols, and the sealed
transitional terminal broker; no Electron renderer or React application ships
in this repository.
### Terminal and app experience
### Markdown and previews
### Broker/app parity and continuity
### Faster development and testing
### One-to-two-minute release promotion
### Release validation completed before publication
- Made Claude Code, Codex, and ordinary shell streaming stable while scrolling: output is coalesced on a 16 ms lane, contiguous bytes feed SwiftTerm directly, parsed terminal surfaces survive tab switches, and deliberate user scrolling remains unpinned until the user returns to live output.
- Raised ordinary terminal history to 20,000 rows with a bounded 100,000-row maximum and preserved access to older disk-backed transcript pages.
- Removed redundant semantic-terminal work from plain output. Buffer cursor searches now run only for an active OSC 133/633 input region, and semantic decorations paint once after final scroll positioning.
- Increased the project sidebar's default/ideal width to 200 points and made project headers visually distinct from their nested session rows.
- Added direct, persistent controls to switch projects and sessions between the left sidebar and Chrome-like top bars in either direction.
- Moved local browser cards into the same right-hand preview slot as files, so the active terminal stays mounted and visible.
- Made terminal file citations resolve relative, absolute, and
file:paths, including line/column targets. A citation outside every open project adopts the nearest Git root (or a safe directory fallback), activates it, expands its ancestors, and highlights the exact file in the workspace rail. - Fixed Markdown wrapping in narrow preview panes and added both trackpad pinch and Command-mouse-wheel zoom to rendered documents and direct editing.
- Replaced the plain block source box with a styled native TextKit editor that preserves exact Markdown bytes while rendering headings, emphasis, links, code, and visible list markers during editing.
- Added automatic continuation and clean exit behavior for bullet, task, and ordered lists.
- Rebuilt README table separators as real cell boundaries so rules no longer cross through values.
- Split the workspace rail from the large preview implementation and preserved selected-file highlighting and ancestor expansion.
- Added a deterministic lowercase SHA-256 content digest to every sealed broker generation and carried it through the helper manifest, launch configuration,
broker.json, authenticated hello, status, development, and probe receipts. - Added an authenticated atomic
broker.shutdownForUpdateoperation. It rechecks PID, start time, digest, activity epoch, in-flight work, child tasks, and live PTYs inside the broker before allowing an empty generation to stop. - Automatically replaces a stale empty broker, retries pending upgrades on a 2.5-second heartbeat, and reports precise pending/current generation details. A broker that owns any live terminal is preserved and never presented as current merely because every agent is idle.
- Sealed broker package generation is
1.1.0, implementation version1, protocol2, and security epoch1. The immutable release provenance receipt records its digest alongside the final app build, source commit, signatures, notarization, and artifact hashes. - Added deterministic changed-file-to-test selection with printed plans, focused native selectors, Swift-package routing, Node routing, and a broad fallback for shared or unmapped changes.
- Added path-isolated reusable SwiftPM test caches and fixed no-argument behavior on the macOS system Bash.
- Added cold/warm build timing receipts. The measured native edit build was 35.461 seconds cold, then 3.014 and 2.937 seconds warm.
- The integrated changed-file lane completed in 27.97 seconds with 540 passing checks, one intentionally skipped UI check, and no failures.
- Added a main-commit candidate workflow that builds, tests, Developer ID signs, notarizes, staples, Sparkle-signs, and stores one immutable app candidate plus a machine-readable provenance receipt.
- Replaced tag-time rebuilding with a serialized promotion workflow that checks the tag, exact source commit, version/build, helper digest, Ed25519 signature, notarization, and SHA-256 inventory before publishing those exact bytes.
- Made the permanent Sparkle appcast monotonic, verified remote GitHub asset digests after upload, and added safe first-release/interrupted-promotion recovery. Expensive candidate validation is reported separately from the target one-to-two-minute public promotion.
- Tightened notarization credential preflight after the first protected-main candidate exposed an invalid assumption: Apple individual API keys are now rejected before building, team API-key authentication always requires its issuer UUID, and a complete Apple-ID/app-specific-password pair can serve as the explicit fallback.
- Made unattended visual, memory, and cadence fixtures ignore AppKit crash-state restore prompts without accepting unrelated output, and aligned their broker metadata lookup with the private native fixture layout.
- Node contracts: 127 passed, 0 failed.
- Shared KaisolaCore contracts: 25 passed, 0 failed.
- Full macOS suite: 856 passed, 8 intentionally skipped, 0 failed.
- Universal arm64/x86_64 app preflight and sealed broker/PTTY continuity probe: passed.
- Broker-free 64 MiB/100,000-row terminal resource gate: 434.8 MiB p95 against a 512 MiB ceiling.
- Streaming 120 Hz cadence gate: 99.78% callback coverage, 8.49 ms p95, 19.73 ms maximum interval, and 4.44 ms/s deadline loss while 965 KiB of terminal output advanced during the measured interval.