one surface
One box that finds everything.
The switcher is kolu’s unified search surface. Press Cmd/Ctrl + K and type — a branch, a repo, a host, a command — without first deciding which drawer to open. Terminals, hosts, and commands share one index and one muscle memory; the extra chords are deep links into scoped views of the same surface, not separate apps.
What opens at the root
At the empty root you see:
- Recent — the three terminals you were just in (client visit trail —
last time each tile became active), interleaved across every connected
host — except the tile that is already active. Rank is
max(your last visit, server activity), so a fresh browser still orders by agent/output clocks until you navigate; after that your own trail wins over background chatter. Cross-host rows show the same host chip as search hits. Because the active tile is omitted and selection starts on the first Recent row, ⌘K then Enter toggles between your last two terminals (including across hosts). - Hosts — every machine in the pool (when more than local is configured),
quiet when healthy;
activeonly for the canvas host. - Terminals section — the Terminals group (⌘⇧K) and New terminal.
- Further command sections — Active Terminal, Canvas, UI, Help — as usual, not collapsed into a single “Commands” band until you type.
Type to search across every kind at once. Matching is multi-token: every
whitespace-separated word must appear somewhere in the row’s corpus (repo,
branch, intent, agent, cwd, host label, command name…). Token order does not
matter — kolu auth finds the same row as auth kolu.
Terminals across every connected host
The switcher indexes live top-level terminals on every connected host in the padi pool — not only the machine whose canvas you are viewing. Split children (terminals with a parent) are omitted: activating the parent tile brings its splits with it, same as the Dock.
- Plain shells appear (no agent required), with the same state pip language as the Dock (shell mark / idle paint).
- Order is fleet-wide
max(visit, activity)(visit = last time you made the tile active; activity is the Dock’s reprojected clock). Parked rows the activity window would hide are dropped here too. - Cross-host rows carry one host chip in the right rail — the same
identity hue + connection-status language as the chrome-bar host strip — so
srid@buildervs local is obvious without repeating the name in the context line. Selecting one switches the canvas to that host and activates the terminal in one step.
Browse Terminals: flat list, host-grouped headers
⌘⇧K → Terminals shows every connected host’s terminals immediately —
no host drill required. The list is visually grouped under small-caps
headers (local · 3 terminals, zest · 6 terminals); active host’s group is
first; within a group, recency order. Hosts with zero terminals still get a
header so the fleet map is complete.
Host-scoping is optional. Click a host header (or use the dock search
icon) to narrow to that host; the breadcrumb becomes
Commands › Terminals › zest. Backspace on an empty query pops a level.
Typing filters the whole list flat across every host (host chips still mark foreign rows). At the root, the same multi-token match finds terminals without entering Terminals first.
The active host’s Dock remains the always-on navigator for the machine you are looking at; the switcher is the jump path over the whole fleet.
How results rank
With a non-empty query, hits are ordered by kind first, not by how close the string match is:
| Priority | Kind | Tie-break |
|---|---|---|
| 1 | Terminals | Recency — max(last client visit, server/Dock activity) |
| 2 | Hosts | Pool order |
| 3 | Commands | Existing section order |
So a branch name outranks a host that happens to share a substring, and both
outrank a command. There are no prefix sigils (> commands, @ hosts) —
scoping is the existing drill-in path (below), not a mode character.
Deep-link chords
| Chord / control | Opens |
|---|---|
| Mod + K | Root — search everything |
| Mod + Shift + K | Terminals — all hosts’ terminals under host headers |
| Dock search icon | Terminals › active host — only that machine’s terminals |
| Mod + Shift + H | Hosts — same host rows as root (switch canvas host) |
Mod is Cmd on macOS and Ctrl on Linux and Windows. The full chord table lives under Keyboard shortcuts.
Scoped views
Deep links do not leave the switcher — they drill in. Breadcrumbs show the path; Backspace on an empty query (or the breadcrumb) pops one level back to root. Escape closes the whole surface.
Terminals (⌘⇧K / dock search)
⌘⇧K lands on Terminals with every connected host already expanded under headers — type to filter, or click a header to scope. The dock search icon opens Terminals › the host you are viewing (host-scoped). Selecting a row switches host if needed and activates the terminal.
Hosts (⌘⇧H)
⌘⇧H opens the Hosts scope — the same host rows as the root index (one source of truth; there is no separate “Switch host” list). Selecting a host re-keys the canvas with no reload — same as the host strip.
Host status text is quiet by default:
| Condition | Context text |
|---|---|
| Canvas’s current host | active |
| Connected, not active | (none — connected is the default) |
| Warming / failed / removed | connecting / unreachable / removed |
The connection dot still carries health color on every row.
Reading a row
Every result kind paints the same four slots so a mixed list stays scannable:
- Lead — agent-state pip (terminal; plain shells get the shell mark), connection dot (host), or glyph (command).
- Identity — for terminals, the same headline as the Dock: repo
colour eyebrow + intent first line when one is set, otherwise the
branch. Host rows show
user@host; commands show the command name. Matched tokens bold in place. - Context — one truncating line. When the identity is the intent, the branch sits here; otherwise agent summary / foreground (Dock subline). Host status or command description for other kinds. Never carries the host name on a terminal row.
- Right rail — host chip (only when the terminal is on a non-active
host — hue ring + label), recency, keybind, drill chevron, and a kind tag
(
term/host/cmd) only at the mixed root.
What this is not
- The dock is still the always-visible navigator down the left edge — glanceable without opening anything. The switcher is the jump / search path over the same terminal set.
- The host strip is still ambient multi-host status; ⌘K does not replace it.
- Sleep, restore, and session memory live under Sessions; the switcher only finds terminals that already exist on connected hosts.