A GPU-accelerated terminal multiplexer for Linux, built in Rust with Zed's GPUI framework.
PaneFlow aims to be a modern alternative to tmux/screen with native GPU rendering, split panes, workspaces, and session persistence — all without requiring a terminal emulator host.
- GPU-accelerated rendering via Vulkan (GPUI)
- Split panes — horizontal and vertical, drag-to-resize, up to 32 panes
- Workspaces — up to 20 workspaces with rename, quick-switch (Ctrl+1-9)
- Session persistence — save/restore layouts, CWD, and workspace names
- Themes — 5 bundled themes with hot-reload (Catppuccin Mocha, One Dark, Dracula, Gruvbox Dark, Solarized Dark)
- Custom keybindings — configurable via JSON
- IPC — Unix socket JSON-RPC 2.0 for scripting and AI agent integration
- Client-side decorations — custom title bar with drag-to-move
- Wayland + X11 support
Install the required development libraries for your distribution:
Debian/Ubuntu:
sudo apt install build-essential libvulkan-dev libwayland-dev libxkbcommon-dev \
libx11-dev libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \
libxkbcommon-x11-devFedora:
sudo dnf install gcc vulkan-loader-devel wayland-devel libxkbcommon-devel \
libX11-devel libxcb-develArch Linux:
sudo pacman -S base-devel vulkan-icd-loader wayland libxkbcommon libx11 libxcbPaneFlow requires a GPU with Vulkan support:
# AMD/Intel (Mesa)
sudo apt install mesa-vulkan-drivers # Debian/Ubuntu
sudo dnf install mesa-vulkan-drivers # Fedora
sudo pacman -S vulkan-radeon vulkan-intel # Arch
# NVIDIA
sudo apt install nvidia-vulkan-icd # Debian/Ubuntu
sudo pacman -S nvidia-utils # Arch
# Verify Vulkan works
vulkaninfo --summaryInstall via rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shPick the format that matches your distro. Every format ships the same binary — the differences are how updates arrive and where files land on disk. All artifacts are attached to the latest GitHub release.
Substitute placeholders before running. The commands below use two placeholders:
vX.Y.Z— replace with the release tag on the GitHub Releases page (e.g.,v0.2.0). Copying the command verbatim will 404.<ARCH>— replace withx86_64oraarch64depending on your machine (check withuname -m).To auto-resolve the latest version:
VER=$(curl -fsSL https://api.github.com/repos/ArthurDEV44/paneflow/releases/latest \ | grep -oE '"tag_name":\s*"v[^"]+"' | cut -d\" -f4) ARCH=$(uname -m)Then paste
$VERand$ARCHin place of the placeholders below.
One-shot install of the .deb. The package's postinst automatically
wires pkg.paneflow.dev into /etc/apt/sources.list.d/paneflow.list,
so apt upgrade pulls subsequent releases:
curl -LO https://github.com/ArthurDEV44/paneflow/releases/latest/download/paneflow-vX.Y.Z-<ARCH>.deb
# Verify the signature BEFORE `apt install` — postinst runs as root,
# so an unsigned/tampered .deb could write arbitrary repo sources.
sudo apt install -y dpkg-sig
dpkg-sig --verify paneflow-vX.Y.Z-<ARCH>.deb # expect: GOODSIG
sudo apt install ./paneflow-vX.Y.Z-<ARCH>.deb
paneflow --versionFuture updates:
sudo apt update && sudo apt upgrade paneflowSame pattern with .rpm. The %post scriptlet drops
/etc/yum.repos.d/paneflow.repo pointing at pkg.paneflow.dev/rpm:
curl -LO https://github.com/ArthurDEV44/paneflow/releases/latest/download/paneflow-vX.Y.Z-<ARCH>.rpm
# Verify the signature BEFORE `dnf install` — %post runs as root.
sudo rpm --import https://pkg.paneflow.dev/gpg # see Troubleshooting for the TOFU caveat
rpm --checksig paneflow-vX.Y.Z-<ARCH>.rpm # expect: digests signatures OK
sudo dnf install ./paneflow-vX.Y.Z-<ARCH>.rpm
paneflow --versionFuture updates:
sudo dnf upgrade paneflowSingle-file download. No install, no root — double-click to run or
launch from the terminal. Best for distros with no official .deb /
.rpm and for trying PaneFlow on a machine you don't manage:
curl -LO https://github.com/ArthurDEV44/paneflow/releases/latest/download/paneflow-vX.Y.Z-<ARCH>.AppImage
chmod +x paneflow-vX.Y.Z-<ARCH>.AppImage
./paneflow-vX.Y.Z-<ARCH>.AppImage --version # `paneflow --version` equivalent (AppImage is not on $PATH)Ubuntu 24.04+ and Fedora Silverblue ship without FUSE 2 by default — see Troubleshooting → AppImage won't run on Ubuntu 24.04 if the command above fails.
Use this on Fedora Silverblue, SteamOS, NixOS, or any machine where
you'd rather not touch /usr. Installs to ~/.local/paneflow.app/
and symlinks ~/.local/bin/paneflow:
curl -LO https://github.com/ArthurDEV44/paneflow/releases/latest/download/paneflow-vX.Y.Z-<ARCH>.tar.gz
curl -LO https://github.com/ArthurDEV44/paneflow/releases/latest/download/paneflow-vX.Y.Z-<ARCH>.tar.gz.sha256
sha256sum --check paneflow-vX.Y.Z-<ARCH>.tar.gz.sha256
tar xzf paneflow-vX.Y.Z-<ARCH>.tar.gz
./paneflow.app/install.sh
~/.local/bin/paneflow --versionThe in-app updater atomically swaps ~/.local/paneflow.app/ on new
releases (no package manager involved).
Ubuntu 24.04 and newer don't ship libfuse2 by default. The error
looks like dlopen(): error loading libfuse.so.2. Two fixes:
- Preferred: skip FUSE by mounting the AppImage in-process:
./paneflow-vX.Y.Z-x86_64.AppImage --appimage-extract-and-run
- Alternative: install the compatibility shim
On Ubuntu 22.04 the package is
sudo apt install libfuse2t64
libfuse2instead. Installinglibfuse2on 24.04 can removeubuntu-sessionas a transitive conflict —--appimage-extract-and-runavoids that risk.
Every Paneflow release is signed and the procedure to verify a downloaded artifact is documented per platform. Pick the runbook that matches what you downloaded:
- Linux (
.deb/.rpm/.tar.gz/.AppImage) —docs/release/linux-signing.md. GPG-signed.deb+.rpm(key:keys/paneflow-release.asc); SHA-256 sidecars on.tar.gzand.AppImage. - macOS (
.dmg/.app) —docs/release/macos-signing.md. Apple Developer ID signed + notarized + stapled — Gatekeeper accepts offline. - Windows (
.msi) —docs/release/windows-signing.md. Azure Trusted Signing — verify viasigntool verify /pa /v paneflow-X.Y.Z-x86_64-pc-windows-msvc.msi.
Quick .deb verification (full procedure — including the
mandatory fingerprint cross-check before key import — in the Linux
runbook §1; do NOT paste the snippet below until you have verified
the key fingerprint matches
9809948F4433CF93DD1329449A252F0C183F2711):
curl -fsSL https://raw.githubusercontent.com/ArthurDEV44/paneflow/main/keys/paneflow-release.asc \
| gpg --dearmor \
| sudo tee /usr/share/keyrings/paneflow-archive.gpg >/dev/null
sudo apt-get install -y dpkg-sig
dpkg-sig --verify paneflow-vX.Y.Z-x86_64.deb # expect: GOODSIG.deb (Ubuntu/Debian):
sudo apt remove paneflow # keep config
sudo apt purge paneflow # remove config too
sudo rm /etc/apt/sources.list.d/paneflow.list # remove APT source
sudo rm /usr/share/keyrings/paneflow-archive.gpg # remove signing key.rpm (Fedora/RHEL):
sudo dnf remove paneflow
sudo rm /etc/yum.repos.d/paneflow.repo # remove DNF sourceAppImage: just rm paneflow-vX.Y.Z-<ARCH>.AppImage. Nothing else
is installed on disk (PaneFlow's AppImage doesn't write to ~/.local
or /etc).
.tar.gz:
rm -rf ~/.local/paneflow.app ~/.local/bin/paneflow \
~/.local/share/applications/paneflow.desktop
for s in 16 32 48 128 256 512; do
rm -f ~/.local/share/icons/hicolor/${s}x${s}/apps/paneflow.png
done
# Optional: remove config and cache
rm -rf ~/.config/paneflow ~/.cache/paneflowgit clone https://github.com/ArthurDEV44/paneflow.git
cd paneflow
cargo build --release
bash scripts/bundle-tarball.sh
tar xzf target/bundle/paneflow-*.tar.gz -C /tmp
/tmp/paneflow.app/install.shPaneFlow supports macOS 13 Ventura or later on both Apple Silicon
(aarch64-apple-darwin, primary target) and Intel (x86_64-apple-darwin,
best-effort). Distribution is via signed + notarized .dmg on GitHub
Releases and a Homebrew cask.
Install (end users):
# Homebrew cask (recommended)
brew tap arthurdev44/paneflow
brew install --cask paneflow
# Or direct download — drag PaneFlow.app into /Applications
# from the mounted DMG.Build from source (contributors):
# 1. Install Xcode Command Line Tools (one-time)
xcode-select --install
# 2. Add the target
rustup target add aarch64-apple-darwin
# 3. Build
cargo build --release --target aarch64-apple-darwin
# 4. Bundle into a .app (produces dist/PaneFlow.app)
bash scripts/bundle-macos.sh \
--version "$(cargo pkgid -p paneflow-app | sed 's/.*#//')" \
--arch aarch64
# 5. (Optional) Build a .dmg for local distribution
bash scripts/create-dmg.sh \
--version "$(cargo pkgid -p paneflow-app | sed 's/.*#//')" \
--arch aarch64Unsigned dev build first-launch: macOS Gatekeeper rejects unsigned builds by default. For locally-built binaries (no Developer ID cert available), strip the quarantine attribute once:
xattr -cr dist/PaneFlow.app
open dist/PaneFlow.appRelease builds downloaded from GitHub are always signed + notarized and skip this step.
PaneFlow supports Windows 10 build 1809+ and Windows 11 on x86_64
(x86_64-pc-windows-msvc). Distribution is via a signed MSI on GitHub
Releases and the winget Microsoft Store catalog. ARM64 is deferred —
see docs/WINDOWS.md for the supported-versions
matrix and known limitations.
Install (end users):
# winget (recommended)
winget install ArthurDev44.PaneFlow
# Or direct download — double-click the signed MSI from the latest
# GitHub Release (publisher "Strivex" via Azure Artifact Signing).Build from source (contributors):
# 1. Install the Rust MSVC toolchain target (one-time)
rustup target add x86_64-pc-windows-msvc
# 2. Compile the binary
cargo build --release -p paneflow-app --target x86_64-pc-windows-msvc
# 3. (Optional) Produce an MSI via cargo-wix + WiX 3.14 (preinstalled
# on the windows-2022 CI runner; locally, install via
# `choco install wixtoolset --version 3.14.1`)
cargo install cargo-wix --version 0.3.9 --locked
cargo wix build --no-build \
--package paneflow-app \
--target x86_64-pc-windows-msvc \
--install-version "$(cargo pkgid -p paneflow-app | ForEach-Object { $_ -replace '.*#','' })"Reporting Windows-specific bugs: use the
Windows bug report
template (captures Windows version + build automatically) and see
docs/WINDOWS.md for the full v1 limitations
catalog + upstream-risk tracker.
# Launch
paneflow
# With logging
RUST_LOG=info paneflow| Key | Action |
|---|---|
Ctrl+Shift+N |
New workspace |
Ctrl+Shift+Q |
Close workspace |
Ctrl+Tab |
Next workspace |
Ctrl+Shift+Tab |
Previous workspace |
Ctrl+1-9 |
Switch to workspace N |
| Key | Action |
|---|---|
Ctrl+Shift+D |
Split horizontal (top/bottom) |
Ctrl+Shift+E |
Split vertical (left/right) |
Ctrl+Shift+W |
Close pane |
Alt+Arrow |
Focus adjacent pane |
| Key | Action |
|---|---|
Ctrl+Shift+C |
Copy selection |
Ctrl+Shift+V |
Paste |
Shift+PageUp |
Scroll up |
Shift+PageDown |
Scroll down |
Ctrl+Shift+F |
Search |
Config file location: ~/.config/paneflow/paneflow.json
{
"default_shell": "/bin/zsh",
"theme": "Catppuccin Mocha",
"font_family": "JetBrains Mono",
"font_size": 14,
"line_height": 1.3,
"window_decorations": "client",
"option_as_meta": false,
"shortcuts": {},
"terminal": {
"ligatures": false
}
}Catppuccin Mocha (default), One Dark, Dracula, Gruvbox Dark, Solarized Dark
Theme changes are hot-reloaded. Window decorations require a restart ("client" = CSD, "server" = SSD).
terminal.ligatures(defaultfalse) — whentrue, programming-font ligatures (FiraCode=>!=, JetBrains Mono, Cascadia Code) are rendered through to GPUI's text system. Hot-reloaded; takes effect on the next render. Note that some ligated glyphs span multiple cells, which can shift cell-width measurements compared to the default monospaced behavior.
A versioned JSON Schema for paneflow.json lives at schemas/paneflow.schema.json (draft-07). Editors that understand $schema (VS Code, Zed, JetBrains, neovim with coc-json / nvim-lspconfig) will give you autocomplete and inline validation when you point at it from your config:
{
"$schema": "https://github.com/ArthurDEV44/paneflow/raw/main/schemas/paneflow.schema.json",
"$schemaVersion": "1.0.0",
"default_shell": "/bin/zsh",
"theme": "Catppuccin Mocha"
}Both $schema (the editor pointer) and $schemaVersion (the version pin) are optional. PaneFlow logs a warning when $schemaVersion is unknown but never refuses to load the file — schema validation is editor-side; runtime parsing stays tolerant.
PaneFlow exposes a Unix socket at $XDG_RUNTIME_DIR/paneflow/paneflow.sock using JSON-RPC 2.0.
# Ping
echo '{"jsonrpc":"2.0","method":"system.ping","id":1}' | socat - UNIX-CONNECT:$XDG_RUNTIME_DIR/paneflow/paneflow.sock
# List workspaces
echo '{"jsonrpc":"2.0","method":"workspace.list","id":1}' | socat - UNIX-CONNECT:$XDG_RUNTIME_DIR/paneflow/paneflow.sock
# Send text to active pane
echo '{"jsonrpc":"2.0","method":"surface.send_text","params":{"text":"ls\n"},"id":1}' | socat - UNIX-CONNECT:$XDG_RUNTIME_DIR/paneflow/paneflow.sockAvailable methods: system.ping, system.capabilities, system.identify, workspace.list, workspace.current, workspace.create, workspace.select, workspace.close, surface.list, surface.send_text, surface.split.