Skip to main content

Runner

rt runner opens a fullscreen board for managing long-running commands (dev servers, watchers, compilers) that run off screen. Each command runs in its own window of a detached tmux session (or its own background herdr pane with --herdr); the board lists them with a status glyph, name, the command string, package and repo, the local URL once one is detected, and uptime.

Ephemeral and pane-owned​

The board exists only while it is on screen. Quitting tears down every process it launched. There is no persistent state, no supervision, no restart-on-crash. If anything is still running when you press q, a confirmation prompt appears.

Backends​

tmux (default): each runner starts its own detached tmux server (on a private socket), with one window per command. Teardown kills that server. tmux must be on PATH; herdr is needed only for focus (f).

--herdr: commands run as background herdr panes via the daemon-owned bg server, addressed with bg: pane IDs. This mode needs the rt daemon running.

The board itself always renders via rt-ui in the current terminal.

Adding entries​

Press a to add a command. The board drops to the normal screen and shows the rt run picker chain (repo, worktree, package, script), starting at the package picker for the board's own worktree. After selecting, the board reappears with the new row in "starting" state. Pressing Escape cancels and returns to the board unchanged.

If the picked entry is a preset (a group of commands) or a queue built from multiple picks ("Launch all"), all its rows land on the board at once.

Seeding from a host​

rt runner --seed-file <path> opens the board pre-seeded from a file instead of starting empty: one JSON line, {"seed":[{"name":"dev","command":"pnpm run dev","cwd":"/abs/path/packages/web","pkg":"web","repo":"acme"}]} -- the same envelope rt run --resolve-only prints for a preset or a queued "Launch all" pick. pkg and repo are optional. The file is read once at start; rt never deletes it, so the host owns its lifecycle. --seed-file composes with --herdr. A missing, unreadable or invalid file is a one-line error on stderr and exit 1, before any board or daemon work.

Keys​

KeyAction
j/k, ↑/↓Move selection
aAdd a command
sRestart selected (sends Ctrl-C, waits for exit, re-runs in the same slot)
xStop selected
fFocus: jump to the command's live terminal output
eEdit the selected command (enter saves and restarts it, esc cancels)
tToggle tail peek (last 20 lines of output inline on the board)
oOpen the selected command's detected URL in the browser
q / Ctrl-CQuit (confirms if anything is running)

Focus​

f switches to the command's terminal output so you can see its full scrollback. On the tmux backend the board must itself be running in a herdr pane: if nothing is attached to the runner's tmux session yet, focus splits a herdr pane that attaches it, then selects the command's window. On the herdr backend the daemon's focus verb opens the pane in the board's workspace.

Status glyphs​

GlyphStateMeaning
● mintrunningProcess active
○ dimstoppedClean exit (code 0 or 130)
✗ coralcrashedNon-zero exit
spinnerstarting/stoppingTransitional

A screenshot of the populated board with a tail peek open would help readers understand the layout. The design artboards exist but are not yet in the repo as images.