ASCII / MOTION LAB · 001Explore all seven experiments ↗

LLM Session Manager

Manage all your agents in one terminal. Find previous work, resume a session, or run agents side by side in separate Git worktrees.

$ ptln

Opens the session manager: every Claude Code, Codex, Gemini and Antigravity session on this machine in one list, across directories and git worktrees, plus llm conversations when the llm CLI is installed. opencode and goose sessions can be started with ptln new but are not listed. ptln llms is the same command.

The list is read from the session files each engine already writes. Sessions opened through Partyline use a private tmux server (tmux 3.3 or later) that does not read your tmux configuration. Those sessions keep running when the terminal closes; sessions running outside that server do not gain that behavior merely by appearing in the list. ptln --resume reopens the sessions that were open when you last quit.

Bare ptln starts the saved workspace on a new server, or a shell in the current directory if there is none, then opens the launcher. Attaching to an existing server keeps its focus. Old permanent Loops and launcher tabs are closed on the next start or attach.

The supported engines overview lists all eight adapters and their model routes: hosted frontier models, open-weight providers, local runtimes and compatible custom endpoints. Configure models, providers and credentials in each engine; Partyline does not supply an inference server or model weights.

Start a session

$ ptln new claude
ptln new codex ~/dev/api
ptln new claude --worktree spike-auth
FlagDoes what
--worktree <name>create a git worktree on a new branch <name> and start the session in it
--with-statewith --worktree: copy the current checkout's uncommitted changes and untracked files into the new worktree
--keep-going NClaude only: request continuation when a turn ends, up to N times
--goal <text>the instruction given with each keep-going continuation

The argument after the engine name is the directory to start in. Further arguments are not passed to the engine.

A new worktree gets copies of the gitignored files matched by a .worktreeinclude file in the repository root, such as a local .env.

Find, resume and compare sessions

Search for the work you want to return to, select several sessions to open together, or pick two to compare side by side. The keys below operate on the highlighted session unless stated otherwise.

KeyDoes what
arrows · j / k · g / Gmove · jump to the top or bottom
PgUp / PgDnpage the launcher list
/ · s · Rsearch · cycle the sort order (last used, oldest, project) · refresh
⏎open the highlighted session, after a permission-mode picker
spaceselect several; ⏎ opens them in one terminal
oopen the session in a new partyline tab, without the permission-mode picker
N · ctrl-n · nnew session · new session with permissions bypassed · new session with options
|pick two sessions to show side by side
p · r · dpin · rename · show git diff for the session's repository
xdelete (below)
a · t · D · ? · qshow or hide agent sessions and sessions whose worktree is gone · colour theme · these docs · every key · quit

The permission-mode picker offers each engine's own modes: Claude default, accept-edits, plan and bypass; Gemini default, auto-edit, plan and yolo; Codex default, full-auto and bypass; Antigravity default and yolo. Each also offers custom flags. Bypass and yolo ask for confirmation.

Delete shows the session's age, branch, worktree, number of uncommitted files and transcript turns, and whether other sessions are live in the same tree, then asks to confirm. A running session cannot be deleted. Files move to ~/.partyline/trash/ with a manifest.

In a session

Press ctrl-\ to open the menu, then a key. ←/→ or 1-9 switch sessions; esc or ctrl-\ again closes it. Outside the menu, M-1 … M-9 (Alt-1 through Alt-9) select a window directly.

