Skip to content
PaneflowPaneflow

v0.18.0Latest

Spaces group your workspaces

View on GitHub

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.json takes a spaces list of up to 9 entries, each with an id, a name of at most 32 characters, and an optional color (red, green, yellow, blue, magenta, or cyan). 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, Default when it has none, and new workspaces join the active space. The sidebar, Ctrl+1 to Ctrl+9 (Cmd+1 to Cmd+9 on 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 in session.json as optional fields, so a previous version still reads the file; a space removed from paneflow.json sends its workspaces back to Default.
  • 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 lists Default first, then your spaces, with New space… and Manage spaces, or use Cmd+Alt+Left and Cmd+Alt+Right on macOS, Ctrl+Alt+PageUp and Ctrl+Alt+PageDown on Linux and Windows, remappable as previous_space and next_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 Default after 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 the avatars folder of its home directory, records it as avatar on 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 of surface.list (so paneflow ls) carry space: {id, name}, or null for the default space, and workspace indexes stay global across spaces. workspace.create and workspace.up take an optional space, a name in any case or an id, and otherwise use the active space; an unknown one is refused with unknown space: <value> before anything is created. paneflow new --space <name> and a top-level space key in paneflow.workspace.toml pass it through, paneflow ls --human gains a SPACE column, and workspace.select (paneflow select) switches to the space of a hidden workspace. Every verb, the MCP bridge with PANEFLOW_MCP_SCOPE=all, and write_pane still reach the whole instance.
  • An environment per space. A space's Environment in Settings > Spaces, or env on a spaces entry in paneflow.json, sets variables on every terminal opened in that space's workspaces, above terminal.env and below agent profiles and a surface's own env; ~ and $NAME expand as in agent profiles. Pointing CLAUDE_CONFIG_DIR, CODEX_HOME, or GH_CONFIG_DIR at 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 contains KEY, TOKEN, SECRET, or PASSWORD as stored in plain text, and warns when Paneflow's environment exports a token such as GITHUB_TOKEN that 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_DIR or CODEX_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's gh, 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 of Default runs 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_density in paneflow.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_motion keeps both still.

Fixed

  • The footer of the sidebar actions menu has the same padding above and below.

Security

  • rustls moves to 0.23.46 for RUSTSEC-2026-0346, whose client session values printed TLS secrets in their debug output.
  • rustls-webpki moves to 0.103.16 for RUSTSEC-2026-0382 and webpki-roots to 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 by cargo fmt --check and cargo 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 (.deb postinst), Fedora 40 and openSUSE Tumbleweed (.rpm postinst), Arch Linux (tar.gz binary), 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

Contributors