Skip to content

Workspace

A workspace is the outermost container a multiplexer groups its tabs and panes under — its “own visible space” a caller can switch to as a whole. It is the one tier cyber-mux treats as optional: herdr and WezTerm have a real Workspace level, tmux does not, and Zellij has a real session tier that a workspace placement cannot reach (see below). Everything below — tabs and panes — every multiplexer has.

Because the tier is optional, cyber-mux never invents it. A command that lands a pane in a workspace reports which one; a backend with no workspace tier reports nothing there, rather than a made-up name. That absence is the honest answer, and callers are expected to read it as one.

workspace is one of the four placements open (and worktree) accept, and it is the odd one out: pane:right, pane:down, and tab all add something inside the caller’s current space, but workspace opens a genuinely separate space and leaves the caller’s own untouched.

Where the tier is real and reachable, that is exactly what you get:

Placement herdr / WezTerm tmux Zellij
workspace a new workspace a new window a new tab
tab a new tab a new window a new tab

tmux has no level above its window, so workspace and tab both collapse to a new window — the finest own-visible-space tmux offers. This is why an open --at workspace on tmux still succeeds; it just cannot report a workspace, because there is no such tier to name.

Zellij is a different shape of the same problem: it does have a real session tier above the tab, but a pane id is scoped to the session that opened it, and cyber-mux’s pane target carries no session — so there is no session-crossing primitive for a workspace placement to use. workspace therefore collapses to a new tab in the ambient session, same outcome as tmux, for the opposite reason (a real tier it can’t reach, rather than no tier at all). Unlike tmux, though, Zellij still reports the occupied session — see below.

Two different facts both get called “workspace”, and cyber-mux keeps them apart:

  • Occupancywhich workspace a pane lives in. Reported as open’s workspace field. Every pane opened on a workspace-tier backend has one, whatever placement opened it. Zellij reports occupancy too — workspace carries the ambient $ZELLIJ_SESSION_NAME — even though a workspace placement can’t leave that session; occupancy and reachability are separate questions.
  • Bindinga git worktree tied to a workspace as a first-class record, the thing herdr’s UI groups a repo’s checkouts by. This is a stronger claim than occupancy, and only the worktree route produces it — Zellij, like tmux and WezTerm, never produces it.

A worktree opened at pane:right lives in the caller’s workspace while being bound to none: the pane has a workspace, the worktree is still ungrouped. Do not read a reported occupancy as proof a worktree was grouped — only the worktree capability grants that.

For a backend with no Workspace level, cyber-mux offers an opaque workspace group id instead — a tag stamped on the spaces one caller opens so they stay recognizable as a set afterwards. It is a convenience for grouping, not a tier: a group id is not a workspace, and open still reports its workspace field absent on tmux, tag or no tag. Where a real Workspace tier exists the tier already is the group, so the tag is ignored.

  • open --at workspace — open a separate workspace (a window on tmux, a tab in the ambient session on Zellij).
  • worktree — binds a git worktree to a workspace where the backend can; see Worktrees.
  • focus — beams the attached client to a pane across workspace and tab.
  • template save --workspace — widens a capture from one region to every tab of the workspace it sits in.
  • Multiplexers — which backends have the tier, and what each does without it.