KeyDoes what
n · N · tnew session with options · new session, asking for the engine and permissions · shell window
othe session manager
rrename the highlighted session (on Sessions); ⏎ saves, an empty name clears it, esc cancels
cthe chat room as a popup
,loop settings: the builder and reviewers (engine, model and effort, with backups), failover, the quality standard, whether loops decide or ask you, the arbiter, and an optional Jev key
kOpen Loops on its Contractors tab, first contractor selected. Clicking a chip on the contractor row opens Loops with that contractor selected. The row appears above the tabs while one runs or a finished one (✓ or ✗) has not been seen. ⚙N on a tab counts the contractors that session's loops have running.
lthe Loops popup: every loop and batch, in five columns — what needs you, then planned, in progress, in review, done. ⏎ shows a row's rounds and findings, or selects the contractor of a building or reviewing card on the Contractors tab (⚙); a on a row that needs you opens the approval popup. A batch's steps are built by builders partyline starts, and it commits each step that passes; nothing is pushed.
athe approval popup, for loops waiting for you when Decisions is "ask me" (loops decide by default): what each one will do; approving asks for the four-digit code it shows, drawn large. ‼ on a tab and "N to approve" on the status bar show when one is waiting.
p · r (on Commands)phone setup · relay settings; see Mobile remote
wfork this session into a git worktree
garm or disarm keep-going
[scroll history
| or + · - · \bring the highlighted session in beside this one · move it back to its own tab · shell pane beside this one
x · q · Qclose the highlighted session (press x twice) · detach, leaving everything running · quit every session

Q, and ptln tmux --quit, save the set of open sessions before stopping them. Use it before updating an engine, which will not update while instances run, then ptln --resume.

tmux 3.3 or newer is required to host sessions.

Commands

CommandDoes what
ptln llms ls [--all]list sessions newest first; --all includes sessions started by other agents
ptln llms <id>...open those sessions in one terminal
ptln llms resume <id>resume one session in this terminal, without the multiplexer
ptln llms prune [--apply]list sessions whose worktree is gone, skipping running ones; --apply (or --yes) moves them to the trash
ptln wt ls · rm <branch|path> [--yes] · prune [--yes]list every git worktree of this repository (also bare ptln wt) · remove one, after asking · list clean worktrees on crank-* branches left by older versions; --yes removes them
ptln keepgoing [status|off]list sessions with keep-going armed · disarm it everywhere

Keep-going

Claude only. When the session stops, its Stop hook tells it to continue, up to the count you set. The session is told a done token; printing it, or running out of continuations, lets it stop. Keep-going requests more work; it does not verify that the task is complete.

Complete key reference

Keys act on the highlighted item unless stated otherwise. M-1 through M-9 mean Alt-1 through Alt-9.

tmux (the keys partyline's tmux uses)

KeyAction
(none)prefix None: no tmux prefix
C-\run-shell 'ptln tmux --menu', the menu popup
M-1 … M-9select-window -t N
WheelUpPanefull-screen apps keep the wheel; otherwise copy-mode -e; send -M
MouseDragEnd1Panecopy-pipe-no-clear <clipboard>, then tmux --copied (fallback copy-selection-no-clear)
Entercopy and toast, when a clipboard tool exists
MouseDown1Paneselect-pane; send -X clear-selection
MouseDown1Statusa window name selects that window; a contractor chip opens Loops on its Contractors tab with that contractor selected; other clicks do nothing
MouseUp1Panesend -X cancel: a click returns to live
printable ASCII 33-126 except \leave copy mode, then type the character
Space, BSpaceleave copy mode, then type a space / backspace

ctrl-\ menu popup

The menu opens on Sessions with the current session selected, or Commands when there are no sessions. Sessions then shows no sessions yet. tab and shift+tab switch tabs. Commands has headings start and open, the session's agent, panes, and leave, and shows for #<n> <name> for the session selected on Sessions. Hotkeys work from either tab, including window digits and + for |.

/ starts a session filter (also from Commands). Type to match the session label or engine, ignoring case; backspace edits. Enter ends editing and keeps the matching rows; Enter again keeps the selected session. Esc clears the filter; a further Esc goes back. While editing, printable keys enter text; afterwards hotkeys act on all rows, including hidden windows.

KeyAction
↑ ← / ↓ →move within the current tab; Sessions previews the pane, Commands does not
⏎keep the session on Sessions; run the command on Commands
esc (alone), ctrl-c, ctrl-\back to where you started
1-9focus that window
nNew/Run popup
Nasks engine and permissions
tshell window
olauncher popup
aapproval popup for loops waiting on you
lopen the Loops popup
,loop settings
kLoops on its Contractors tab, first contractor selected
cthe chat room as a popup
ron Sessions: rename the highlighted session (⏎ saves, empty clears, esc or ctrl-c cancels, ctrl-u clears the field); on Commands: relay settings
pphone setup
wworktree popup
gkeep-going popup
[copy mode on the highlighted pane
|, +merge the highlighted session in beside this one
-break it out to its own window
\split with a shell pane
x (twice)close the highlighted pane
qdetach
Q (twice)save, then quit everything
any other key, including the arrowscancels an armed confirm

Per-session popups and modals, tmux mode

KeyAction
1 / 2New/Run: AI session / blank terminal
f / l / rWorktree: fork / list / remove
typed line; q or empty cancelsstdin forms: popup forms; cancel with no tty
y / n / ⏎ / esc / qconfirmation: yes / no / default / cancel
esc, ctrl-c, ctrl-\ cancel; ⏎; letters folded to lower casechoice form: single-key read
digits; N ⏎ for long lists; ↑↓ scroll; extra letters; esc / q / ctrl-c / ctrl-\ / ⏎ with nothing typedpicker form: pick
⏎, backspace, ctrl-u; esc / ctrl-c / ctrl-; a lone q cancels on ⏎text form: text field
y, n, ⏎, esc / qconfirmation form: yes / no
any keynote form: dismiss
1 / d / r / eRecover: clone / relocate / clone a URL / recreate empty
1-9 / p / qEmpty state: adopt a home / type a path / not now
esc / q / ctrl-c / ctrl-\wait line: cancel

Launcher popup

KeyAction
↑ ↓, j kmove; ↑↓ scroll the detail pane when focused (j/k still move)
PgUp / PgDnpage
→ / ←expand / collapse a project; focus / unfocus detail
g / Gtop / bottom
/, then type, backspace, ⏎, escsearch
r, then type, ⏎, escrename
ashow all
scycle sort
Rrefresh
spacemark several
ppin
x, then y / ⏎delete (any other key cancels)
onew terminal tab
tab, l, hfocus / unfocus detail
ddiff in $PAGER
tcycle theme
n / N / ctrl-nNew/Run menu / quick new / quick new with bypass
|guided split
Ddocs in the browser
?help overlay; any key closes
q, ctrl-cquit (closes popup)
⏎header toggles; opens the permission picker, or recovers a gone directory
↑↓←→, h l, ⏎, q, escpermission picker; Enter twice confirms a dangerous mode; custom flags field
escback to the session you came from

Welcome

KeyAction
↑ ↓, j kmove
⏎open the selected door
n / /new session / find a session
esc / q / ctrl-cswitchboard when there are sessions, else quit
ctrl-\ignored

Boot splash

KeyAction
any key, including ⏎ / esc / q / ctrl-c / ctrl-\ignored; boot completion closes the screen

Chat

KeyAction
⏎send; after a \, a new line instead
Shift-⏎, Alt-⏎, Ctrl-⏎new line
←/→, ctrl-b / ctrl-fmove a character
Home/End, ctrl-a / ctrl-eline start / end
Option-←/→, ESC b / ESC f, Ctrl-←/→move a word
↑ / ↓move between lines, then history
Backspace; Deletedelete
ctrl-ddelete forward; on an empty line, leave
ctrl-w, Option-Backspace, modified Backspacedelete a word back
Alt-ddelete a word forward
ctrl-u / ctrl-kkill to start / end
ctrl-z, ctrl-_undo
Tabcomplete
PgUp / PgDnscroll chat history
Wheel up/downscroll chat history three lines
Left dragselect cells and copy on release
Esc while scrolled backback to the newest messages (before any other Esc)
ctrl-tpin the popup as a tab; in the tab, close it
ctrl-r; again for older; esc or ctrl-c cancelshistory search
ctrl-g$VISUAL / $EDITOR, falling back to vi
Esc Esc within 1 sclear the input
Esc while browsing historyback to the draft
ctrl-lclear the screen
ctrl-cleave
bracketed pasteone edit
/add /remove (/rm) /who /stop /go /clear /helproom commands

Loops board

The mouse works too: click a card or contractor to select it, click the selected one to open it, click Board or Contractors to switch, and the wheel moves between cards or scrolls the details. The popup starts on Board. Tab and shift-Tab switch to Contractors (N): N counts running and unseen finished agents. Running builders, reviewers and arbiters appear first, then finished agents (unseen first, then seen within 24 hours, newest first). Use ↑↓/jk to select, ⏎ for full output, esc to return or close, and q to close. Opening finished output marks it seen. At 100 columns or wider, live output appears beside the list; PgUp/PgDn scroll it and G resumes following. Below 100 columns, use ⏎ to watch output.

Loops opens as a popup; ptln loop tab runs the same board full-screen. Add --contractor <id> to open its Contractors tab with that contractor selected; an unknown or malformed id selects the first contractor. Five columns show needs you, then planned, in progress, in review and done. Below 110 columns, the selected column and its neighbours are visible. Loops describes the columns.

KeyAction
← →, h lmove between columns
↑ ↓, j kmove between cards
⏎show rounds and findings; on a building or reviewing card, select its contractor on the Contractors tab
aopen approvals for a row that needs you; on a loop waiting for settings, open the settings
sopen the selected run’s approval popup to confirm stopping
ddelete the card's loop, or its whole batch: the first d says what it deletes, a second deletes it for good, any other key keeps it
rcycle the repository filter: all repositories, then each in turn
,loop settings
a · s · ⏎ in an open cardapprove · stop · back to the board; ↑↓ scroll
escback from details, otherwise close
q, ctrl-cclose (q in details returns to the board)
PgUp / PgDnscroll details

Approval popup

KeyAction
↑ ↓, j kmove between runs or scroll the full brief
⏎open the selected run
a / rapprove / reject with a note; type the displayed confirmation code
f / dfix / dismiss a dispute, after confirmation
xreverse the arbiter's dismissal of a finding, after confirmation
vfull brief
sstop the run, after confirmation
PgUp / PgDn, spacescroll the summary or brief
esc / q / ctrl-cback / close
typed note, ⏎, backspaceedit and submit a rejection note; an empty note is refused

The popup opens by itself when something waits for you and no key has been pressed for 3 seconds. Closing it with esc or q keeps it closed for 10 minutes, unless something new waits. Every decision needs the code shown; typed digits turn green. Three wrong codes within 10 minutes lock that run's confirmations until the 10 minutes pass. After a decision the popup says what happened and closes itself.

Loop delivery

ptln loop inbox <id> prints the run state and waiting messages and exits immediately. Reading it resets the three-wake limit, even when the prompt hook already delivered the messages. Claude uses ptln loop listen <id> in the background. Codex gets one wake line per waiting message batch while its pane is idle, empty and unwatched. Gemini can start batches; results arrive with its next prompt. Single runs are refused for Gemini because partyline cannot recognise its idle input box. Config-file prompt hooks must be installed and trusted for Codex and Gemini.

Use a partyline loop

Tell a Claude, Codex or Gemini session "use a partyline loop for this". Its session context points to ptln loop guide, which prints the workflow for the calling engine: write a brief, start a run or batch with checks, and read the review results. Loops approve their own briefs by default; with Decisions set to "ask me", you approve in the approval popup. The session must never approve. Contractors build batch steps; partyline commits steps that pass and never pushes. Loops has the full workflow. The pointer arrives through the prompt hook or the managed repository memory block. A Codex or Gemini session with neither a trusted hook nor that block gets no pointer.

Chat window controls

In the chat popup, ctrl-o docks a temporary sidebar beside your sessions; ctrl-t pins it as a tab. Docking preserves existing agent pane numbers, refuses active Phone layout, and requires enough space. Drag the native split divider to resize. In chat, click an @ suggestion to insert it without sending. The sidebar is excluded from workspace resume; the pre-dock agent layout is kept. Agent terminal input and mouse selection are unchanged.