keepane.
Open source

Panes that keep running, and talk to each other.

keepane is a terminal multiplexer. The programs in its panes keep running after the terminal connection closes, and panes can pass messages to each other through inboxes, on one computer or across two you have paired. The usual tmux keys, commands and config file keep working, h j k l included, and PowerShell, cmd and WSL run inside panes with every keystroke intact.

MIT · Windows, Linux, macOS · one small binary · formerly wmux

A tour in four parts. Panes named lead, build and agent, each with its work mode and inbox on its border: a message sent to build runs there as a command, one sent to the agent waits in its inbox. A small MCP client makes a pane named tests and sends it a command. The dashboard shows every pane, a pane's events and the agent's inbox. keepane web prints a QR code; on a phone the list shows every pane, and a command typed there runs in build on the computer.
The tour: panes that message each other in three work modes, MCP for agents, the dashboard, and the panes on your phone.
1file to install
0Cygwin / WSL needed
580automated tests
MITlicensed
01

Send work between panes

Give a pane a name and a work mode, and send it messages: a shell runs them at its prompt, an agent gets them when it is free. C-b v shows every pane and its inbox.

A command sent to the pane named builder runs there with its envelope as a comment; its record says done and keeps the output; the dashboard shows the panes, an agent's inbox and the tasks in panels, puts a message first and shows its record laid out beside the list
A command sent to the pane named builder runs there, its source in a comment; its record says done and keeps what it printed. Then the dashboard, in panels: the panes, an agent's inbox, the tasks, and a message put first, its record laid out beside the list.
Left, the command running with its envelope as a comment; right, trace-message showing it delivered, done and its output
The dashboard: panes, an agent's inbox and the tasks on the left, a message read in full, field by field, on the right
Three agents at work in three panes, each border showing its model, cost so far and how full its context is; the dashboard listing them with cost and context and the total in its title; keepane list-agents printing the same
Three agents at work: each pane's border says its model, what it has cost and how full its context is; the dashboard lists them with the total; keepane list-agents prints the same. (The agents are stand-ins that write real transcripts.)
02

Panes on another computer

Two computers on one network, or both on Tailscale, pair once, the way ssh-copy-id works. From then on a pane on one sends messages and commands to a pane on the other, and the answer comes back to the pane that asked.

# on the laptop: pair with the desktop, whose keepane web printed this address
keepane link add http://192.168.1.20:7681/#k=...
# a message for the agent pane there
keepane send-message --to 192.168.1.20:7681/%agent "review the diff"
# what that machine runs, and a look at its pane (if it allows it)
keepane link info 192.168.1.20:7681
keepane link capture 192.168.1.20:7681/%agent
03

Close the terminal, the programs keep running

C-b d detaches and the programs keep running in the background. keepane attach picks the session up again, from any terminal window.

A session of three panes is saved, the server stops as a reboot stops it, keepane list-saved shows the session, and keepane resume brings back the panes, their names and folders and what they showed
Three panes at work, saved with C-b C-s; the server gone as a reboot takes it; keepane resume brings back the panes, their names and folders, and what they showed.
Back at a plain shell after detaching
The same layout after attaching again
04

What ran, when, and how long

C-b C-t writes each command's start time, duration and result at the end of its line. What panes print is kept a day at a time, and C-b / opens any day.

Command times appear at the end of each command's line, the history picker lists pane positions and days, a day opens in a pager, and a pane closed by mistake comes back with C-b u
Three commands with their times, one of them failing; the history picker and a day in the pager; a pane closed by mistake, back with C-b u.
Three commands, each with its start time, duration and a tick or a cross at the right end of its line
A day of history in the pager popup, each command after a grey line with its time
A test fails; C-b y copies what it printed; send-message hands it to the agent pane beside it, which fixes the code and says it is free; the test then passes
A test fails; C-b y takes what it printed; one message hands it to the agent beside it, which fixes it; the test passes.
05

The job that finished while you were elsewhere

monitor-activity marks a window you are not looking at with # when it prints, ! on a bell, and ~ when it has been silent too long. C-b M-n jumps to the next marked window.

A background job finishes in another window, the status line marks it, C-b M-n jumps there, a failing command leaves its pane in place, and a popup shows the window list
A deploy finishes in window 1 while window 0 carries on; the flag appears in the status line and in list-windows; a command that fails leaves its pane and its exit code behind.
06

Panes, the way you already know

C-b % splits left and right, C-b " top and bottom. Move with the vim keys or the arrows, and keep pressing: movement and resizing repeat without the prefix.

Three panes: a shell on the left, keepane list-panes top right, a build loop bottom right
The same three panes after one echo typed with synchronize-panes on: the line ran in every pane, S on the status line
07

Full screen, a list, or a menu

C-b z blows the current pane up to the whole window and back. C-b w opens a chart of every session, window and pane: h j k l to move, a to open all of it, v for a tree or a plain list, digits to jump, Enter to go. C-b > puts the pane commands in a menu, so nothing has to be remembered.

A zoomed pane filling the window, Z on the status line
The C-b w chart: keepane on top, then the sessions, the windows of the current one and its panes, each in an open box, the selected pane highlighted
The panel after C-b and a pause: what each key does, by group: panes, windows, sessions, tools
The pane menu: split, swap, break out, zoom, respawn, kill, each with a letter
A popup box over the window running a command, with the pane behind it still visible
08

Your panes, on your phone

Start keepane web before you walk away from a long build. It prints a QR code; scan it on the same Wi-Fi and the phone's browser lists every pane, shows any of them as it appears on screen, and lets you type into it. Nothing to install on the phone.

keepane web on a phone: the list of panes with the program each runs, and one pane showing a coloured git log with each command's time in a column on the left, with a row of keys and a box to type in
09

Your .tmux.conf, imported once

The same command names on the command line, in the : prompt and in the config file. keepane import-config brings what it can use from your tmux config into its own, once, the rest commented out with why.

set -g prefix C-a
set -g default-shell wsl          # pwsh (default), powershell, wsl, cmd, or a path
set -g mouse on
set -g repeat-time 500            # how long a `bind -r` key keeps working

set -g monitor-activity on        # mark a background window that prints
set -g remain-on-exit on          # keep a pane whose program died

bind -r h select-pane -L          # -r: press h h h after one prefix
bind | split-window -h
bind -n M-Right next-window       # -n: no prefix at all
set -g status-right "#{pane_current_path} %H:%M"
10

Git branch, CPU and memory on the status line

The default status line shows your git branch, the pane's directory, CPU and memory use, and the battery if there is one. keepane reads these itself once a second without starting any helper process. You can replace the line with your own or turn it off.

[work] 0:editor* 1:build 2:logs     master | ~\Documents\dfine\keepane | CPU 9% MEM 65% | 11:45
11

Install

Linux and macOS

A .tar.gz for each (static on Linux; Apple silicon and Intel). Unpack it and put keepane on your PATH.

Get it

Homebrew

macOS and Linux, from the release's own builds; brew upgrade keepane takes a new version.

brew install newdee/tap/keepane

Windows installer

The .msi puts keepane in Program Files, on the system PATH, and in "Apps & features".

Get it

Windows portable

The .zip is the same single exe. Unzip it anywhere and run it.

Get it

Scoop

The manifest in the repository installs the zip and follows releases.

scoop install https://raw.githubusercontent.com/newdee/keepane/master/packaging/scoop/keepane.json

From source

cargo install --git \
  https://github.com/newdee/keepane --locked

Try it on your next long build.