v0.18.0Latest
Spaces group your workspaces
Paneflow 0.18.0 adds spaces: named contexts, such as work and personal projects, that each hold their own workspaces. The sidebar shows one space at a time, a button beside the space name leads you to an agent waiting in another space, and scripts can create and list workspaces by space. A space can also set environment variables for every terminal it opens, so pointing CLAUDE_CONFIG_DIR, CODEX_HOME, or GH_CONFIG_DIR at a separate directory gives that space its own Claude Code, Codex, or GitHub CLI account, with Paneflow's hooks and status following it. A space organizes work without isolating it: every CLI verb and the MCP bridge still reach the whole instance. With no space declared, Paneflow behaves as before.
The release also adds a Comfortable density setting that joins panes edge to edge when turned off, and cuts the git processes of background workspaces: with 30 workspaces open, from 180 a minute to 24 while a window is active, and none while every window is in the background.
Added
- Spaces.
paneflow.jsontakes aspaceslist of up to 9 entries, each with anid, anameof at most 32 characters, and an optionalcolor(red,green,yellow,blue,magenta, orcyan). Hand edits apply without a restart, and an invalid entry is skipped with a warning while the others load. Every workspace belongs to one space,Defaultwhen it has none, and new workspaces join the active space. The sidebar,Ctrl+1toCtrl+9(Cmd+1toCmd+9on macOS), and Next workspace only cover the active space, and opening a workspace of another space, for example a folder that is already open there, switches to that space. Each workspace's space and the active space are kept insession.jsonas optional fields, so a previous version still reads the file; a space removed frompaneflow.jsonsends its workspaces back toDefault. - Spaces in the interface. Once a space exists, the sidebar header shows the active space's circle and name in place of
Workspaces. Click it for a menu that listsDefaultfirst, then your spaces, with New space… and Manage spaces, or useCmd+Alt+LeftandCmd+Alt+Righton macOS,Ctrl+Alt+PageUpandCtrl+Alt+PageDownon Linux and Windows, remappable asprevious_spaceandnext_space. The sidebar swaps its rows without animation, dragging a workspace reorders it among its own space without moving the others, and an empty space says so with the usual Open folder button. - Moving workspaces. Move to space in a workspace's context menu, or in the command palette, files the workspace in another space or in a new one, with a toast whose Show button switches to that space. The palette gains Switch space, Next space, Previous space, New space, and Move workspace to space, and its workspace picker lists the active space first, then the other workspaces prefixed with their space.
- Settings > Spaces creates, renames, colors, and deletes spaces, up to 9; deleting one moves its workspaces to
Defaultafter a confirmation. A space's color draws as a gradient that looks the same in every theme. Click a space's circle, or Upload image, to give it a picture from a PNG, JPEG, WebP, GIF, BMP, or TIFF file of at most 25 MB and 12,000 pixels a side: Paneflow crops it to a square, keeps a 96 px copy in theavatarsfolder of its home directory, records it asavataron the space's entry, and shows it in place of the color in the sidebar and in Settings. - Attention across spaces. When an agent in a hidden space needs you, a button beside the space name shows the sidebar status glyph of the most urgent one: an amber bell for input or a pending write approval, a red crossed circle for a program that reported a failure, a blue dot for a finish you have not seen, with the total once it exceeds 1. Clicking it goes to the waiting or failed pane, or to the workspace of an unseen finish; its tooltip names the space and what is waiting, and the space menu marks each hidden space the same way. Finished agents of a muted workspace are not counted. Once a space exists, each Attention queue entry and each desktop notification for an agent's finish, input request, or unexpected exit names its space, and choosing a queue entry in a hidden space switches to that space and focuses the agent's pane.
- Spaces for scripts.
workspace.list,workspace.current, and each surface ofsurface.list(sopaneflow ls) carryspace: {id, name}, ornullfor the default space, and workspace indexes stay global across spaces.workspace.createandworkspace.uptake an optionalspace, a name in any case or an id, and otherwise use the active space; an unknown one is refused withunknown space: <value>before anything is created.paneflow new --space <name>and a top-levelspacekey inpaneflow.workspace.tomlpass it through,paneflow ls --humangains a SPACE column, andworkspace.select(paneflow select) switches to the space of a hidden workspace. Every verb, the MCP bridge withPANEFLOW_MCP_SCOPE=all, andwrite_panestill reach the whole instance. - An environment per space. A space's Environment in Settings > Spaces, or
envon aspacesentry inpaneflow.json, sets variables on every terminal opened in that space's workspaces, aboveterminal.envand below agent profiles and a surface's own env;~and$NAMEexpand as in agent profiles. PointingCLAUDE_CONFIG_DIR,CODEX_HOME, orGH_CONFIG_DIRat a separate absolute directory gives the space its own Claude Code, Codex, or GitHub CLI account: Paneflow creates a missing directory before the terminal starts, with a toast when it cannot. Settings refuses invalid,PANEFLOW_, protected, loader, and agent session variables, relative config directories, duplicates, and references to unset variables with the reason, flags values whose name containsKEY,TOKEN,SECRET, orPASSWORDas stored in plain text, and warns when Paneflow's environment exports a token such asGITHUB_TOKENthat would take precedence over the space's accounts. On Windows, variable names reach the terminal upper-cased, and a higher layer wins whatever the case. Open terminals keep the environment they started with, and moving a workspace to a space with another environment says so. - Agent status in every space's accounts. When a space moves
CLAUDE_CONFIG_DIRorCODEX_HOME, saving it installs Paneflow's hooks and MCP bridge there for each agent already installed, release builds refresh them at launch, once for spaces that share the same Claude Code and Codex directories, and Settings > Spaces shows their state with Retry. Paneflow's own processes follow the space too: the pull request badge'sgh, git, cloning, and tab naming receive the space's git identity, SSH,gh, Claude Code, and Codex variables from a fixed allowlist, the sessions sidebar lists the Claude Code conversations of the space's config directory, and forking a conversation reuses the source pane's environment. A workspace ofDefaultruns all of them exactly as before. - Comfortable density, a new setting in Settings > Appearance and in the command palette. It is on by default and keeps panes as separate rounded cards with a gutter between them. Turned off, the panes of a workspace and the diff dock join edge to edge with a 1 px divider, and only the outer corners of the grid and of the diff dock stay rounded, at 10 px. The divider keeps a 7 px grab area for resizing. The setting is stored as
comfortable_densityinpaneflow.json.
Changed
- The sidebar's branch and diff statistics are refreshed every 30 seconds only for the workspace each window shows. Other workspaces refresh when you switch to them, when a commit or a branch switch touches their
.git, and otherwise at most once every 5 minutes. While no Paneflow window is active, nothing is polled, and the shown workspace refreshes as soon as a window becomes active again. With 30 workspaces open, this brings git from 180 processes a minute down to 24 while a window is active, and to none while every window is in the background and no commit or branch switch happens (measurement). Pull request badges and the cleanup of worktrees past the limit also run only while a window is active. - With two or more panes, the focused pane's border is brighter and the tab labels of the other panes are dimmed. An unfocused pane shows its New tab button and pane actions while you hover it, instead of keeping them hidden.
- The title of a thinking agent in the sidebar and a pane header's Working chip shimmer, stepping on the same 90 ms grid as the spinners. The chip only shimmers on the focused pane, and
reduce_motionkeeps both still.
Fixed
- The footer of the sidebar actions menu has the same padding above and below.
Security
rustlsmoves to 0.23.46 for RUSTSEC-2026-0346, whose client session values printed TLS secrets in their debug output.rustls-webpkimoves to 0.103.16 for RUSTSEC-2026-0382 andwebpki-rootsto 1.0.11 for RUSTSEC-2026-0381: both could accept certificate paths through distrusted emSign intermediates, whose private keys are now public. These crates secure Paneflow's update checks, downloads, and telemetry.
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 40106959162.
Legs that passed:
- Build:
x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,aarch64-apple-darwin,x86_64-pc-windows-msvc, each gated bycargo fmt --checkandcargo clippy --workspace --locked --target <target> -- -D warnings - Release test gate on Linux x86_64:
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.17.7...v0.18.0