Skip to content

Add session groups with broadcast-input support #59

@AThraen

Description

@AThraen

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/.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions