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.
$ ptlnOpens 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| Flag | Does what |
|---|---|
--worktree <name> | create a git worktree on a new branch <name> and start the session in it |
--with-state | with --worktree: copy the current checkout's uncommitted changes and untracked files into the new worktree |
--keep-going N | Claude 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.
| Key | Does what |
|---|---|
arrows · j / k · g / G | move · jump to the top or bottom |
| PgUp / PgDn | page the launcher list |
/ · s · R | search · cycle the sort order (last used, oldest, project) · refresh |
⏎ | open the highlighted session, after a permission-mode picker |
space | select several; ⏎ opens them in one terminal |
o | open the session in a new partyline tab, without the permission-mode picker |
N · ctrl-n · n | new session · new session with permissions bypassed · new session with options |
| | pick two sessions to show side by side |
p · r · d | pin · rename · show git diff for the session's repository |
x | delete (below) |
a · t · D · ? · q | show 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.
| Key | Does what |
|---|---|
n · N · t | new session with options · new session, asking for the engine and permissions · shell window |
o | the session manager |
r | rename the highlighted session (on Sessions); ⏎ saves, an empty name clears it, esc cancels |
c | the 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 |
k | Open 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. |
l | the 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. |
a | the 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 |
w | fork this session into a git worktree |
g | arm 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 · Q | close 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
| Command | Does 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)
| Key | Action |
|---|---|
| (none) | prefix None: no tmux prefix |
C-\ | run-shell 'ptln tmux --menu', the menu popup |
M-1 … M-9 | select-window -t N |
WheelUpPane | full-screen apps keep the wheel; otherwise copy-mode -e; send -M |
MouseDragEnd1Pane | copy-pipe-no-clear <clipboard>, then tmux --copied (fallback copy-selection-no-clear) |
Enter | copy and toast, when a clipboard tool exists |
MouseDown1Pane | select-pane; send -X clear-selection |
MouseDown1Status | a window name selects that window; a contractor chip opens Loops on its Contractors tab with that contractor selected; other clicks do nothing |
MouseUp1Pane | send -X cancel: a click returns to live |
printable ASCII 33-126 except \ | leave copy mode, then type the character |
Space, BSpace | leave 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.
| Key | Action |
|---|---|
↑ ← / ↓ → | 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-9 | focus that window |
n | New/Run popup |
N | asks engine and permissions |
t | shell window |
o | launcher popup |
a | approval popup for loops waiting on you |
l | open the Loops popup |
, | loop settings |
k | Loops on its Contractors tab, first contractor selected |
c | the chat room as a popup |
r | on Sessions: rename the highlighted session (⏎ saves, empty clears, esc or ctrl-c cancels, ctrl-u clears the field); on Commands: relay settings |
p | phone setup |
w | worktree popup |
g | keep-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 |
q | detach |
Q (twice) | save, then quit everything |
| any other key, including the arrows | cancels an armed confirm |
Per-session popups and modals, tmux mode
| Key | Action |
|---|---|
1 / 2 | New/Run: AI session / blank terminal |
f / l / r | Worktree: fork / list / remove |
typed line; q or empty cancels | stdin forms: popup forms; cancel with no tty |
y / n / ⏎ / esc / q | confirmation: yes / no / default / cancel |
esc, ctrl-c, ctrl-\ cancel; ⏎; letters folded to lower case | choice form: single-key read |
digits; N ⏎ for long lists; ↑↓ scroll; extra letters; esc / q / ctrl-c / ctrl-\ / ⏎ with nothing typed | picker form: pick |
⏎, backspace, ctrl-u; esc / ctrl-c / ctrl-; a lone q cancels on ⏎ | text form: text field |
y, n, ⏎, esc / q | confirmation form: yes / no |
| any key | note form: dismiss |
1 / d / r / e | Recover: clone / relocate / clone a URL / recreate empty |
1-9 / p / q | Empty state: adopt a home / type a path / not now |
esc / q / ctrl-c / ctrl-\ | wait line: cancel |
Launcher popup
| Key | Action |
|---|---|
↑ ↓, j k | move; ↑↓ scroll the detail pane when focused (j/k still move) |
| PgUp / PgDn | page |
→ / ← | expand / collapse a project; focus / unfocus detail |
g / G | top / bottom |
/, then type, backspace, ⏎, esc | search |
r, then type, ⏎, esc | rename |
a | show all |
s | cycle sort |
R | refresh |
| space | mark several |
p | pin |
x, then y / ⏎ | delete (any other key cancels) |
o | new terminal tab |
tab, l, h | focus / unfocus detail |
d | diff in $PAGER |
t | cycle theme |
n / N / ctrl-n | New/Run menu / quick new / quick new with bypass |
| | guided split |
D | docs in the browser |
? | help overlay; any key closes |
q, ctrl-c | quit (closes popup) |
⏎ | header toggles; opens the permission picker, or recovers a gone directory |
↑↓←→, h l, ⏎, q, esc | permission picker; Enter twice confirms a dangerous mode; custom flags field |
| esc | back to the session you came from |
Welcome
| Key | Action |
|---|---|
↑ ↓, j k | move |
⏎ | open the selected door |
n / / | new session / find a session |
esc / q / ctrl-c | switchboard when there are sessions, else quit |
| ctrl-\ | ignored |
Boot splash
| Key | Action |
|---|---|
| any key, including ⏎ / esc / q / ctrl-c / ctrl-\ | ignored; boot completion closes the screen |
Chat
| Key | Action |
|---|---|
⏎ | send; after a \, a new line instead |
| Shift-⏎, Alt-⏎, Ctrl-⏎ | new line |
←/→, ctrl-b / ctrl-f | move a character |
Home/End, ctrl-a / ctrl-e | line start / end |
Option-←/→, ESC b / ESC f, Ctrl-←/→ | move a word |
| ↑ / ↓ | move between lines, then history |
| Backspace; Delete | delete |
ctrl-d | delete forward; on an empty line, leave |
ctrl-w, Option-Backspace, modified Backspace | delete a word back |
Alt-d | delete a word forward |
ctrl-u / ctrl-k | kill to start / end |
ctrl-z, ctrl-_ | undo |
Tab | complete |
| PgUp / PgDn | scroll chat history |
| Wheel up/down | scroll chat history three lines |
| Left drag | select cells and copy on release |
| Esc while scrolled back | back to the newest messages (before any other Esc) |
ctrl-t | pin the popup as a tab; in the tab, close it |
ctrl-r; again for older; esc or ctrl-c cancels | history search |
ctrl-g | $VISUAL / $EDITOR, falling back to vi |
| Esc Esc within 1 s | clear the input |
| Esc while browsing history | back to the draft |
ctrl-l | clear the screen |
ctrl-c | leave |
| bracketed paste | one edit |
/add /remove (/rm) /who /stop /go /clear /help | room 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.
| Key | Action |
|---|---|
← →, h l | move between columns |
↑ ↓, j k | move between cards |
⏎ | show rounds and findings; on a building or reviewing card, select its contractor on the Contractors tab |
a | open approvals for a row that needs you; on a loop waiting for settings, open the settings |
s | open the selected run’s approval popup to confirm stopping |
d | delete 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 |
r | cycle the repository filter: all repositories, then each in turn |
, | loop settings |
a · s · ⏎ in an open card | approve · stop · back to the board; ↑↓ scroll |
| esc | back from details, otherwise close |
q, ctrl-c | close (q in details returns to the board) |
| PgUp / PgDn | scroll details |
Approval popup
| Key | Action |
|---|---|
↑ ↓, j k | move between runs or scroll the full brief |
⏎ | open the selected run |
a / r | approve / reject with a note; type the displayed confirmation code |
f / d | fix / dismiss a dispute, after confirmation |
x | reverse the arbiter's dismissal of a finding, after confirmation |
v | full brief |
s | stop the run, after confirmation |
PgUp / PgDn, space | scroll the summary or brief |
esc / q / ctrl-c | back / close |
typed note, ⏎, backspace | edit 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.