The jumplist shows every agent session in one place and jumps you to the one you pick: the right terminal window and tmux pane, or the browser for remote work like CI runs. It is a floating panel that takes keys while your app keeps focus, and dismisses on esc, the shortcut, or a click elsewhere. Drag any background area to reposition it, like Alfred or Raycast. It remembers its position across opens and recenters if that spot is offscreen, for example after a display is unplugged.
A bold title means unread. The amber mark alone means the session is asking for you.
The line under each name is the latest line of the exchange. While a session works you see your prompt; once it finishes, asks, or fails you see its reply. The preview on the right highlights the same line with the colored bullet, so the list and the preview always agree.
The icon on each row shows the originator, taken from the event's agent
field (see the data model). Each surface
maps the agent name to its glyph. Known agents today, with the fallback for everything else:
| Icon | Agent |
|---|---|
claude - Claude Code | |
opencode - OpenCode | |
codex - Codex | |
| π | pi - pi |
cursor - Cursor's own agent (the isometric-cube mark alone) | |
cursor/<agent> - an agent hosted in Cursor's terminal (e.g. cursor/claude): the Cursor mark with the sub-agent's glyph badged bottom-right in a clear halo | |
vscode/<agent> - an agent hosted in VS Code's terminal (e.g. vscode/claude): the VS Code ribbon mark with the sub-agent's glyph badged bottom-right in a clear halo | |
github - GitHub Actions | |
anything else (script, custom agents) - a plain ring, the fallback |
The top of the panel is a search bar and it is always focused: any printable key filters the list
live, matching the name, the prompt breadcrumb, the reply, and the agent. A query starting with
# switches to tag mode - #demo shows only sessions carrying that tag
(case-insensitive, exact match); clearing it restores all. Every open starts with an empty
search. Any additional filters apply underneath the search, to this
list and the menu bar dropdown alike.
Rows keep the order you work in (most recently engaged first, like the app switcher), with pinned sessions first; status does not reorder them. The panel opens with the topmost unread row selected, and selection stays topmost-unread within the filtered rows.
Hiding a session with ⌃X drops it from the list until it speaks again. To bring one
back before then, the jumplist mirrors the mobile app: a collapsed Hidden (N) divider sits at
the bottom of the list, below every visible row. It is always shown once the board has a session,
Hidden (0) included, so it is always clear whether a session is set aside - a missing row is
otherwise a mystery. Hidden (0) is inert (no chevron, nothing to expand). With a count, select
it and press ↩ (or click it) to expand:
the hidden rows appear beneath it, dimmed and marked with an eye-slash. ⌃X on a hidden
row unhides it - the same key that hid it, reversed (it fires the show event) -
and it rejoins the list above. Press ↩ on the divider again to collapse. A live search
reaches into the hidden rows too, revealing the section when a match is tucked inside it, so a
hidden session is never lost - only set aside.
Pin a session to keep it at the top: pinned sessions sort before the rest (engagement order within each group) and carry a quiet pin mark on the row and in the menu bar dropdown. Order is a hub decision: the app shows the order the hub sends and does not re-sort locally. Pin or unpin the selected row with ⌃P; pins survive agent activity and hub restarts.
Right-click any row for the same actions as a menu: Pin/Unpin, Rename, Hide (or Unhide on a revealed hidden row), and Remove.
The right pane is the last exchange, on black like the terminal it quotes: your prompt, then the
agent's reply. The bullet is amber for asks and blue for finished work. While a session works you
see a live ✻ Working… line with the runtime. The line above the footer says exactly
where ↩ takes you, for example "Jump to iTerm (tmux dwmkerr:1) on localhost".
Typing is searching, so list commands use the control key:
| Keys | Action |
|---|---|
| ↩ | Jump to the selected session (marks it seen) |
| ⌃J ⌃K or arrows | Down / up |
| ⌃1 ⌃2 … | Jump directly to a session |
| ⇥ | Next unread |
| ⌃P | Pin / unpin the selected session (pinned sessions sort first) |
| ⌃R | Rename session (your own name for it; empty clears) |
| ⌃X | Hide until the session speaks again; on a row in the expanded Hidden section, unhide it |
| ⌃⌫ | Remove now |
| ⌘, | Open Settings (same as the footer cog) |
| ⌘+ ⌘− ⌘0 | Zoom the jumplist in / out / reset (0.8×-1.6×, persists) |
| esc | Clear the search, then close |
Zoom scales the whole panel, geometry and text together, and text stays crisp for dense screens or recordings. The footer keys strip stays unchanged; ⌘+/−/0 are universal conventions and the strip is already full.