Generated from a competitor-analysis pass (TerminalConductor, May 2026).
Summary
Let users tag sessions into named groups and toggle a broadcast mode where keystrokes typed into the active session are mirrored to every other session in the group.
Motivation
Classic multi-terminal use cases we currently lack:
- "Kick off
npm test in all three services at once."
- "Restart all the agents."
- "Send the same prompt to Claude + Codex side-by-side for comparison."
- "Apply the same
git pull across all worktrees."
tmux has it. Windows Terminal has it. TerminalConductor has it. We have SessionGroup as a model already but no real grouping or broadcast wired up.
Proposed behaviour
Data model
- Extend
SessionGroup (already in Models/SessionGroup.cs): Id, Name, Color, SessionIds: List<string>.
AppState.Groups: List<SessionGroup> persisted to state.json.
- Sessions can belong to at most one group (start simple — multi-group later if needed).
Sidebar UI
- Group header row above its member sessions; collapsible with
▼/▶.
- Member sessions get a 2px left border in the group color (in addition to their own accent stripe).
- Right-click a session → "Add to group…" submenu (existing groups or "New group…").
- Right-click a group header → Rename / Change color / Broadcast input / Delete group.
Broadcast mode
- Toggle per-group, NOT persisted across runs (deliberate — broadcast is a deliberate action).
- When ON, a banner appears above the active terminal: "Broadcasting to '' (3 sessions)" with a
[Stop broadcast] button.
- Mechanism: hook in
TerminalBridge.WriteInput — for the active session, also forward to each other group member's bridge.
- Member tabs get a distinct 2px outer ring in the group color (using the same active-ring border the active session uses, but recoloured to the group accent).
Safety
- Broadcast OFF automatically when:
- Active session leaves the group
- The group is deleted
- App closes (state not persisted)
- Each session receives keystrokes individually;
\r is NOT auto-injected. User presses Enter once, every group member receives that Enter.
Out of scope
- Conditional broadcast (different command per host) — broadcast = exact same bytes.
- Multi-group membership.
- Per-session opt-out within a broadcast (just remove from the group).
Inspiration
TerminalConductor's "Group broadcast" + manual groups. See https://terminalconductor.com/.
Summary
Let users tag sessions into named groups and toggle a broadcast mode where keystrokes typed into the active session are mirrored to every other session in the group.
Motivation
Classic multi-terminal use cases we currently lack:
npm testin all three services at once."git pullacross all worktrees."tmux has it. Windows Terminal has it. TerminalConductor has it. We have
SessionGroupas a model already but no real grouping or broadcast wired up.Proposed behaviour
Data model
SessionGroup(already inModels/SessionGroup.cs):Id,Name,Color,SessionIds: List<string>.AppState.Groups: List<SessionGroup>persisted tostate.json.Sidebar UI
▼/▶.Broadcast mode
[Stop broadcast]button.TerminalBridge.WriteInput— for the active session, also forward to each other group member's bridge.Safety
\ris NOT auto-injected. User presses Enter once, every group member receives that Enter.Out of scope
Inspiration
TerminalConductor's "Group broadcast" + manual groups. See https://terminalconductor.com/.