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
| Key | Action |
|---|---|
j/k, ↑/↓ | Move selection |
a | Add a command |
s | Restart selected (sends Ctrl-C, waits for exit, re-runs in the same slot) |
x | Stop selected |
f | Focus: jump to the command's live terminal output |
e | Edit the selected command (enter saves and restarts it, esc cancels) |
t | Toggle tail peek (last 20 lines of output inline on the board) |
o | Open the selected command's detected URL in the browser |
q / Ctrl-C | Quit (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
| Glyph | State | Meaning |
|---|---|---|
| ● mint | running | Process active |
| ○ dim | stopped | Clean exit (code 0 or 130) |
| ✗ coral | crashed | Non-zero exit |
| spinner | starting/stopping | Transitional |
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.