v0.13.0Latest
Tabs that name themselves
Paneflow 0.13.0 makes the sidebar follow the work. A tab takes the title its CLI writes to the terminal (Claude Code publishes its topic there, shells their prompt line) and keeps tracking it, and with automation.tab_auto_naming on it summarizes the conversation into a 2-5 word title through the agent's own CLI, the way cmux names its workspaces. The status on every workspace and tab row is now one word on one X (Input, Error, the spinner, Done with its unread count), the Stalled state is gone, and a pull request takes the slot as Review, Draft, or Merged when no agent is reporting.
Panes gain a tab bar of squircle chips, the Changes dock can take the whole cockpit with Cmd/Ctrl+Shift+F, the editor's Minimap and Scrollbar toggles persist in a new editor section, and the update check repeats every four hours while the app runs.
The session format stays at v2, the terminal engine is still libghostty on every target, and the packaging contract, the IPC and MCP method names, and the paneflow CLI are unchanged. Two configuration keys and one theme color are removed and ignored when present; three keys are added. All of it is in the upgrade notes.
Removed
The Stalled agent state
A long turn is a long turn, not a fault. The state left with its two settings and its theme color:
- "agent_stall_detection": true,
- "agent_stall_threshold_secs": 300,
"colors": {
- "agent_stalled": "..."
}
Both keys and the color are ignored when a paneflow.json still carries them, so nothing fails at load; removing them keeps the file honest. There is no replacement: a tab whose agent has been working for a long time shows the spinner, as it does for a short turn.
The pane icon stack on tab rows
The stack of pane icons on a tab row restated what the tab holds while occupying the lane the status word needed. The indent guide is one continuous line and the tab's surfaces are listed by the new tab bar on the pane itself.
Behavior changes
Every agent state is a word on the trailing edge
Status moved to the trailing edge of both workspace and tab rows, drawn on one X as a glyph and a word: Input, Error, the spinner alone while the agent works, and Done with the unread count. When no agent is reporting, the tab's pull request takes the slot in GitHub's state color as Review, Draft, or Merged (with the PR switch on). Under the pointer the status yields the slot to the hover action without reflowing the row.
Pull request lanes no longer wait for the first 30 second git tick: the lookup starts as soon as a checkout's branch is known, and the last known state of each tab's pull request is kept in the session file (pull_request on a tab, with number and state) so it is drawn at launch and corrected in the background.
Tabs follow the terminal title
The title a program writes to its terminal becomes the tab's name in the sidebar and replaces itself on every change. Spinner glyphs and control characters are stripped first, and a tab holding several surfaces is left alone. The first-prompt placeholder and the resume-picker title still cover a CLI that never writes a title. A name you typed always wins, and Reset name hands the tab straight back to the current terminal title instead of waiting for the next write.
One session per tool on a surface
A Claude Code pane could carry two sessions, one keyed by the shell pid and one by the agent pid, once the session registry bound the second to the same surface, so the rail counted two agents for one. Binding a surface now folds away same-tool twins on that surface and carries over their last result.
Unread completions and mutes survive a restart
The unread flag on a tab and the mute on a workspace are written to the session file (unread on a tab, muted on a workspace), so a restart brings back the Done counts and honors a mute taken before it.
The update check repeats
The check used to run once at launch. It now loops every four hours while Paneflow runs, thirty minutes after a failed attempt, so a release published mid-session shows up in the title bar without a restart. A failure never replaces a known result, nothing changes while a download is in flight or a staged binary awaits restart, and a dismissed version stays dismissed until a newer one appears.
Added
Tabs name themselves from the conversation
With automation.tab_auto_naming on in paneflow.json (off by default), the end of an agent turn summarizes the session's opening request and last few exchanges into a 2-5 word title, in the conversation's language, and refreshes it when the topic moves:
{
"automation": {
"tab_auto_naming": true
}
}
The summary runs through the agent's own CLI with tools, MCP servers, and session persistence off (claude -p, codex exec, opencode run, pi --print), so it uses the account you already signed in with; a session on another agent borrows the first of those that is on PATH. At most one call per session every three minutes, only when the conversation grew, never blocking the agent, with a 60 s deadline, and silently skipped when no summarizer is installed or the call fails. PANEFLOW_* and Claude session markers are scrubbed from the summarizer's environment so the hook binary cannot report the call back as a session. A summarized name outranks the live terminal title; a name you typed outranks both, and Reset name reopens the tab.
Panes have tabs
A tab bar under the pane header lists the pane's surfaces as squircle chips carrying the same title as the header, with a + chip that opens a new terminal in the active tab's directory. The strip scrolls horizontally without a scrollbar and fades its hidden edges into the card. Tabs survive a restart with their scrollback through the existing multi-surface session schema; closing the last tab closes the pane.
The Changes dock can take the whole cockpit
A maximize button in the dock's tab strip, or the new toggle_diff_dock_maximize action bound to Cmd/Ctrl+Shift+F, hides the pane grid so Changes, an editor tab, or a dock terminal gets the full window width; the same control or shortcut restores the panes. Hidden panes stay mounted with constant bounds, so an agent running behind the dock never sees a PTY resize, and the focus that was active before comes back on restore. Opening the dock and maximizing it both animate like the sidebar slide, and reduce_motion settles them instantly. The maximized dock flexes to its container, which also fixes the clipped right edge.
The editor's Minimap and Scrollbar toggles are a setting
They live in the new editor section of paneflow.json, apply to every open file at once, live or parked, follow the config watcher, and survive a restart:
{
"editor": {
"minimap": false,
"scrollbar": true
}
}
Mark as Read and Mute Notifications on a workspace
Both are in the workspace context menu. A muted workspace fires no desktop notification and records no unread completion.
Fixed
- The rail no longer counts two agents for a single Claude Code pane (see "One session per tool on a surface").
- Pull request lanes and glyphs are drawn at launch from the session file instead of after the first 30 second git tick.
- Expected diff skips (lockfiles, files over the 512 KiB cap, binary content, word-diff blocks that fall back to line hunks) log at debug instead of warn, so a worktree holding large benchmark artifacts no longer floods startup with warnings.
- The schema doc guard test matches the regenerated public docs mirror again (nested
agent_panel.profiles.*.agentpaths,number/nulltypes) and the Windowsdefault_shellfallback chain in the docs is restored:pwsh.exe, thenpowershell.exe, then%ComSpec%, thenSystem32\cmd.exe, then barecmd.exe.
Upgrade notes
agent_stall_detectionandagent_stall_threshold_secsare removed and ignored when present. Theagent_stalledtheme color is removed and ignored.automation.tab_auto_namingis added, defaultfalse.editor.minimap(defaultfalse) andeditor.scrollbar(defaulttrue) are added.toggle_diff_dock_maximizeis a new action bound toCmd/Ctrl+Shift+Fby default; rebind it undershortcutsif that chord is taken.- The session schema stays at v2.
unreadandpull_requestare added on a tab andmutedon a workspace; a 0.12.0 session restores with every count at zero and nothing muted, and a 0.12.0 build ignores the three new fields. - The terminal engine, the packaging contract, the IPC and MCP method names, and the
paneflowCLI are unchanged. - Downgrading to 0.12.0 works. An older build ignores
automation,editor, and the three session fields, and brings back theStalledstate with its defaults.
Install and validation
Download the signed artifacts from this release or use the installation instructions.
Every primary artifact carries a .sha256 sidecar and a minisign .minisig; each AppImage also ships an .AppImage.zsync for delta updates. 35 assets in total.
Pipeline: run 34159922582.
Legs that passed:
- Build:
x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,aarch64-apple-darwin,x86_64-pc-windows-msvc - Release test gate on Linux x86_64:
cargo fmt --check,cargo clippy --workspace --locked -- -D warnings,cargo test --workspace --locked - Package smoke tests: Debian 12 and Ubuntu 22.04 (
.debpostinst), Fedora 40 and openSUSE Tumbleweed (.rpmpostinst), Arch Linux (tar.gzbinary), Windows MSI install and relay - Auto-update end to end on Linux x86_64
Full Changelog: https://github.com/arthjean/paneflow/compare/v0.12.0...v0.13.0