Command line
Install the CLI as described in Install. Keep the app open for commands that create or focus tabs and splits.
thurm --helpthurm split --helpthurm listthurm --json listCommands that target the current pane use THURM_PANE_ID, which Thurm sets in
pane processes. Outside Thurm, use an explicit pane ID from thurm list.
procs can list all panes; use --pane to restrict it.
Open a pane and read its output
Section titled “Open a pane and read its output”Run this from a Thurm pane:
pane=$(thurm split --dir right)thurm send --pane "$pane" 'echo THURM_READY'thurm wait --pane "$pane" --match '^THURM_READY$' --timeout 10thurm capture --pane "$pane" -n 20send adds Enter unless you pass --no-enter. It sends input to the process
in the pane, so first check that the intended shell or agent is active.
To send standard input as a bracketed paste:
printf '%s' 'Text for the active program' | thurm send --pane "$pane" --paste --no-enter -Commands
Section titled “Commands”Use thurm COMMAND --help for the full argument list.
| Command | Purpose and main options |
|---|---|
list (alias ls) |
List panes |
pane-id |
Print the current pane ID |
info --pane ID |
Show pane details |
new-tab [COMMAND...] |
Open a tab; --window (in a new workspace, in the background), --cwd PATH, --hold |
split [COMMAND...] |
Split a pane; --dir right|down|left|up, --pane ID, --cwd PATH, --hold |
focus ID |
Focus a pane in the app |
close [ID] |
Stop and close a pane; ID is positional |
title [TEXT...] |
Set the tab title; --pane ID; empty text resets it |
send [TEXT...] |
Send text; --pane ID, --paste, --no-enter; - reads stdin |
send-keys [KEYS...] |
Send keys such as Enter, Escape, C-c; --pane ID |
capture |
Read visible text; --pane ID, -n N, --scrollback, --ansi |
wait |
Wait for a condition; see below |
scroll up|down|top|bottom|prev-prompt|next-prompt |
Move the viewport; --pane ID |
clear |
Clear scrollback; --pane ID |
complete |
Show completion choices for prompt input; --pane ID |
procs |
List processes and ports; --pane ID, --ports |
notify TITLE [BODY...] |
Send a desktop notification through the current terminal |
presets |
List agent launch presets |
launch PRESET |
Launch a preset; --split DIRECTION, --cwd PATH |
agents |
List agent panes and status |
fork |
Fork an agent session; --pane ID, --split DIRECTION |
hooks install|uninstall|status |
Manage hooks; --agent claude|codex |
explain |
Explain the last finished command; --pane ID; needs enabled AI |
config-path |
Print the configuration path |
reload |
Reload configuration |
set KEY VALUE |
Write a setting and reload |
theme [SPEC] |
List themes, or select a theme |
save |
Write a session snapshot |
layout |
Print layout JSON |
daemon ACTION |
Control the daemon; see Sessions |
socket-path |
Print the daemon socket path |
remote add|list|remove|status|install |
Manage remote hosts; see Remote workspaces |
remote doctor [NAME] |
Check what a host needs and offer fixes; --fix, --yes |
handoff |
Hand the repository to a remote agent; --remote NAME, --preset, --branch agent/NAME, --list, --fetch ID, --cleanup ID |
--hold keeps a pane open after its command exits. Use -- before a command
when you need to separate its flags from Thurm flags:
thurm new-tab --hold -- /bin/sh -c 'printf "Task complete\n"'Wait conditions and exit codes
Section titled “Wait conditions and exit codes”Choose one condition and use --timeout SECONDS to bound a script’s wait.
| Condition | Meaning |
|---|---|
--idle MS |
No output for this many milliseconds |
--prompt |
The shell is at a prompt; needs shell integration |
--exit |
The pane process exited |
--match REGEX |
A regular expression matches the visible screen |
--agent-free |
The agent is idle or waits for input; alias --until-free |
--agent-done |
The agent finished its turn; needs hooks |
--agent-waiting |
The agent waits for input |
Output silence does not prove that a task succeeded. Check the output and use a condition that matches the task. A screen match checks the visible screen, not all saved scrollback.
| Exit code | Meaning |
|---|---|
0 |
Command succeeded or wait condition was met |
1 |
Operation failed |
2 |
Invalid CLI arguments |
124 |
Wait timed out |
--remote NAME is global: it sends the command to that host’s daemon through
the tunnel the app keeps open, and fails when the app is not connected to it.
Pass --pane with it. See Remote workspaces.
--json is global. Use it for structured results where the command returns
data. A command that only performs an action can return no output.