Added

  • zurm-server — standalone headless PTY session daemon (cmd/zurm-server). Sessions persist independently of the zurm GUI. Communicates over a Unix socket using a length-prefixed binary protocol (zserver package). Zero Ebitengine dependency.

  • Per-pane opt-in server mode — server-backed panes are created explicitly. Regular tabs/panes always use a local PTY. No global toggle.

  • Keybindings:

  • Cmd+Shift+B — new server tab

  • Cmd+Shift+H — split horizontal (server pane)

  • Cmd+Shift+V — split vertical (server pane)

  • Command palette: “New Server Tab”, “Split Horizontal (Server)”, “Split Vertical (Server)”, “Attach to Server Session”

  • Auto-start — zurm-server spawns automatically on first server pane creation. Located next to the zurm binary or via PATH. Detached via Setsid; survives GUI close. Log: ~/.config/zurm/server.log.

  • CLI flags:

  • --list-sessions / -ls — print active server sessions and exit

  • --attach <id> / -a <id> — attach to a server session by ID or short prefix (Docker-style matching)

  • Status bar: [SERVER] indicator (cyan) when the focused pane is backed by zurm-server.

  • Output replay: 64KB ring buffer per session. On reattach, recent terminal output is replayed so you see context immediately.

  • [server] config section:

  • address — Unix socket path (default ~/.config/zurm/server.sock)

  • binary — path to zurm-server executable (default: sibling of zurm or PATH)

  • make build-server — Makefile target for the server binary.

Changed

  • Server sessions are NOT saved in session.json. Local session save/restore is completely independent of zurm-server.

  • pane.New() reverts to original 5-parameter signature. Server panes use pane.NewServer() exclusively.

  • PtyBackend interface in terminal/ abstracts PTY I/O. PTYManager (Mode A) and ServerBackend (Mode B) both implement it.