Every release, newest first. Runner updates itself on macOS and Windows and keeps your settings, chats and missions, so you rarely need to download it again.
Every release, newest first. Runner updates itself on macOS and Windows, so you rarely need to download it again.
If you had typed into a pi session's input box without pressing Return, a crew message could be added to your text and submitted together with it, even when the draft was a single character. Runner now waits until pi's input box is empty, then delivers the message once without sending your text. Pressing Return still sends your prompt as before.
In missions and chats, Antigravity could run task commands and write files in Runner's own hooks folder instead of the folder the session was started in. Each turn now tells Antigravity the session folder, so commands and files go there by default. A folder you add yourself is still available.
In Start a chat and Start mission, ⌘↵ (Ctrl+Enter on Windows) confirms from any control, including an open picker or the mission goal box. ⌘1 and ⌘2 (Ctrl+1 and Ctrl+2) switch between Direct and Role, the form opens with its first picker focused, and the arrow keys move through pickers.
⌘T (Ctrl+Shift+T on Windows) fills a focused empty pane with a terminal, or opens a terminal tab for the active project. ⇧⌘M (Ctrl+Shift+M) opens Start mission. Both can be changed in Settings → Keyboard shortcuts, the + menus show their current bindings, and the command palette now has New chat and New mission.
With suggestions available, Enter opens the model list or selects the highlighted model instead of submitting the form; ⌘↵ (Ctrl+Enter) still submits. This applies to Start a chat and the role and crew pages.
Runner looked for Codex conversations only in ~/.codex, so a chat whose role or environment set CODEX_HOME was never linked to its conversation and started fresh when resumed or forked. Runner now reads CODEX_HOME from the role first, then from its own environment, and falls back to ~/.codex.
When a crew message notice was held for a slot, Runner could deliver it after the agent had already read the message. It now drops a held notice the agent has already read.
Since 0.12.5, pressing Esc or Ctrl+C in Claude Code, Antigravity or Copilot stopped the agent, but Runner kept showing Working until the next turn. Runner now marks the turn Interrupted as soon as you cancel, including when you cancel a running tool in Claude Code.
Copilot approvals clear after you approve and then cancel
A Copilot tool you had approved and then cancelled kept showing its approval request. A request you have not answered yet still stays until you answer it.
New role and New crew now open the role or crew page in a creating state instead of a modal. A new role gets the full setup, including effort, which role creation could not set before, and shows a generated avatar while you type its handle. Create opens the new role or crew; Cancel returns to where you started.
Open role and the full prompt in the chat side panel
⌘W now closes the innermost thing: a focused drawer, then the focused pane of a split, then the tab. A chat tab asks before archiving, a terminal running a command asks before closing, and the next tab in the sidebar becomes active. ⌘W never closes the window; ⇧⌘W does, and the menu lists both. On Windows the keys are Ctrl+Shift+W and Alt+F4, so Ctrl+W deletes a word again in shells, Claude Code and Codex. The archive and close prompts confirm with Enter and cancel with Escape.
Setting up an agent's status tracking now gives up after 10 seconds, and the chat starts without its working and idle status instead of hanging. This was seen only in automated tests on Windows.
Runner 0.12.5 is a feature release for macOS and Windows on top of 0.12.4.
Before you upgrade
This release changes the database: it removes the crew purpose and goal fields. Once 0.12.5 has opened your data, earlier Runner versions can no longer read your crews, and the removed values cannot be recovered. To keep the option of going back, quit Runner and copy runner.db, runner.db-wal and runner.db-shm from ~/Library/Application Support/com.wycstudios.runner (macOS) or %APPDATA%\com.wycstudios.runner (Windows) before upgrading. (#729)
The modal now follows the role and crew pages. Pick a role or an agent and see what the chat will run on: its runtime, model and effort. Change any of them for this chat alone; a changed control shows the role's value and a Reset.
The panel leads with the role's avatar, or the agent's mark for a chat without a role, and shows the runtime, model and effort the chat actually runs with. Unset values read default. The command and working directory now come from the chat itself, so a chat started on another agent or in another folder shows what it really runs.
Neither field was used since the crew page redesign. runner crew create and runner crew update no longer accept --purpose or --goal. A crew's conventions stay in its prompt addendum, and each mission keeps its own goal (runner mission start --goal).
Bug fixes
Start a chat no longer shows a stale default model
Inbox notifications could accumulate in Codex's input box without being submitted, delaying communication between mission members. Runner now gives pasted notifications more time before sending Enter. The fix was verified with native Windows Codex sessions receiving messages both while working and while idle.
Start direct chats and crew missions with agy, choose supported models and effort levels, and resume conversations after relaunch. Runner detects the CLI and lists its skills and MCP servers in Settings. Mission slots use Bypass permissions; direct chats follow Antigravity's own permission settings.
Using /new, /fork, or /resume now updates the saved conversation for the next relaunch. Esc and Ctrl+C no longer leave the activity status stuck on Working.
Select Inherit, Standard, or Fast in role settings, Start Chat, and crew-slot overrides. Explicit chat and slot choices survive Resume, and Fast shows a reminder about higher credit use.
Use --speed inherit|standard|fast with runner role create/update, runner crew add/set, and runner chat start. Inspect the choice in human-readable and JSON output without editing raw Codex arguments.
A role opens as a profile: its pixel avatar, name and handle, Chat now and Edit, then its setup (runtime, model, effort, permissions, command and working directory), the crews that use it, and its activity. The system prompt sits beside it, rendered as markdown and collapsed to its first lines until you choose Show all. Edit works in place on the page, with a Markdown | Preview switch for the prompt.
Each role gets one row showing its runtime, model, effort, crews and last activity. Hover over a row to start a chat. The count shows the total, and while you search it shows how many roles match.
A crew opens the same way. On the left are a picture made from its slots' avatars, its lead, Start mission and Edit, and then its slots. On the right are the team conventions, rendered as markdown, and the crew's missions. Drag a slot to reorder it. Click a slot to compare its setup with its role's and to change its runtime, model and effort overrides in place.
On macOS, use ⌘Z and ⇧⌘Z or Edit → Undo and Redo. On Windows, use Ctrl+Z to undo and Ctrl+Y or Ctrl+Shift+Z to redo. Typing undoes a run at a time. A paste, a cut or a new line is its own step, and so is a phrase typed through an input method.
You can no longer create a role with the shell runtime, or switch one to it, in the app or through runner role. An existing shell role can still be renamed or deleted.
Bug fixes
Clicks and selections in text fields land on the right character
Runner 0.11.5 is a feature release for macOS and Windows on top of 0.11.4. You can now update agent CLIs from Settings → Agents, and splits and new terminals open where your shell is.
Each installed agent shows its version, and when a newer one is available it shows the new version and an Update button. Update runs the CLI's own updater in a terminal inside a dialog, then reports the new version or the exit code. Claude Code, Codex, Copilot and pi can be updated; Claude Code is compared against its release channel, so users on the stable channel are not offered a version claude update will not install. The gear in the usage popover shows a dot while an enabled agent has an update. On macOS, running sessions keep their old version until they relaunch; on Windows, stop the agent's running sessions before updating.
Split Right, Split Down and New terminal on a terminal tab now open in the directory your shell is in, not the one it started in. Runner adds this to zsh and bash on macOS through environment variables only, without editing your startup files, and skips its hook when your configuration already reports the directory. Agent sessions and mission slots are unchanged. Windows support will come later.
A chat, terminal or mission started from Recents, the roles page or the crew editor is no longer filed under the project that owns its folder. Starts from a project's pane, split or drawer still join that project.
Before, deleting the role quietly removed it from every crew that used it and stopped its sessions in running missions. Runner now lists the crews that use the role; remove the role from them first.
Sidebar menus open under their button
The create menus list New chat, New mission, New terminal, open below the button unless they don't fit, and a project row's + and … buttons open their menus under the button and close them when you press it again.
Runner 0.11.4 is a feature release for macOS and Windows on top of 0.11.3, with Claude Code and Codex plan usage on the main window, tidier keyboard shortcuts with stop and resume for the focused session, and a fix for panes that went black.
A gauge icon at the right end of the sidebar's Settings row opens a popover with each agent's 5-hour, weekly and per-model windows, how much of each is used, and when it resets. The icon turns amber when any window reaches 80% and red at 100%; hover it for the headline numbers. Usage refreshes at launch, every 15 minutes, and from the popover's refresh button. The icon only appears when Claude Code or Codex is installed and enabled in Settings → Agents. On macOS, the first read of Claude Code's sign-in asks for Keychain permission.
Stop and resume the focused session from the keyboard
Settings → Keyboard shortcuts shows Go to tab 1–9 as one row, and fixed shortcuts such as New window, Go to tab and Close pane can now be turned off and restored from the same list.
An agent that starts a mission through the runner CLI now keeps watching it, so crew handoffs, questions for you, completion and failures reach it without a separate ask, and an expired watch picks up where it left off instead of replaying the whole mission.
Runner is now MIT-licensed
Releases from 0.6.0 through 0.11.3 were GPL-3.0.
Bug fixes
Panes no longer go black after toggling the sidebar
When an agent's redraw lost its end marker, the pane stayed blank until more output arrived. Runner now applies the held redraw once its short deadline passes.
The sidebar and top-bar menus say Archive, the confirmation reads "Archive tab?", and a split tab being archived shows one Archiving pill instead of one per pane.
Runner 0.11.3 is a bug-fix release for macOS and Windows on top of 0.11.2, with steadier Codex status when hooks are not reporting and reliable pi resume for relocated session directories.
Bug fixes
Codex settles to Idle when a turn ends, even without hooks
Before the first hook report, with hooks disabled, or after the hook bridge fails, Runner falls back to terminal activity, and Codex's animated thread-title spinner kept a finished turn showing Working. Runner now reads Codex's terminal title in that fallback, so the session settles to Idle when the turn ends. Hook-reported status still takes precedence.
A pi agent whose environment sets PI_CODING_AGENT_DIR or PI_CODING_AGENT_SESSION_DIR now resumes its conversation after a relaunch instead of starting fresh and resending the mission goal.
Installed and unavailable agents are grouped separately. The Default pill and Set as default action sit beside the agent name, with redundant detection badges and the separate default summary removed.
A freshly opened or resumed Codex session could stay Working while waiting for your first input, including sessions without a saved session key. Runner now handles that startup gap while preserving Working for automatic mission prompts and actual hook-reported work.
Cancelling immediately after submitting a prompt can produce an interruption before the first prompt hook. Runner now recognizes that sequence and clears Working when Codex confirms the interruption.
Runner 0.11.1 is a fixes release. A session that had just started, been cleared, or come back from a relaunch could sit on Status unavailable while the agent was alive and waiting — that is fixed for all four hook runtimes, along with a Windows PATH refresh, the splitter's drag feedback, and project membership for anything started from a terminal.
In the sidebar a mission's flag now draws in the accent while any of its sessions is live, and goes neutral when they are all stopped — the same rule the Claude Code, Copilot and TRAE marks already follow, so colour means live everywhere in the rail. Terminal rows stay neutral on purpose: an accent on every live row stops meaning anything.
A mission or chat started inside a project's directory belongs to that project
Starting one with the runner CLI from anywhere under a project's folder files it in that project, with no --project flag. The deepest matching project wins, an explicit --project still overrides, and a directory that matches nothing is left unfiled as before. Nothing is auto-created.
Changes
The default crew is "pair coding", not "peer coding"
Every hook runtime treated a session start as "we no longer know what this agent is doing" and cleared its status. /clear in Claude Code left the row unavailable until the next prompt; a Codex slot read unavailable for about twelve seconds after the app relaunched, and indefinitely if the resumed agent printed nothing. A session start now reports Idle, which is what it means — the agent is up and waiting. Fixed in the Claude Code, Codex, GitHub Copilot CLI and pi adapters. The same change removes a startup completion that could steal the first turn's "agent finished" notification.
The splitter's accent bar vanished the moment you dragged it
The bar was a hover style, and dragging clears hover, so the feedback disappeared exactly when it was most useful. Every splitter in the app — sidebar, chat side panel, split gutters, terminal drawer — now uses one style that stays lit through the drag, with a thinner 3px bar in a wider 6px grab area.
Windows: Refresh did not find an agent CLI installed since launch
Settings → Agents searched the PATH the app inherited when it started, which never changes while it runs, so a newly installed agent stayed "not installed" until you restarted Runner. Discovery now reads the user and machine PATH from the registry on every refresh, expanding %VAR% references, and falls back to the last known good environment if the registry cannot be read. macOS was unaffected.
Runner 0.11.0 adds pi as a fifth agent and makes the bundled runner command the way agents, scripts and people drive Runner. Runner's own MCP integration is removed in the same release.
Chats and missions run pi like the other four: the role's model and thinking level, resume after a relaunch, fork, the model list read from pi --list-models, and the folder-trust prompt answered ahead of time so a mission slot never stalls on it. pi reports its status through a Runner-owned extension in the same vocabulary as the others: Working, Using tools, Idle, Interrupted after you stop a turn, Approval needed while an extension asks to confirm, and Response failed. It takes its own row in Settings → Agents with its own mark in the sidebar, pane headers and switcher. pi is bring-your-own-provider, so it is also the way into Runner on a ChatGPT or Copilot subscription. Needs pi 0.84.4 or newer for hook status; older pi falls back to estimated status.
Every workspace and mission operation is a runner <noun> <verb> command: projects, roles, crews and their slots, missions, chats and sessions. Inside a mission the binary crew members already use for msg and signal takes its mission and handle from the environment; outside one, --mission names the mission and the caller acts as you. --json is what agents read, tables and summaries are for people, and the exit status says what happened: 0 success, 1 Runner refused, 2 a usage or reference error, 3 Runner is not running, 5 a sandbox blocked the local connection. runner help agents prints a guide matched to the installed version.
macOS links ~/.local/bin/runner, or a writable /usr/local/bin, when that folder is already on your login PATH; anywhere else it is one click in Settings → General → Command line, through the administrator prompt if the folder needs one. Windows adds the sidecar directory to your user PATH. A runner that Runner did not create is never replaced, and a removal is respected.
Runner installs a runner skill for every agent it detects, into the three roots that cover all five runtimes: ~/.claude/skills/, ~/.agents/skills/ for Codex, GitHub Copilot CLI and pi, and ~/.trae/skills/. The skill names the command and points at runner help agents. One switch in Settings → General controls it; the Skills pane shows the managed folder with a "Managed by Runner" badge.
runner mission feed <id> --follow streams a mission's events as they land, with --types and --from to narrow them and --json for one flushed event per line. mission show, mission answer, msg post --mission, mission stop and mission archive cover the rest of the loop.
Runner no longer registers itself as an MCP server with any agent, and the runner-mcp bridge is no longer shipped. Two ways in at once would be confusing, and pi has no MCP client at all, so the CLI and its skill are the one way in. On its first launch, 0.11.0 removes the runner entry it wrote from Claude Code, Codex, TRAE CLI and GitHub Copilot CLI, once. An entry Runner did not write is left alone, including one that points at another Runner installation, and a config Runner cannot read is left untouched and retried later. If you wrote a runner entry by hand, it will point at a binary that no longer exists and that agent will show it as a failed server until you remove or update it. Agent sessions already running keep their bridge process until they end. Settings → MCP stays as the catalog of your own servers, and the runner name is an ordinary row there now.
A stopped Claude Code or Codex chat in the sidebar kept its colour at low brightness and still read as running; stopped marks are now neutral, so colour means live.
Codex runs its commands in a sandbox that denies the local socket, and the CLI reported that Runner was not running, so an agent asked you to open an app that was already open. A blocked connection is now its own exit status 5 with its own message, and the skill tells the agent to retry outside the sandbox.
Runner 0.10.0 brings hook-based agent status to Windows, shows what an agent is doing right in its status label, renames the Runners menu to Roles, and gets a new icon.
Claude Code, Codex and GitHub Copilot CLI now report their status through lifecycle hooks on Windows as they do on macOS: Working, Idle, Approval needed while a permission dialog is open, Answer needed while the agent asks a question, and a crew delivery is held only while a dialog is unresolved. Claude Code runs its hooks under its own Git Bash, Codex under PowerShell, and Copilot under PowerShell 7 (pwsh); when the shell a hook needs is missing, that session falls back to estimated status.
Pane headers, a one-pane tab and mission role cards show the detail next to the state: Working · Using tools, Working · Compacting context, Idle · Interrupted after you stop a turn, and how long a wait has been open, such as Approval needed · 2m. A failed response gets its own red mark on the sidebar row and its own count in the sidebar rollups until you view the pane. Claude Code's manual /compact now shows Compacting context too.
The reusable agent configurations you add to crews are now called roles, so the Runners entry in the sidebar and its page are now Roles. The app is still called Runner. Saved settings, routes and chats carry over. Breaking for MCP clients: Runner's MCP tools are now role_create, role_get, role_get_by_handle, role_list, role_update and role_delete, and slot_create and slot_update take role_id. Reconnect Runner's MCP server in any agent session that was open before the update.
The app icon, the Windows executable and installer icon, and the in-app brand mark use the new Trail mark: one prompt ahead with two echoes behind it, drawn to stay legible at small sizes.
Sessions without a hook bridge (TRAE CLI, roles that turn off Runner's hooks, or a failed bridge) no longer read the terminal title's spinner; status is estimated from output activity alone.
The mission log's status signal is now session_status
Chats and missions run copilot like the other three: the runner's model and effort, the three permission modes, resume after a relaunch, the folder-trust prompt answered ahead of time so a mission slot never stalls on it, Runner's MCP server registered for it, and its skills listed under Settings → Skills with a toggle that writes the same disabledSkills list copilot plugins disable --skill keeps. On macOS a Copilot session reports its status through hooks in the same vocabulary as Claude Code and Codex: Working, Idle, Approval needed while its permission dialog is open, Answer needed while it asks a question; a crew delivery is held only while a dialog is unresolved. Windows keeps the estimated status for now. It takes the third row in Settings → Agents with its own purple mark in the sidebar, pane headers and switcher.
Folder, shell, layout and mission glyphs are now neutral and dim when nothing is running in them, the same way provider marks already did; the accent is reserved for the state at the tail of a row. Projects show a closed folder when collapsed and an open one when expanded.
Bug fixes
Settings → Skills under Copilot showed Codex's caption
Claude Code, Codex, and TRAE CLI each have their own mark in the sidebar, workspace and pane headers, the quick switcher, and Settings → Archived, so a rail of mixed work is readable without reading titles. Split tabs keep their layout icon, shells keep the terminal glyph, and a chat with nothing running dims its mark rather than changing colour.
They never had: Runner passed --permission-mode auto, which TRAE CLI does not accept, so every Trae chat exited within a fraction of a second of opening.
Chats no longer prompt differently than you configured
A chat now runs on its agent's own permission default instead of the mode stored on its runner, leaving missions the only place a permission posture is set. If you have a runner set to Auto or Bypass, chats started from it will ask for approvals where they previously did not — missions are unchanged.
Codex blinks its "Action Required" prefix in the terminal title once a second; Runner absorbed one phase of the blink and not the other, so the chat's label flipped back and forth while Codex waited on you.
Every chat from a runner is no longer called the same thing
Runner hands a runner's instructions to the agent as its first message, so the agent titled every chat from that runner identically. A runner-backed chat is now labelled @handle until you rename it.
The TRAE CLI runner form stops offering a mode it cannot save
Agent tabs show clean titles supplied by Codex, Claude Code, and other agents, without directory suffixes or spinner symbols. Custom names take priority; chats keep their runtime default until a useful title arrives, and conversation titles survive restart and resume.
The header and sidebar stay in sync as conversation titles update. Unnamed split tabs follow the first pane, so switching pane focus no longer changes the tab name.
Codex and Claude Code model pickers now use the models reported by each CLI, including newly available models. Custom model names remain supported, and TRAE CLI keeps its existing behavior.
Model lists and supported effort levels survive app restarts. Refresh runs in the background when needed after ten minutes, and failed queries silently retain the last good list. Settings → Agents → Refresh retries immediately.
Supported effort options come from the cached model catalog when available. Choosing Default model resets effort to Default and disables its selector; known default model and effort values are shown without pinning them.
Claude Code and Codex report work, completion, and interruption through lifecycle hooks. Quiet tools stay Working, and background-agent activity cannot finish the parent session.
Status appears consistently in chat headers, split panes, the sidebar, and mission views. Claude Code can show Approval needed, Answer needed, and Response failed; clicking an attention indicator focuses the relevant terminal.
Claude command approvals are detected promptly, answered or cancelled questions clear their attention, and Escape/Ctrl+C during ordinary Claude work returns to Idle without a false completion dot. Codex status follows fresh sessions, resumed conversations, and in-process conversation changes.
Support in this release: hook integration is available for Claude Code and Codex on macOS, tested with Claude Code 2.1.270 and Codex 0.154.0. Codex approval/question attention and protection against crew-message delivery into those dialogs are not supported yet. Windows continues to estimate activity from terminal output and titles; Windows status hooks are a follow-up. TRAE CLI retains estimated status and has no Runner hook integration. Codex shows a hook-trust warning because per-hook review is skipped for that launch, including existing user hooks. Add --disable hooks to the runner arguments to use estimated status instead. (#347)
Runner now recognizes the title-spinner pattern observed in Codex and Claude Code, so a completed turn can show Idle even while the terminal keeps animating. Sessions without a recognized title signal continue using byte activity. This is a heuristic improvement; hook-based detection is planned next.
Focus is brightness, not a frame: the accent border is gone and unfocused panes fade to 70 %. Every pane carries one split icon with Split Right ⌘D and Split Down ⇧⌘D, there is no pane limit, only a size floor, and the layout picker is gone.
A grip on every pane's identity line. Drag it onto the left, right, top or bottom edge of another pane and the highlighted half shows where it lands. Sessions keep running through the move.
Split Right and Split Down on a terminal tab open another shell right there, in the same directory, the way Ghostty does. New terminal on a terminal tab does the same.
Settings → Appearance now sets an app palette and a terminal palette for light and for dark, with a live preview of both modes. Terminal palettes are Rosé Pine Dawn, Runner, and Catppuccin Mocha; Monokai is gone.
Each runner card in the mission rail now carries its own Stop and Resume control, and a stopped slot shows a docked card with Resume and Restart. Resume continues the runner's conversation; Restart asks for confirmation, then relaunches the slot fresh with its original brief, so a stuck or drifted runner comes back without restarting the whole mission. The lead is notified over the mission bus when a slot restarts. The mission workspace opens on the runners rail, the sidebar flag turns green as soon as any slot is running, and feed rows for signals and router notices show an avatar and their full payload.
⌘+ and ⌘− and the Settings → General stepper now run from 60% to 200% instead of 80% to 150%, in the same 10% steps.
Bug fixes
Missions in Bypass mode no longer stall on Claude Code's first-run "bypass permissions" consent dialog. Runner acknowledges it in the settings it hands to the sessions it spawns, so nothing is written to your own Claude Code config. (#541)
Splitting a terminal pane with ⌘D, ⇧⌘D, or the layout picker now opens a new terminal in the same project and directory instead of an empty chat pane. (#545)
Renaming a single-pane tab from the sidebar and from the pane header now keep one name; the two surfaces used to drift apart. (#547)
A new Settings → Missions pane holds one setting for how mission slots handle permission prompts: Bypass (the default), Auto, or Runner default. It applies to every slot when a mission starts and again on resume, so a slot never stalls on a prompt nobody is watching. Codex slots under Bypass also leave the sandbox, so git push, gh, and cargo fetches work inside a mission. The mission panel shows the mode a mission started with, and Default crew moved to this pane from General. Direct chats keep their runner's own mode.
Settings → Skills lists the skills each agent can see — Claude Code from ~/.claude/skills, Codex from ~/.agents/skills and ~/.codex/skills — with a global on/off per skill, and opens any skill in a detail view with Preview, Source, Reveal in Finder, and an in-place SKILL.md editor. Turning a skill off writes only the override entry in that agent's config; turning it back on removes it.
Runner now registers itself as an MCP server in every detected, enabled agent by default on macOS, as it already did on Windows — once per agent, so Unregister sticks. The Agents pane shows one card per runtime with its model and effort defaults and a Runner MCP line with Register or Unregister; the separate MCP settings pane is gone.
stray [6c and C characters no longer appear in the Codex and Claude Code composers. The terminal answered each query twice under the Windows Terminal ConPTY shipped in 0.8.4.
Select menus with option descriptions now size to their content, so a description stays on one line and the check mark sits centred.
No scrollbar thumb is drawn for a sub-pixel scroll range at fractional zoom.
Runner.exe, both CLI sidecars, the installer, and the uninstaller are now signed with a Certum code-signing certificate issued to Yicheng Wang, and nightlies are signed with the same certificate. Windows shows that publisher instead of "Unknown publisher". SmartScreen may still show its warning on some PCs until the certificate builds reputation.
Runner now bundles the Windows Terminal ConPTY beside Runner.exe instead of using the console host built into Windows. Codex frames arrive whole instead of split mid-redraw, key echo drops from about 47 ms to 31 ms, and the short output hold Runner used to work around the old host is gone.
Under the new ConPTY, Runner's second reply to the terminal's startup queries reached Codex and Claude Code as typed text, most visibly after resuming a chat. Only the terminal answers those queries now, on both platforms.
Calmer scrollbars, and the terminal scrollbar no longer covers text
App scrollbars keep the resting visibility from 0.8.3 at lower brightness, the terminal scrollbar is quiet at rest, and every terminal reserves a gutter for it so the last column is never hidden under the thumb.
The monospace UI font on macOS is the bundled JetBrains Mono
The mission feed, sidebar, crews, and text fields silently fell back to Helvetica unless JetBrains Mono was installed system-wide. They now use the bundled face, as they already did on Windows.
Nightly channel
For anyone on the nightly builds. Production installs are not affected.
Version labels read Nightly (<sha>). Settings, About, and the update dialog showed vNightly (<sha>). (#519)
Two builds per platform are kept. The nightly release now retains the live build and one rollback target instead of ten; the appcast and the Windows updater always pointed at the newest build anyway.
The macOS titlebar now has the same leading cluster as Windows: sidebar toggle, Previous page, Next page. The arrows walk the window's page history, the same one ⌘[ and ⌘] use, and grey out at either end of it and in Settings. They stay available with the sidebar collapsed and in fullscreen.
Bug fixes
The sidebar scrollbar is readable on the dark theme
The thumb no longer disappears into the Carbon sidebar at rest, brightens while the list is scrolling and for a moment after, and keeps its bright state on hover and drag. The terminal pane's scrollbar behaves the same way.
The pin stays put while ⌘ is held
Holding ⌘ to show the 1–9 tab shortcuts used to hide the pin on pinned chats and missions and shift the row. The pin now stays.
The collapsed sidebar's edge preview no longer opens by accident
Resting the pointer on the left edge still opens the preview, but only after a short pause. Dragging a text selection to the edge and sweeping the pointer across the window on the way to another screen no longer trigger it.
Collapsing the sidebar flooded the log with can't render at a zero size lines because its icons were squashed to nothing during the animation. The transition now clips instead, and every icon in the app is fixed-size.
Nightly channel
For anyone on the nightly builds. Production installs are not affected.
One release for both platforms. The nightly prerelease now carries the macOS DMG with its signed Sparkle appcast and the Windows installer with its signature. nightly-win is retired; a Windows nightly installed before this release needs one manual install from nightly, after which it updates in-app from there. (#502, #504)
The macOS nightly is Runner.app and updates itself. It installs over the production app with only the update feed differing, the same rule Windows already had, and receives updates through Sparkle. A previously installed Runner Nightly.app needs one manual install of the new DMG and can then be deleted. (#505)
Builds are identified by commit. Nightlies show as Nightly (<sha>) and are named Runner-Nightly-<sha>.<stamp>-arm64.dmg and Runner-Setup-nightly.<sha>.<stamp>-x64.exe. The nightly tag follows the built commit and the release notes list the commits since the latest official release. (#507)
See https://github.com/yicheng47/runner/commits/v0.8.2. Windows downloads and verifies updates in the background. Open the update icon or Settings → Updates → Update, then choose Install and restart; settings, chats, and missions are retained. Installers are not yet Authenticode-signed.
On macOS, a reopen event arriving during startup could reach the app before its state was in place and crash Runner from the AppKit callback. Reopen events are now ignored until startup completes; the usual reopen behaviour afterwards is unchanged.
Quit, mission stop, and runner deletion tore down sessions one at a time, so quitting with ten sessions took about 16 seconds. Teardown now runs per session in parallel, and quit logs the session count and elapsed time after each sweep. Sessions are still stamped for resume before teardown; per-session kill behaviour, signals, and grace periods are unchanged.
Runner 0.8.0 is the first stable release for Windows, alongside the existing macOS app. Direct chats, crew missions, and MCP coordination now run natively on Windows.
Windows support
Native Windows x64 app. Windows window controls, fonts, Ctrl shortcuts, file opening, and Explorer reveal, with agent terminals running through ConPTY. No WSL required.
Claude Code and Codex. Native agent launching, Claude conversation resume, bundled CLI helpers, and MCP integration for detected and enabled clients. Process-tree cleanup stops a session's child processes with it.
Per-user installer. Installs without administrator access, adds a Start Menu shortcut, and includes the app and both CLI helpers. Settings, chats, and missions are retained across upgrades.
Update notifications. The Settings update icon and Settings → Updates link to newer stable builds. Download the installer, close Runner, and run it to upgrade.
Also in this release
New chats default to Direct mode on both platforms, with Direct listed first in the mode selector.
Terminal output batching reduces cursor jumps during bursts of agent output, including Windows ConPTY sessions.
A maintenance release: one real bug fix for fresh installs, and the first of four consolidation passes over the codebase with no behavior change.
Fixes
Fresh installs get the runner CLI and the MCP proxy. Since the native rewrite, the app never copied its two bundled helper binaries into app data. Existing machines still had copies from before the cutover and kept working; a new install had neither, so missions could not coordinate (runner was not found inside the crew's terminals) and the Claude Code / Codex / TRAE MCP entry pointed at a binary that did not exist. Both are now installed on every launch and refreshed after an update. (#480)
Internal
Consolidation pass 1. Every comment left over from the Tauri, webview, and xterm.js era is rewritten for the native app or removed; code with no caller outside its own tests is gone, including the unused launch-script renderer and the pointer-first move-to-project operations; and every non-test unwrap/expect on an IO, parse, environment, or user-data path now propagates an error or falls back with a log line instead of panicking. 44 files, +224/−997, no behavior change. Passes 2–4 split the largest surface files. (#478)
The Windows nightly pre-release has a spec again (#437).
Upgrading
Sparkle offers this update to every 0.7.x install. On first launch after the update the app replaces the pre-cutover runner and runner-mcp in ~/Library/Application Support/com.wycstudios.runner/bin/ with the bundled ones; nothing else changes on disk and no configs are rewritten.
The terminal stops being a pane. Every chat tab and every mission gets a terminal drawer that slides up from the bottom, so a shell sits beside the agent instead of taking one of the split's cells.
Added
Terminal drawer in chat tabs. ⌥F12, the new panel-bottom glyph in the header, or the command palette's New terminal opens a drawer under the pane split at the focused chat's working directory. Drag the hairline to size it (120–600 px, remembered per tab), add shells with +, switch them with the chips, hide with the chevron or ⌘W from the drawer. Hiding keeps every shell running; a chip's × closes that one, with the same foreground-process confirmation a terminal pane gets. A shell that exits shows the Shell exited card with Restart in place. The drawer belongs to its tab — switching tabs switches drawers.
Terminal drawer in missions. The same drawer under a mission's Feed and runner tabs, owned by the mission: switch between Feed and a runner's terminal and the shell stays put, at the mission's working directory. Drawer shells are never crew slots — they stay out of the Feed, runner statuses, the sidebar, and attention — and mission Stop / Resume act on slots only. Archiving the mission closes its shells.
Lazy relaunch. Drawer shells are no longer respawned at launch. Their chips come back, and each shell restarts the first time its drawer is actually shown — the active chip on open, the others when clicked. A hidden drawer costs nothing after a relaunch. Terminal-only tabs keep respawning eagerly as before.
The empty pane offers New chat only, as a single ⌘N New chat button that reads your actual binding; ⌘N fills a focused empty pane before it opens a new tab.
Changed
Panel toggles use one glyph family. The sidebar, side panel, mission rail, and drawer toggles now draw Codex's pair — a short tick while the panel is hidden, a full divider while it is open — in the same 24-unit space and stroke as every other icon. The solid-fill glyphs and the drawer's raised pill are gone.
Fork moved beside Stop. The chat header's left cluster acts on the session (icon · title · ⋯ · Stop · Fork); the right cluster only toggles surfaces (split · drawer · side panel).
RECENT is now RECENTS in the sidebar and the command palette.
Upgrading
Sparkle offers this update to every 0.7.x install; older installs on the 0.6.x line pick it up through the normal update path. Existing tabs and missions open with the drawer hidden; nothing about pane terminals in terminal-only tabs changes. ⌥F12 is the default drawer binding and can be rebound in Settings → Keyboard shortcuts.
A small release on the 0.7 line: the terminal font is now JetBrains Mono.
Changed
JetBrains Mono is the terminal font. Runner bundles the Nerd Font Mono build of JetBrains Mono (2.304, Nerd Fonts 3.5.1) and uses it in every terminal pane by default, replacing MesloLGS Nerd Font. It is the face Ghostty and WezTerm ship out of the box, with the full Nerd Font icon set for starship, eza, and Powerlevel10k prompts, and ligatures for ->, !=, and friends. Settings → Terminal → Font family offers JetBrains Mono and Menlo.
Upgrading
Sparkle offers this update to every 0.7.x install; older installs on the 0.6.x line pick it up through the normal update path. Installs that never touched the font setting switch to JetBrains Mono automatically, a saved "Meslo Nerd Font" choice migrates to it, and a saved Menlo choice stays Menlo.
(#458). Paths agents print — crates/runner-app/src/surfaces/panes.rs:1311 in every summary, cargo's --> src/foo.rs:12:5, bare git status paths — are ⌘-clickable in every terminal pane. Runner links a path only when it resolves to a real file against the session's working directory, so and/or and version strings never underline. Settings → General → Open file links in picks Zed, VS Code, or Cursor (through their CLIs, at the cited line and column) or the default app. A missing CLI shows where its installer lives in the editor, and the click falls back to open. OSC 8 file:// links from ls, eza, or rg --hyperlink-format open the same way.
Links tell you they are links
Rest the pointer on a path or URL and it underlines; after half a second a tooltip names the gesture — "⌘-click to open in Zed", "⌘-click to open in browser". Hold ⌘ and the underline turns accent, the pointer becomes a hand, and the tooltip names the target: "Open in Zed · panes.rs:1311". URLs never had a hint before.
Fixes
Link hover now works in Claude Code and Codex. The ⌘-hover underline was wiped on every repaint by a gpui hitbox timing detail, so TUIs that redraw constantly never showed it — clicks worked, the hover did not. It shows everywhere now.
Upgrading
Sparkle offers this update to every 0.7.x install; older installs on the 0.6.x line pick it up through the normal update path. The editor defaults to Default app so the first ⌘-click works without any CLI; pick Zed, VS Code, or Cursor in Settings → General.
A patch on the 0.7.0 line — two session-identity bugs that made resume lie to you, and one crooked icon.
Fixes
/clear no longer orphans a claude-code chat (#459). /clear doesn't clear a conversation — it ends the session and starts a new one with a new id. Runner only knew the id it assigned at spawn, so stopping and resuming a cleared pane silently brought back the pre-clear conversation, and forking it forked the old history. Every claude spawn now carries a SessionStart hook that reports the live session id back to Runner the moment it changes; resume and fork follow the conversation you can actually see. The hook merges with your own Claude hooks — nothing in ~/.claude is touched or overridden.
Chinese text no longer turns to mojibake (#461). Dock-launched apps inherit no locale, so every spawned session ran in the C locale and claude's clipboard reads decoded UTF-8 as Mac Roman — paste 曾思艺, get ÊõæÊÄùËâ∫. Sessions now get LC_CTYPE=UTF-8 when nothing else supplies a locale, the same fallback real terminals set on their PTYs. A locale you set yourself — in your shell or on a runner — still wins.
The fork icon is now the actual lucide git-fork. The shipped glyph was a mis-graft — git-fork's three dots with git-branch's connectors — so the tab-menu and header icons read lopsided. One-line swap for the real trident.
Upgrading
Sparkle offers this update to every 0.7.0 install; older installs on the 0.6.x line pick it up through the normal update path. The /clear fix applies to sessions spawned after the update — resumed sessions respawn, so they pick it up too.
Fork any claude-code or codex chat — from the chat header's ⑂ button, or the sidebar tab's ⋯ → Fork chat. The fork opens in a new tab titled <source> (fork) with the full conversation history; the source chat is never touched, so you can fork one mid-turn while it keeps working.
Fast: forks open at CLI-boot speed on both runtimes. Codex captures the new session key in a ~0.2s headless step; claude forks spawn directly with an assigned session id.
Fork controls are disabled with an explanatory tooltip where forking isn't possible (TRAE chats, or a chat whose session key hasn't landed yet).
Each fork logs a one-line timing breakdown (fork timing:) for observability.
Known behavior
A codex fork briefly shows a "Conversation interrupted" banner at the top — cosmetic, left by the key-capture step.
A claude fork you never type into isn't durable yet (claude only materializes the conversation file on the first message): stop and resume it untouched and it comes back empty. Type anything and it's permanent. Codex forks are durable from birth. Re-fork the source to recover.
Docs
Feature specs now carry their GitHub tracking-issue number (05→73, 58→393, 61→403); docs/ and docs/impls/ gained index READMEs.
A one-fix release: the crew-delete confirm from 0.6.5 could still render wrong on some machines.
Fixes
The delete confirm no longer renders as a blank panel taller than the window. 0.6.5 fixed the dialog on the machines where its buttons hung below the panel, but on others the same dialog came up as an empty column with the title and buttons pushed off-screen — the panel's height came from a layout probe that measured the text one glyph per line, and which machines hit it depended on layout order. The dialog's text now has explicit widths, and a layout test pins it at two zoom levels and three window sizes. Applies to every confirm dialog in the app (crew delete, runner delete, project delete).
Upgrading
Sparkle offers this update to every 0.6.x install on Apple Silicon. 0.5.x installs still bridge automatically: they land on 0.6.0 first, then Sparkle brings them here — the bridge stays in place through the 0.6.x line.
Download
Apple Silicon: Runner-0.6.6-arm64.dmg. macOS is packaged for ARM64 only since 0.6.2; Intel Macs are not supported.
A cleanup release from a day of daily-driving: stopping a session no longer leaks the work it was doing, the Starting pill stops lying, deleting a crew works again, and two small settings changes.
What's new
The Starting chat pill waits for the TUI. It used to drop about a second after spawn while Claude Code was still booting behind a blank pane. It now stays until the first frame is actually on screen — for new chats, resumes, and mission slots alike. Claude's own 1–2 s startup is unchanged; you just no longer stare at an empty pane through it.
Stopping a session cleans up what it was running. Agents now get 6 s to shut down on their own after Runner's SIGHUP — Claude Code uses that window to kill its tool shells. Codex has no shutdown handler at all, so Runner also records the session's live descendants at stop time and terminates any that outlive the agent: a cargo test or sleep 600 left behind by a stopped Codex chat no longer keeps burning CPU. Applies to Stop, closing a pane, Archive, Archive all, and ⌘Q. The log records how long each runtime took to exit and anything Runner had to clean up after it.
A runner chat's default name is its handle. Start a chat → Runner prefills @coder, not "Chat with @coder". Direct chats still default to the agent's name.
Fixes
Deleting a crew works again, with one confirm. The confirm dialog was sized for a one-line body while its text wrapped to three, so the Cancel / Delete crew buttons were painted below the panel — and a click there closed the dialog instead of deleting. Dialogs now grow with their text (the runner-delete dialog had the same flaw), and the crew delete asks once, naming the slots, archived missions, and session history it takes with it.
Removed
The App font picker. Only Inter ships with the app; Geist and Roboto resolved to whatever the machine had — on most Macs, silently, the system font. Settings → Appearance no longer offers the choice and the UI is pinned to Inter. A saved appFontFamily in an existing settings file is ignored on load; every other preference is kept.
Upgrading
Sparkle offers this update to every 0.6.x install on Apple Silicon. 0.5.x installs still bridge automatically: they land on 0.6.0 first, then Sparkle brings them here — the bridge stays in place through the 0.6.x line.
Download
Apple Silicon: Runner-0.6.5-arm64.dmg. macOS is packaged for ARM64 only since 0.6.2; Intel Macs are not supported.
The headline is terminals: a pane can now hold a real shell instead of a chat, so git diff --stat or a long pnpm dev runs beside the agent editing the code it serves — without leaving the app or burning a chat on it.
What's new
A pane can hold a terminal. Your $SHELL in a real PTY, in any pane a split can build. Start one from New terminal — in the Recent and project + menus, which open it in a new single-pane tab, in an empty pane's placeholder, or from the command palette. There is no modal: a terminal has nothing to configure that cd does not cover. It opens in the cwd of the focused sibling session, else the active project's directory, else your default working directory, else $HOME, so it lands where the agent beside it is working.
Split shortcuts.⌘D adds a side-by-side pane and ⇧⌘D a stacked one, growing a tab from one pane to two to at most three. The new pane stays empty so you choose New chat or New terminal in place. The layout button's tooltip advertises both.
A slimmer pane identity line. The pane header drops from 34 px to a 26 px line — icon, name, status dot, ⋯, with × alone at the far right. ⋯ holds Stop (⌘.), Rename…, and Archive.
Rename a pane.⋯ → Rename…, or a double-click on the name, edits it inline. Enter commits, Escape reverts, and an emptied value restores the default. The name survives closing and reopening the pane, moving it to another pane, and relaunching the app.
⌘. stops the session in the focused pane — chat or terminal.
Terminals come back live after a relaunch. A fresh shell at the pane's recorded cwd: no command replay, no scrollback. Chats still follow your resume-on-launch setting. If the recorded directory no longer exists, the shell opens at the nearest existing parent and says so in the pane rather than silently landing in $HOME.
Shell exited card. A shell that exits shows its exit code, shell, and cwd with Restart and Close — the terminal twin of Chat paused.
Terminals never nag for attention. No status dot, and they are left out of working / unread / needs-you: a streaming pnpm dev is not "working", and its going quiet is not "done".
Closing a terminal is permanent
A chat archives and can be restored from Settings → Archived; a terminal cannot. So Runner asks before it takes one away. Closing a single terminal confirms only when a foreground process is still running — a shell sitting at its prompt closes silently. Archive all on a tab that mixes chats and terminals always confirms, and says how many of each it will touch.
Upgrading
Sparkle offers this update to every 0.6.x install on Apple Silicon. 0.5.x installs still bridge automatically: they land on 0.6.0 first, then Sparkle brings them here — the bridge stays in place through the 0.6.x line.
Download
Apple Silicon: Runner-0.6.4-arm64.dmg. macOS is packaged for ARM64 only since 0.6.2; Intel Macs are not supported.
A terminal theme swap and the fixes that came out of smoke-testing it, plus two changes that landed after 0.6.2 was tagged.
What's new
Monokai terminal theme. Settings → Appearance → Terminal theme now offers Monokai — the Monokai Pro palette, #2D2A2E canvas, pink #FF6188 swatch — alongside Runner and Catppuccin Mocha. Switching repaints open panes live, and the choice persists across relaunch.
Brighter selection in the Runner theme. The Runner terminal's text-selection highlight is now #3B3E49, so selected text reads clearly in panes and in the mission feed.
Removed
Solarized Dark is gone. If your saved settings still say solarized-dark, the app falls back to Runner on launch and keeps every other preference — pick Monokai or Catppuccin Mocha from the dropdown if you want a different palette. More generally, a saved terminal-theme label the app no longer recognizes no longer invalidates the whole settings file.
Fixes
Popup clicks no longer fall through. Choosing an Agent in Start Chat → Direct used to open the Model dropdown underneath the menu; popup panels now cover the controls beneath them.
Single-line dropdown options are vertically centered (swatch, label, checkmark); options with a description keep their top-aligned two-line layout.
A runner row the app cannot read no longer breaks the runner list — it is skipped instead of failing the whole query.
Upgrading
Sparkle offers this update to every 0.6.x install. 0.5.x installs still bridge automatically: they land on 0.6.0 first, then Sparkle brings them here — the bridge stays in place through the 0.6.x line.
If you installed the first 0.6.3 build (published and withdrawn on 2026-08-24), this one is offered as an update too: it is the same release with the Runner terminal canvas back at its original #15161B after the lifted canvas made the terminal and the chat's side panel read as one surface.
Download
Apple Silicon: Runner-0.6.3-arm64.dmg (macOS is packaged for ARM64 only since 0.6.2).
The first update on the native line — one new feature and the fixes from a day of daily-driving 0.6.0.
What's new
⌘1–9 jump to tabs. Hold ⌘ on its own for a beat and every row in the sidebar shows its number; ⌘1…⌘9 switch to that row the way a click would — chats and missions alike, counted top to bottom across PINNED, expanded projects, and RECENT. Works from a terminal, the composer, Settings, and with the sidebar collapsed. The nine shortcuts are rebindable in Settings → Keyboard.
Fixes
Option, Shift, and Control with arrow keys now reach the agent the way a real terminal sends them. Option+→ used to type [C into Codex's composer (and Claude Code mis-read the same bytes); ⌥←/⌥→ word-jump, ⇧arrows select, and ⌃arrows work. ⇧Tab now sends a real backtab, so Claude Code's permission-mode cycle responds to it.
⌘W closes the window (or the focused pane in a split); ⌘M minimizes. Both were wired but never fired — the handler ran while the window was already being updated and the error was swallowed.
Sidebar drag and drop is reliable again: the accent drop line no longer survives a release, drops that land between rows or below the list commit to the highlighted target, and dragging a row out of a project back to RECENT works again.
Upgrading
Sparkle offers this update to every 0.6.0 install. 0.5.x installs still bridge automatically: they land on 0.6.0 first, then Sparkle brings them here — the bridge stays in place through the 0.6.x line.
Download
Apple Silicon and Intel: Runner-0.6.1-universal.dmg
Runner 0.6.0 is a rewrite of the app, not a release of the old one. The Tauri shell, the WebView, React, and xterm.js are gone; what ships is one native Rust binary — the UI rendered by GPUI, the terminal model and the renderer sharing a single alacritty_terminal grid. Everything behind the PTY (sessions, router, event log, SQLite, the bundled runner CLI and MCP server) is the same core 0.5.x ran on.
Why
0.5.x kept two terminal parsers in the loop — Rust behind the PTY, JavaScript in front of it — and every mismatch between them became a bug: garbled glyphs after the WebGL atlas desynced, wrong widths on CJK and emoji, panes that repainted blank, hidden panes starved of a GPU context. One parser and one grid removes that class of bug by construction rather than patch by patch (#307).
What's new
Native everything. GPUI rendering, Metal-backed; terminals are the real grid, not a serialized mirror. Resize is smooth and tab switches no longer blank the pane.
Universal build. One Runner-0.6.0-universal.dmg for Apple Silicon and Intel; macOS 12 or later.
Sparkle updates. The standard macOS update sheet, checked silently in the background; a new version only lights the sidebar hint until you click it.
Sidebar entry points.New chat is the first row of WORKSPACE (⌘N); every project row has a + for a chat or a mission inside that project; tab and mission menus are down to Pin / Rename / Archive (⇧⌘N + a sidebar pick still opens a session in another window; drag to RECENT still moves a row out of a project).
Real draft detection. The router holds a message only when the agent's composer actually has text in it, read off the grid — the "Inbox waiting" pill no longer fires on an empty prompt, and Submit draft always releases it.
Mission feed renders Markdown with proper weights and rhythm; text is selectable and copyable.
Archiving a mission returns you to the tab you came from instead of stranding you on the archived feed.
Keyboard shortcuts are rebindable (Settings → Keyboard), with a command palette; Diagnostics reveals the real log file; About links open natively.
Upgrading from 0.5.x
Nothing to migrate: 0.6.0 opens the same data directory and the same runner.db — runners, crews, missions, chats, and event logs are all there.
0.5.x installs update themselves: the old updater fetches this release once, relaunches into the native app, and Sparkle takes it from there. That bridge stays available through the 0.6.x line and is removed at 0.7.0 — after that, install the DMG by hand.
The bundled runner CLI and runner-mcp server are refreshed from the new bundle on launch; your MCP client configs keep working unchanged.
What's next
Post-GA work is tracked in #432: hook-based session status (working / waiting / done from the agents' own signals), terminal render and ingestion performance, ⌘1–9 tab switching, and the backend hygiene remainder.
Download
Apple Silicon and Intel: Runner-0.6.0-universal.dmg
Per-slot model and effort overrides — pick a model and reasoning effort per crew slot, right in the slot edit drawer. Overrides apply on the next spawn and survive respawn/resume. (#402)
Bug Fixes
Codex missions no longer stall on the trust dialog — Runner now pre-seeds the project's trust entry in ~/.codex/config.toml before spawning codex, so the "Do you trust this folder?" prompt never appears and the mission's first turn delivers immediately. Existing trust decisions (including explicit untrusted) are never overwritten, and linked git worktrees resolve to the main repo root. (#404)
Mission workspaces opened right after app launch no longer stick on a stale "stopped" state while auto-resume brings the slots back — session changes now refresh the workspace, Resume is race-proof against already-running sessions, and action errors are dismissible instead of a permanent raw banner (#399).
The macOS traffic lights stay in their custom titlebar position through window resizes, including live drags — the frames are re-applied from the AppKit side instead of resetting to the stock layout until the next zoom change (#395).
Chat-style mission feed (#394) — the feed now reads like a Discord/Slack channel: every runner gets a deterministic pixel-identicon avatar and identity color, consecutive messages from the same author group under one header, the mission start renders as a divider and your kickoff goal as a regular message with a GOAL chip, system signals collapse into one-line rows with expandable payloads, and the needs-your-input card sits under the asking runner's avatar. The runner rail picks up the same identity: identicon avatars with a presence dot for busy / idle / stopped.
Bug Fixes
Mission runner status no longer gets permanently stuck on busy after a router nudge — the synthetic wake-busy now updates the status stores atomically, and status events retry instead of dropping under log contention, so the reconciliation safety net can't be silently disabled (#385, #396).
Markdown list markers in feed messages stay inside the message block, and message typography breathes more (#392).
Model and effort pickers, everywhere you pick an agent. The Model combobox now seeds codex's current catalog (GPT-5.6 Sol/Terra/Luna, GPT-5.5 and friends, with per-model descriptions) and adds the fable alias for Claude Code; the effort menu gains codex's max and ultra tiers. Direct chats can set model and thinking effort at start, and replacing a runner's agent in Start Chat now exposes the same controls instead of forcing the replacement engine's defaults. Free text still works for anything unlisted, and blank still means the agent's own default. (#386)
Chats remember their model across restarts. Direct and agent-overridden chats persist their model/effort choice and resume with it — previously a chat started as e.g. Sol + ultra silently came back on CLI defaults.
Agents are now opt-in beyond the daily drivers. Only Codex and Claude Code ship enabled; Qoder and TRAE stay hidden from pickers until switched on in Settings → Agents. Pickers also self-correct while executable discovery is still probing, instead of briefly claiming no agents exist.
Fixes
Opt+C no longer yanks the terminal to the last row. On keyboards with swapped Cmd/Opt (external boards in the wrong Mac/Win mode), an intended copy arrived as opt+c: xterm typed a stray ç into the agent and snapped the viewport to the bottom. The chord is now swallowed in terminal panes. (#387)
A runaway agent message can no longer crash the app.runner msg post rejects payloads over 32KB with an error telling the agent to write large content to a file and reference the path — after a 353KB channel message (an entire embedded model catalog) took down a mission. (#389)
The mission feed is now a channel you can talk in. A composer sits under the feed: type and hit Enter to broadcast to every runner in the crew, or start with @ to open a roster picker and address one runner directly. Posts land in the timeline as ordinary channel messages and reach each runner's inbox at its next turn boundary — the same path runners already use to talk to each other, rather than a separate "reply to the human" mechanism. (#378)
Adding a project opens a proper dialog. The sidebar's + used to jump straight into a directory picker and create the project silently under the folder's name. It now opens a modal like starting a chat or a mission: the directory is prefilled from your configured default working directory, the name defaults to the folder's name and follows it as you browse until you edit the name yourself. (#383)
New installs ship with a Peer coding crew. A two-runner coder/reviewer crew, with prompts and team conventions filled in, is seeded on first launch so a fresh install has a working crew to start a mission with.
Fixes
Inbox delivery no longer interrupts you mid-keystroke. When a message is waiting and you have unsent text typed into a runner's input, delivery holds until you send it or press Ctrl-C. Terminal escape traffic — notably the color-query replies agent CLIs emit at startup — no longer counts as typing, which previously wedged the gate as phantom input and stalled delivery indefinitely. (#359)
Nudges sent while a mission is spawning are no longer dropped. Fresh mission sessions are registered before their PTYs come up, so deliveries wait in the outbox and land once the session is live.
A runner's own broadcast no longer lands in its own inbox.runner msg read now excludes messages the caller sent. runner msg post --to human also explains the channel instead of pointing at the terminal: broadcast by omitting --to.
Runners and Crews lists now paginate in the backend. Paging and search moved into SQL, so a search matches across every page instead of only the rows currently on screen. The pager stays pinned at the bottom behind a divider aligned with the sidebar footer, and the list scrolls with a visible scrollbar — a card cut at the fold now reads as a scrollable region instead of content hidden behind the pagination block. The esc keycap hint is gone from the search field (Esc still clears). (#377)
No more spellcheck squiggles or autocapitalized input.spellcheck, autocorrect, and autocapitalize are off app-wide — noticeable when typing handles, commands, and working directories.
Terminal rendering no longer corrupts during everyday navigation. Two follow-ups to v0.4.8's resize-storm work: the viewport clear now travels in-band with the settled repaint instead of firing per push, so switching to Settings and back while an agent streams no longer smears frames across the pane; and background mounts are fully frozen (no push, no refit), so leaving a streaming claude-code tab and coming back no longer stacks duplicated frames into the buffer.
Restored missions can be archived again. Archiving a mission restored from Settings → Archived previously failed with "mission is not running"; archive now handles already-stopped missions on the visibility axis alone. (#376)
Paste a copied file into a terminal — copying a file in Finder or GoLand and pressing ⌘V over a pane now inserts its absolute path, shell-quoted when needed; multiple files paste space-separated. Text and image pastes — including Finder-copied image files — behave exactly as before. (#368)
Improvements
Settings → Archived: the row action is now Restore (was "Unarchive").
Bug Fixes
Terminal scrollback survives resize storms: dragging the sidebar, a split gutter, or the window edge across a live pane now coalesces into one settled resize instead of purging the replay ring per frame, and a drag that ends at its starting width costs no purge at all. Launch auto-resume no longer loses the transcript it just restored. (#373)
Restoring an archived mission now actually returns it to the sidebar under its project.
Runner 0.4.7 stops backend-started missions from destroying their own scrollback, and gives the packaged app the diagnostics to finally pin the launch-resume width bug.
Bug Fixes
Missions started from MCP keep their scrollback. A mission started by an agent through the MCP mission_start tool forked every slot terminal at 80×24 — the first time you opened a slot tab, the real-width resize purged the session's entire output ring, and minutes of the agent's transcript vanished. The app now records the mission pane's real grid whenever the frontend measures it and uses that as the fork size for backend-started missions, so the first tab visit is a no-op resize and the history stays. Missions started from the UI were never affected.
The launch width estimate can no longer lie. When the shell's content area couldn't be measured, the estimator fell back to the full window width — sidebar included — and could also read the wrong element entirely while Settings was open. A failed measurement now abstains, letting the persisted per-session geometry take over instead of a confidently wrong guess.
Improvements
Launch-resume is now observable in packaged builds. Every session fork logs its width and where that width came from (caller, persisted geometry, mission hint, or default), every width-change ring purge logs old→new columns, and the launch dims pipeline — settle outcome, chosen source, measurement inputs, estimate, and the pane's first real fit — writes a [launch-dims] trace into the rotating log file under ~/Library/Logs. If a restored terminal ever comes back wrong again, the log now says why.
Download
Apple Silicon:Runner_0.4.7_aarch64.dmg
Intel:Runner_0.4.7_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.6 fixes two ways a terminal could come back looking wrong — after waking your Mac, and after relaunching the app.
Bug Fixes
Glyphs no longer render jammed together after your Mac wakes. Characters were drawn at the wrong advance width, so $ pnpm tauri dev came out closer to $pnpmtauridev — the text was correct, the spacing wasn't. The renderer caches each glyph as a rasterized image, and nothing on the wake path told it that cache had gone stale; the only thing that ever cleared it was changing your terminal font. Runner now clears it on the events that actually invalidate it: system wake, and moving the window to a display with a different backing scale. Wake is detected natively rather than inferred from window focus, so ordinary app-switching doesn't pay for it (#360).
Sessions restored at launch come back at the right width. With auto-resume enabled, a restored session forked its terminal at whatever size it had when you last quit — so if you resized the window, moved to another display, or the session returned into a split, its resume banner and first repaint were hard-wrapped at the old width. For Claude Code and Qoder, which keep their scrollback across a resume, those mis-wrapped lines were permanent. Runner now works out the width the session will actually be displayed at before starting it, and waits for the window to finish restoring first. A session with no remembered size no longer falls back to 80 columns when the real geometry is knowable (#363).
Download
Apple Silicon:Runner_0.4.6_aarch64.dmg
Intel:Runner_0.4.6_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.5 adds a fourth agent runtime and lets crew slots pin their own model.
What's New
TRAE CLI is now a supported runtime. Runner ships a first-class adapter for traecli alongside Claude Code, Codex, and Qoder — direct chats, crew slots, conversation resume, model and effort flags, permission modes, and one-click MCP registration into ~/.trae/traecli.toml. TRAE CLI is an internal-edition binary, so it isn't publicly installable; the runtime simply appears once traecli is on your PATH, and Settings → Agents shows its detected path with the usual override field. The README now carries a Supported agent runtimes table covering all four adapters and what each one supports.
Crew slots can override the model, not just the runtime. A slot could already run a different engine than its runner template; now it can also pin a different model. The slot summary shows the effective engine and model together — codex (model gpt-5-codex) — and setting it on the slot never rewrites the underlying runner, so one template can serve several crews at different model tiers.
Improvements
Switching a runner's runtime no longer leaves a stale model behind. Changing the runtime on a runner used to keep whatever model name was already in the field, which meant a value from the previous engine's catalog could be handed to a CLI that doesn't recognize it. The model now resets when the runtime changes, in both the create form and the edit drawer.
Download
Apple Silicon:Runner_0.4.5_aarch64.dmg
Intel:Runner_0.4.5_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.4 fixes the terminal width of restored sessions and makes auto-resume something you opt into.
Changed
Auto-resume on launch is now opt-in. Runner no longer resumes your agents automatically when it starts — including if you had been relying on the previous default. Agents spawning unprompted at launch should be a choice, not a surprise. Turn it back on in Settings → General → Resume running agents on launch; sessions are still marked at quit either way, so enabling it takes effect from your next launch.
Bug Fixes
Restored sessions come back at the right width. A session brought back by auto-resume could fork its terminal at a stale width, leaving its resume banner and first repaint hard-wrapped — and for Claude Code, which keeps its scrollback across a resume, those mis-wrapped lines were permanent. Two things caused it: a terminal that measured itself while its session was still stopped had that measurement silently discarded, and the pane then believed it had already reported the size, so it never sent it again. Panes now record their geometry whether or not the process is running, and re-assert it the moment a session goes live. This also repairs any other case where a resize was dropped in flight — a session exiting mid-resize, or a window handing off a shared session.
Download
Apple Silicon:Runner_0.4.4_aarch64.dmg
Intel:Runner_0.4.4_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.3 adds a third agent runtime and tidies where runtime settings live.
What's New
Qoder CLI is a first-class runtime. Pick qoder anywhere you'd pick Claude Code or Codex — direct chats, runner templates, crew slot overrides — and it behaves like a full citizen rather than a bare process: the first turn and mission preamble are delivered at spawn, stopping and resuming reopens the same conversation from ~/.qoder/projects, and a session file that's gone falls back to a fresh spawn instead of an error loop. Settings → Agents discovers the qodercli binary on your PATH and takes an override like the other runtimes, and Qoder can be registered as an MCP client from Settings → MCP (#341).
Improvements
Runtime settings live in one place. The Chat settings pane held a single control — the default runtime for new direct chats — while everything else about runtimes had moved to Settings → Agents in 0.4.2. That control now sits with the rest of them, and the Chat pane is gone. Your existing selection carries over untouched.
Download
Apple Silicon:Runner_0.4.3_aarch64.dmg
Intel:Runner_0.4.3_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.2 makes the app pick up where you left off — agents come back on launch, and the CLIs behind them are now something you can see and fix from Settings.
What's New
Agents settings pane. Settings → Agents shows exactly which claude and codex binary Runner will spawn, resolved against your real login-shell PATH, with a per-runtime override when discovery can't reproduce your environment. The shell probe no longer blocks startup or forgets what it found: it runs in the background, keeps its last known good result across launches, and can be re-run on demand after you install or upgrade a CLI. Version-manager installs (mise, asdf, volta, fnm, nvm, pnpm, Bun) are covered by the fallback path. A runtime that can't be resolved now fails before the terminal opens, naming the runtime, instead of printing command not found into a dead pane (#279).
Resume running agents on launch. Quitting used to kill every live agent and leave you to restart each one by hand. Runner now marks the sessions it stops at quit — direct chats and mission slots alike — and resumes them on next open, staggered, conversation intact. Only graceful quits are marked, so a crash never auto-respawns agents into whatever caused it, and a session whose resume key is gone stays stopped with its normal Resume button rather than starting a fresh conversation you didn't ask for. Toggle it off in Settings → General (#320).
Improvements
Missions started over MCP now infer their project from the working directory when one isn't passed, so agent-started missions nest in the sidebar like the ones you start yourself (#350).
Bug Fixes
Switching tabs no longer disturbs the terminal. Returning to a pane fired a forced resize even when nothing about the geometry had changed — two SIGWINCHes, a full agent repaint, and for Claude Code a scrollback purge on every single switch. Activation now pushes size only when the size actually changed; the forced repaint survives only where a pane's canvas genuinely went stale (#352).
Sidebar project collapse survives restart. Collapsed projects came back expanded on every launch — the only sidebar state that didn't persist (#354).
Terminals now fit against the renderer that will paint them, closing a window where a freshly activated pane could measure against stale geometry.
Resumes interrupted mid-flight are preserved rather than dropped, so a launch that gets cut short doesn't lose the sessions it hadn't reached yet.
Terminal frame and scrollbar rendering refined — no more stray strip along the right edge of a pane.
Download
Apple Silicon:Runner_0.4.2_aarch64.dmg
Intel:Runner_0.4.2_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.1 is a stability release that hardens session lifecycle and terminal rendering — the two rough edges left after the 0.4.0 header work.
Bug Fixes
Paused missions no longer strand live agents. When one slot in a running mission exited on its own, its sibling sessions kept running indefinitely behind the paused card — an invisible agent process still holding the repo, with the sidebar correctly showing the project as active while the workspace looked stopped. Runner now reaps the surviving siblings when a slot exit is observed, so "paused" always means zero live processes (#346).
In-place resume renders cleanly. Resuming a stopped session without leaving the tab used to stream the new process into the dead terminal grid: stale mode state (bracketed paste, mouse reporting), a dirty seam where the resume banner collided with the old cursor, and — for codex — a stacked frame that silently vanished on the next tab switch. Resume now sanitizes the grid per-runtime, and sessions fork at their last-known width instead of defaulting to 80 columns, fixing the mis-wrapped scrollback after resume (#349).
Download
Apple Silicon:Runner_0.4.1_aarch64.dmg
Intel:Runner_0.4.1_x64.dmg
Existing installs update in place via the built-in updater.
Runner 0.4.0 marks the point where the workspace chrome caught up with the interaction model the 0.3 line converged on: the feed tells you what's happening, the pane is where you talk, and the header now gets out of the way.
Features
Codex-style workspace header (#343): chats and missions share one slim 44px single-line header — leading icon (terminal / flag) + truncated title + inline … overflow that absorbs the old kebab actions and subtitle metadata. Stop is demoted from the labeled red chip to a quiet muted-red icon beside the title (Resume takes the same slot when applicable). The right edge is pure surface toggles: split view for chats, and the runners-rail toggle always rightmost. The sidebar strip now owns the window chrome — traffic lights plus the sidebar-collapse button beside them, with a fullscreen-aware gutter so the button sits flush when macOS hides the lights.
Read-mostly mission feed (#330): the feed now answers what is happening — talk to a runner by typing into its pane. The mission composer and the --to human reply protocol are gone, so worker prompts spend their entire budget on coordination verbs; ask_human cards remain the one structured escalation path, and historical logs still render every legacy event.
Blocked inbox delivery indicator (#336): when your half-typed draft in a runner's pane is holding back an inbox wake nudge, the pane now shows an amber "Inbox waiting — typing detected, delivery paused" pill with a Clear input (↵) button (shown while the runner is idle). One Enter through the normal input path releases the parked nudge — no new delivery machinery, every safety check intact.
Fixes
Session kills now verify and reap (#340): stopping a mission previously sent a single SIGHUP that claude-code ignores, silently leaking a live process per stop while the UI reported everything stopped. Kills now escalate (SIGHUP → SIGKILL), confirm death, and reap the child; kill sweeps continue past individual failures; and a startup sweep reaps historical orphans after verifying process identity.
Mission messages can no longer be silently missed — each running mission now has a reconciliation clock: every 30 seconds it checks whether any idle runner has unread inbox mail whose wake-up nudge got lost (session died before delivery, respawn raced a parked notification, and similar), and re-nudges through the normal delivery path. Agents never poll and empty checks cost nothing; once the runner reads its inbox, the clock goes quiet. Together with v0.3.21's deferred nudges, mission wake delivery is now at-least-once (#332)
Parked nudges now wait 500ms after you submit or clear your input before delivering, instead of landing the instant you hit Enter — and if you start typing again inside that window, delivery re-parks (#332)
Periodic update checks — Runner now re-checks for updates every few hours while running, and on window focus after sleep, so long-running sessions learn about releases without a restart. Updates get their own Settings pane (moved out of About), and "Check for Updates…" lives in the app menu where Mac apps keep it. Restart remains manual — the app never relaunches itself under running agents (#333)
Bug Fixes
Mission nudges no longer corrupt your typing — inbox nudges and message relays delivered to a pane where you're mid-draft are parked until you submit or clear your input, then delivered (coalesced) instead of appending to your half-typed text and submitting the mangled result (#328)
With the auto-download toggle off, Runner still checks for updates and tells you one is available — previously toggle-off meant it never looked at all (#333)
The sidebar workspace divider is visible again, separating workspace entries from content (#331)
PINNED section — pinned chats and missions now live in one section at the top of the sidebar instead of sorting to the top of their own groups. Drag pinned rows to reorder them; unpinning returns a row to its project (or the root list). The section hides itself when nothing is pinned (#317)
Reorder projects by dragging — project rows can be dragged up and down within the sidebar, so active projects don't stay buried under dormant ones (#324)
Improvements
Folders retired — projects are now the only way to group chats and missions. Folders had become projects-without-a-directory, and carrying both meant two creation flows and two deletion behaviors. Existing folders are dissolved on upgrade: their contents move up to the top level, in place, and can be re-filed into projects (#321)
Bug Fixes
Sidebar section headers truncate correctly in a narrow sidebar, with the collapse chevron staying beside the label (#322)
The sidebar is now one unified navigation tree (#318): MISSION and CHAT sections are merged, chats and missions nest under projects side by side, and manual ordering works everywhere — inside folders, inside projects, and in the recent list — with pinned rows sorting first. Backed by a new single nodes model with an automatic, order-preserving database migration.
Drag and drop is unified across all sidebar rows: move tabs and missions between folders, projects, and the recent list with the same interaction; dragging across a project boundary rebinds project membership (#318)
Bug Fixes
The PROJECT sidebar section no longer silently crops when projects outgrow its height cap — the whole nav column scrolls as a single surface (#315)
Resuming an old claude-code chat no longer shows a black terminal until you manually resize the window — a blank grid now forces a repaint nudge on activation (#312, #314)
Opening Settings no longer leaves chat terminals rendered at the wrong size when you return (#314)
Mission session respawns start at the pane's real size instead of the 80×24 default (#314)
Stopped chats no longer carry a stale green unread dot across an app restart — unread completions from a prior run are cleared at launch
Slimmer sidebar right-click menu. The row context menu is now a fixed set — Pin, Rename, Open in New Window, Archive. The per-folder and per-project "Move to <name>" rows are gone: folder moves live on drag and drop, and project membership is decided when a chat or mission is created, since a session's working directory is fixed at spawn. (#311)
Bug Fixes
Returning to a chat no longer paints the terminal at half width. Chat and mission surfaces now stay mounted across route changes — visiting Runners, Crews, or a mission feed and coming back is an instant reveal of the live terminal instead of a cold remount that could mis-size the PTY and garble history. (#309)
Multi-window behavior stays correct across navigation. A hidden (kept-alive) surface no longer erases the visible surface's window-ownership claim, captures mission warnings as chat banners, or leaves the mission feed unanchored after events arrive while away. (#309)
Runtime override per crew slot and direct chat — runner.runtime is now a default rather than a lock: override the engine on any crew slot or direct chat, so one persona can run on Claude Code, Codex, or any configured runtime without duplicating runner templates. Runtime-specific flags reset to registry defaults on override. (#305)
Bug Fixes
Claude Code scrollback no longer disappears on tab return. The backend replay buffer survives the tab-return resize handshake, so switching tabs or routes and coming back keeps your conversation history scrollable instead of showing only the latest frame. (#308)
Fixed terminal panes returning from a hidden tab with stale rendering that only corrected after a manual window resize — the renderer now attaches once the pane has settled geometry. (#308)
Fixed stale or garbled terminal canvases when switching back to older chat tabs: hidden panes no longer hold WebGL contexts, so long chat-heavy sessions stay below WKWebView's context limit. Terminals also recover their GPU renderer after a genuine context loss instead of degrading permanently. (#300)
Typing in an idle mission runner's terminal no longer flips the mission to "working" — local keystroke echo is now suppressed from mission status, matching chat behavior, while submitted prompts still light the spinner immediately. (#302)
Keyboard shortcut rebinding — Settings → Keyboard shortcuts is now editable. Click a shortcut (or its pencil) to record a new combo, delete to unbind, and restore a single shortcut or reset everything back to defaults. Conflicting combos are caught before they commit, and custom bindings apply everywhere — including while a terminal has focus. (#273)
Bug Fixes
Unread dots no longer appear on chat tabs that were already viewed and received no meaningful new activity. (#296)
Projects — organize your chats and missions by working directory. A new PROJECTS section in the sidebar lets you create a project bound to a folder — "Start from scratch" (new directory) or "Use an existing folder" — and chats and missions started inside a project inherit its working directory and nest under it. Move work in and out of projects, reorder, and collapse them. (#292)
Project-aware MCP tools — agents can now discover projects (project_list / project_get) and start missions and direct chats under a project over MCP, defaulting the working directory from the project (with an explicit cwd still overriding). (#294)
Chat tabs now show a trailing spinner while any pane is working and an unread dot when a background tab settles.
Completion attention persists across navigation and restarts, synchronizes across Runner windows, and rolls hidden activity up to collapsed folders and the CHAT section.
Improvements
Direct-chat activity hydration now reflects live session state immediately without false busy indicators after reopening.
Multi-pane viewed state, focus-return clearing, and start/resume feedback are more consistent.
Bug Fixes
Corrected the multi-pane archive action label so it accurately describes archiving all chats.
Sidebar folders — organize your chats into collapsible folders. Create one from the CHAT section's +, drag tabs in and reorder them with an insertion divider, and start new chats directly inside a folder. Every chat tab now renders as a single row (individual panes no longer clutter the sidebar), and folders, membership, and ordering persist in the database across restarts — from any window. Deleting a folder archives the tabs inside it behind a confirmation. (#281)
Search and pagination on Runners and Crews — a search box now narrows both lists as you type: runners match on handle, name, runtime, command, model, effort, working directory, and system prompt; crews match on name, purpose, goal, and member handles/runtimes. Long lists page through a numbered pager (at most 5 page numbers, with … collapsing the middle) with boundary-aware arrows, a visible result count, and a clear no-match state with one-click clear. Esc clears the search while focused. (#220)
Window position restore (#271). Runner now reopens exactly where you left it — position, size, and maximized state persist across restarts. Built multi-monitor safe: geometry is tracked in logical coordinates after the official Tauri plugin approach failed on secondary displays (tauri#7890), with off-screen recovery when a saved display is no longer connected.
Delete all for archived items (#31). Settings → Archived gains a confirm-gated Delete all: archived missions are permanently removed along with their event logs and session rows; archived chats likewise.
Improvements
Settings pane content is centered on wide windows instead of hugging the left edge.
Full-page Settings (#274). The settings modal is gone — settings now takes over the window with sidebar navigation (App / Integrations / System groups), search, and wide card-based panes, in the style of modern desktop apps.
Keyboard shortcuts pane (#257). A searchable reference of every app binding — window & navigation, chat panes, mission workspace — with key chips.
Archived pane (#31). Browse archived missions and chats under Settings → Archived: newest first, searchable (title + directory), filterable by type — and Unarchive restores items to the sidebar live. Also exposed as mission_unarchive over MCP.
New update experience (#276). When an update is ready, a slim pill appears above Settings in the sidebar and expands into an update card on hover — restart to install from right there. Version info and update controls now live in Settings → About (the Updates tab is gone).
Claude Code chats keep their scrollback across resume (#272). Resuming a session no longer wipes the terminal history Runner already had — prior conversation output stays scrollable above the resume repaint, matching what a real terminal keeps. Codex sessions are unaffected (codex restores its own transcript on resume).
Bug Fixes
Split chat group status alignment in the sidebar (#270).
Added the persistent titlebar sidebar toggle from #246, so the collapse control stays visible in both expanded and fully collapsed states.
Improvements
Refreshed the sidebar collapse UX with filled/open and hollow/collapsed panel glyph states, preserved the left-edge hover preview and pin behavior, and removed the old bottom chevrons control.
Multi-pane tab layouts now stay in sync across windows. Splitting a chat into panes, grouping/regrouping tabs, collapsing a tab, or switching the active tab in one window now updates every other open window (#258).
No more sibling-pane flicker on resume/start. Resuming or starting a session inside a multi-pane tab no longer causes the other panes to flicker, blank, or repaint. The fix scopes the terminal atlas repaint and pane-geometry sync so a per-pane action leaves its neighbors untouched, while keeping the WebGL glyph-corruption protection intact (PR #262).
Multi-pane tabs now read as one unit in the sidebar CHAT list. A tab with 2+ chats collapses into an accordion group — a header (disclosure chevron · split icon · pane-count badge) over its member chats, indented under a rail. Single chats stay flat leaf rows, so single- vs multi-pane is legible at a glance.
Collapse to tidy — click the chevron/header to fold a group away; the state persists per tab across restarts. The active on-screen tab always stays expanded.
Still one tab — the active tab keeps its accent rail + focused-pane marker; pin, rename, and the row context menu work exactly as before, and pinning a group pins every member together.
Frontend-only display grouping — no backend changes (impl 0023).
A chat added to a pinned split now inherits the pin, pin/unpin applies to the whole tab, and the sidebar renders a tab's members as one contiguous block — no more pinned groups torn apart by other rows. (#250)
Starting a new chat from the sidebar (or ⌘T) while a tab has an empty pane now fills that pane instead of collapsing the split, and a window reports pane ownership immediately — chats no longer appear to "jump" to another window. (#251)
Building a new pane layout from a non-member chat now preserves the previous pane tab instead of disbanding it. (#253)
Resuming panes one by one after an app restart no longer garbles sibling terminals: transient terminal row drops are gated, resume forks the PTY at the pane's real dimensions, and the renderer heals glyph-atlas eviction after each resume settles. (#253)
Internal
Canonical surface hierarchy — Window → Tab → Pane — defined in arch §3.6 and aligned across specs and impl logs; "chat group" is now a tab.
Maintenance release: crew prompt-layer fixes and an internal persistence refactor.
Fixed
Crew-level sequencing rules now actually reach agents (#247). orchestrator_policy turned out to be dead config — it was never injected into any prompt, so instructions like "reviewer waits for the coder's handoff" silently did nothing. Crew prompt guidance is now consolidated into a single layer, Team conventions (system_prompt_addendum), which reaches the lead and every worker; orchestrator_policy is deprecated (still readable, no longer written). (#248)
Mission start/reset now validate the composed first-turn prompt against the 32 KB argv ceiling and fail with a clear, slot-named error instead of silently dropping the entire launch prompt when crew briefs/goals compose too large. (#248)
Internal
The persistence layer moved to a repo/ module built on serde_rusqlite: derived row↔struct mapping replaces five hand-written mappers and scattered SQL, locked down by round-trip, legacy-format, and byte-stability unit tests. No schema change, no migration — existing databases are untouched. (#249)
Direct-chat split view (#245): a layout picker in the chat topbar splits the chat area into 2–3 panes — side-by-side, stacked, 1-big+2-stacked, columns, or rows.
Each pane is a self-contained chat with its own header, status dot, and focus ring; panes resize with a draggable divider, and terminals never remount when the layout changes.
Empty panes open the new-chat dialog with the current runner preselected, or fill from a sidebar click; Cmd+W closes the focused pane without stopping its session.
Cmd+[ / Cmd+] cycle pane focus while split; sidebar page navigation moved to Cmd+Shift+[ / Cmd+Shift+].
The split is a sticky chat group: it stays intact while you visit other chats, and the main window restores it across restarts with sessions stopped and resumable in their panes.
The sidebar highlights pane-open chats, with an accent bar on the focused pane's row.
Multi-window ownership is now tracked per visible pane, so a chat owned by another window overlays only its own pane.
Multi-window. Open additional windows with ⌘N (File → New Window) or right-click → "Open in New Window" on a mission/chat in the sidebar. Each window navigates independently. (New chat moved to ⌘T.)
Arc-style duplicate handling. When two windows show the same mission or direct chat, the most-recently-focused one owns it; the other shows a "Focus that window" overlay. The terminal mounts only in the owning window, so PTY input never double-lands. Closing the owner promotes the other automatically.
Fixed the Runner MCP server advertising an invalid tool schema, which caused MCP clients (Claude Code, etc.) to fail loading all Runner tools. The mission_post_human_signal payload now advertises a valid typed schema.
Direct chats now show live activity status in the chat header and sidebar: busy, idle, stopped, or crashed. The busy/idle state reuses Runner's backend PTY idle detector instead of frontend timing guesses.
Bug Fixes
Closing the main Runner window now hides the window instead of quitting the app. Explicit Quit / Cmd+Q still follows the normal shutdown path.
Redesigned the collapsed sidebar behavior: collapsed mode now hides the sidebar completely, with a narrow left-edge hover preview and footer chevron pinning.
Added Cmd+S as the macOS app shortcut for toggling the sidebar, including when terminal panes have focus.
Improvements
Kept Ctrl shortcuts available to terminal sessions and TUIs.
Improved sidebar traffic-light spacing and pinned row styling.
Added the feature spec for moving update checks into the native app menu.