vmux
AppsvmuxPhone

Workspace

Hosts list, sessions canvas, edge-pull window switching, and breadcrumb navigation.

The two screens

vmuxPhone has two top-level screens:

  • Host list — visible whenever no terminal session is open. Add, edit, and delete hosts here.
  • Terminal view — visible whenever at least one session is active. Hosts the embedded keyboard and the round menu button.

The app moves between them automatically. Tapping a host in the host list opens its terminal. Disconnecting the last open session returns you to the host list.

The host list

The host list is a SwiftUI NavigationStack with two sections:

SectionContents
Saved HostsEvery host you have created. Each row shows the Display Title, the Destination (user@host:port), and a Subtitle that summarizes auth and transport.
SecurityA single row, Device Key, that opens the SSH key manager.

When the list is empty, vmuxPhone shows an ContentUnavailableView with No Hosts Yet — Add an SSH or Mosh destination to start a terminal session.

Row actions

  • Tap a row — opens or selects the matching window. If a session is already alive for the host, the workspace switches to it; otherwise it creates a new window and connects.
  • Swipe leftward — reveals Edit (blue) and Delete (destructive). Edit opens the form pre-filled. Delete removes the host and the Keychain password in one step.

Toolbar

The top-right of the host list has a single + button that opens the empty host editor. There is no global menu on the host list — settings are reachable from inside an open terminal session.

Multi-window workspace

vmuxPhone supports multiple open windows. Each window owns its own terminal session, its own bridge, and its own input controller. Switching between windows does not interrupt their sessions — output continues in the background.

The selected window is the one drawn on screen. Inactive windows still receive output, accumulate scrollback, post Live Activity updates, and trigger notifications when the bell rings. The unread badge on inactive windows is what lets you find the one that has news.

Open another window

Three ways:

  1. Edge-pull from either side of the terminal — drag from the inner edge inward; if you are already at the end of the window list, you see a Release to choose a host for another terminal window ghost surface.
  2. Round menu (top-right) → New Window… — opens the host picker sheet directly.
  3. Sessions canvas → + — open the canvas (described below) and tap the + button.

The host picker sheet has a Continue Current Host quick-action at the top, then the full list of saved hosts in a search-filtered list.

Edge-pull gesture

Drag from the leading or trailing 28-point hot zone inward. While dragging:

  • The current terminal slides in the direction of the drag.
  • A preview of the destination — either the previous/next window or the New Window ghost — slides in from the opposite edge.
  • A travel ratio of about 72% of the screen width is the maximum preview reach.

Releasing past about 84 points commits the navigation; dropping short of that animates back. Reduce Motion in iOS Accessibility shortens the spring animation to a quick ease-out.

Sessions canvas

The Sessions canvas is a sheet that shows every open window as a card. Open it from the round menu → Sessions…. Each card displays:

  • The window's current title (set by the remote shell or the host label).
  • The destination string (user@host:port).
  • A colored status dot (green connected, orange connecting, gray disconnected, red failed).
  • An orange unread dot if the window has new output you have not seen yet.

Tap a card to switch to that window. Tap the × button on a card to close that window — vmuxPhone disconnects the session, removes the card, and updates the snapshot store.

The canvas's + button opens the host picker sheet so you can spawn another window without leaving the canvas.

When the active window connects to a host using a structured-scene transport (vmux, or tmux when the feature flag is on), a breadcrumb bar appears at the top of the terminal. The bar reads from left to right:

session-name > tab-title > pane-title

The session name is fixed for that connection. Tabs and panes are picker chips — tap them to open a popover that lists every tab and pane in the active session. A shared session badge appears next to the session name when more than one client is attached to the same tmux session.

The bar also surfaces structural-op buttons (new tab, split pane, close pane, close tab) when the transport supports them. tmux is read-only in the current release, so the structural buttons are hidden on tmux sessions; vmux supports the full set.

For SSH, Mosh, Telnet, and ET sessions there is no breadcrumb bar — there is only one pane.

Status line

The terminal toolbar menu has a Current Window section that shows three lines:

  1. The window's title (set by \e]2;...\a from the remote, or the host label if the remote has not set one).
  2. The destination string.
  3. The current status text.

The status text mirrors the rules used by Live Activities and Mosh on iPhone: Connected, Connecting…, Background, Paused, Reconnecting…, or a failure reason.

Persistence

vmuxPhone snapshots the workspace to UserDefaults whenever you open, close, or switch a window. The snapshot stores the window IDs and the host ID each window was attached to.

On the next launch, vmuxPhone restores the workspace by:

  1. Loading the snapshot.
  2. Finding each window's host in the host store.
  3. Re-creating one PhoneTerminalWindow per snapshot entry.
  4. Selecting the same window that was active when you closed.

The session itself is not persisted — every restored window starts disconnected and connects on first frame. Scrollback is gone. Mosh resume tokens do not survive a full app restart, only background suspensions.

If a saved host has been deleted between launches, the snapshot entry for that host is silently dropped.

Disconnect everything

The terminal toolbar menu has a destructive Back to Hosts action. It calls disconnectAll() on the workspace — every window's session disconnects, the workspace snapshot is cleared, and you land back on the host list.

This is also what happens automatically when you close the last window from the canvas or the Close Window menu item.

There is no global search across windows in this release. The host picker sheet has a search bar that filters by display title and destination. The sessions canvas does not have a search yet.