Install
openclaw skills install zellijRemote-control zellij sessions for interactive CLIs by sending keystrokes and scraping pane output.
openclaw skills install zellijUse zellij only when you need an interactive TTY. Prefer exec background mode for long-running, non-interactive tasks.
DATA_DIR="${CLAWDBOT_ZELLIJ_DATA_DIR:-${TMPDIR:-/tmp}/moltbot-zellij-data}"
mkdir -p "$DATA_DIR"
SESSION=moltbot-python
zellij --data-dir "$DATA_DIR" new-session --session "$SESSION" --layout "default" --detach
zellij --data-dir "$DATA_DIR" run --session "$SESSION" --name repl -- python3 -q
zellij --data-dir "$DATA_DIR" pipe --session "$SESSION" --pane-id 0
After starting a session, always print monitor commands:
To monitor:
zellij --data-dir "$DATA_DIR" attach --session "$SESSION"
zellij --data-dir "$DATA_DIR" pipe --session "$SESSION" --pane-id 0
CLAWDBOT_ZELLIJ_DATA_DIR (default ${TMPDIR:-/tmp}/moltbot-zellij-data).pane-id (numeric) to target specific panes.zellij --data-dir "$DATA_DIR" list-sessions --long or use list-panes.sh.zellij --data-dir "$DATA_DIR" list-sessions.{baseDir}/scripts/find-sessions.sh --all (uses CLAWDBOT_ZELLIJ_DATA_DIR).zellij action to send keystrokes: zellij --data-dir "$DATA_DIR" action --session "$SESSION" write-chars --chars "$cmd".zellij --data-dir "$DATA_DIR" action --session "$SESSION" write 2 (Ctrl+C).zellij --data-dir "$DATA_DIR" pipe --session "$SESSION" --pane-id 0.{baseDir}/scripts/wait-for-text.sh -s "$SESSION" -p 0 -p 'pattern'.Ctrl+p d (zellij default detach).python3 -q.PYTHON_BASIC_REPL=1.darwin/linux and requires zellij on PATH.zellij excels at running multiple coding agents in parallel:
DATA_DIR="${TMPDIR:-/tmp}/codex-army-data"
# Create multiple sessions
for i in 1 2 3 4 5; do
zellij --data-dir "$DATA_DIR" new-session --session "agent-$i" --layout "compact" --detach
done
# Launch agents in different workdirs
zellij --data-dir "$DATA_DIR" action --session "agent-1" write-chars --chars "cd /tmp/project1 && codex --yolo 'Fix bug X'\n"
zellij --data-dir "$DATA_DIR" action --session "agent-2" write-chars --chars "cd /tmp/project2 && codex --yolo 'Fix bug Y'\n"
# Poll for completion (check if prompt returned)
for sess in agent-1 agent-2; do
pane_id=$(zellij --data-dir "$DATA_DIR" list-sessions --long | grep "\"$sess\"" | jq -r '.tabs[0].panes[0].id')
if zellij --data-dir "$DATA_DIR" pipe --session "$sess" --pane-id "$pane_id" | grep -q "❯"; then
echo "$sess: DONE"
else
echo "$sess: Running..."
fi
done
# Get full output from completed session
zellij --data-dir "$DATA_DIR" pipe --session "agent-1" --pane-id 0
Tips:
pnpm install first before running codex in fresh clones❯ or $) to detect completion--yolo or --full-auto for non-interactive fixeszellij --data-dir "$DATA_DIR" delete-session --session "$SESSION".{baseDir}/scripts/cleanup-sessions.sh "$DATA_DIR".| Task | tmux | zellij |
|---|---|---|
| List sessions | list-sessions | list-sessions |
| Create session | new-session -d | new-session --detach |
| Attach | attach -t | attach --session |
| Send keys | send-keys | action write-chars |
| Capture pane | capture-pane | pipe |
| Kill session | kill-session | delete-session |
| Detach | Ctrl+b d | Ctrl+p d |
{baseDir}/scripts/wait-for-text.sh polls a pane for a regex (or fixed string) with a timeout.
{baseDir}/scripts/wait-for-text.sh -s session -p pane-id -r 'pattern' [-F] [-T 20] [-i 0.5]
-s/--session session name (required)-p/--pane-id pane ID (required)-r/--pattern regex to match (required); add -F for fixed string-T timeout seconds (integer, default 15)-i poll interval seconds (default 0.5){baseDir}/scripts/find-panes.sh lists panes for a given session.
{baseDir}/scripts/find-panes.sh -s session [-d data-dir]
-s/--session session name (required)-d/--data-dir zellij data dir (uses CLAWDBOT_ZELLIJ_DATA_DIR if not specified)