- Shared PTY Sessions: Multiple clients connect to the exact same underlying shell (defaulting to your
$SHELLorzsh). - Daemon Architecture: Spin up one daemon, manage infinite terminal sessions across different ports seamlessly.
- Dynamic Resizing: Automatically calculates the "minimum viable dimension" across all active clients so your UI never breaks.
- TUI Pause Menu: Type
!>quickly to pause your client interaction and selectively disconnect, leaving everyone else perfectly undisturbed. - Lifecycle Management: Spin sessions
up, bring themdown, orkillthem completely via UUID. - wisp-desktop: COSMIC-native admin GUI (see below) for fleet visibility without scripting six CLI commands.
A Pop!_OS COSMIC-native desktop app for administering the daemon — same role
to wisp as Docker Desktop is to docker or Claude Desktop is to the Claude
CLI. Live fleet view, peer table with kick/refresh, system light/dark theme
following, transparency + blur, auto-following event tape. Built with
libcosmic (Rust + iced); lives at gui/.
just gui-run # debug build + run
just gui-release # optimized build (`./gui/target/release/wisp-desktop`)System dependencies and architecture notes are in
gui/README.md and
docs/adr/0002-cosmic-admin-gui.md.
git clone https://github.com/Fuabioo/wisp
cd wisp
go build -o wisp-
Start the daemon (usually in a background task or screen/tmux):
./wisp daemon
-
Start a new shared server session:
./wisp server --port 8082
-
See active sessions:
./wisp ps
-
Connect to a session (locally or remotely via your IP/Cloudflare Tunnel):
ssh -p 8082 localhost
-
Manage session state:
./wisp down <uuid> ./wisp up <uuid> ./wisp kill <uuid>
While in an active shared session, type !> rapidly to open the Pause Menu!
The category is usually called terminal session sharing (or "collaborative shell" / "shared PTY" at the technical level). Notable neighbors:
- tmate — the canonical reference. Forked from tmux, ships sessions through a public relay.
- upterm — Go daemon with a similar daemon-plus-fan-out-PTY shape; the closest architectural cousin to wisp.
- sshx — modern, browser-based take on the same idea.
- GNU
screen -xandtmux attach— the local-only ancestors. - Teleconsole (archived, by the Teleport authors) and Warp's collaboration mode (proprietary, GUI) round out the lineage.
What makes wisp distinct in that lineup: no relay (self-hosted, direct SSH), an in-band escape digraph (!>) into a bubbletea pause menu, and per-axis "minimum viable dimension" resize so a small client never breaks the others.
Wisp is really a controllable, observable, multi-attach PTY exposed over a clean RPC. That makes it a useful Lego brick beyond "two humans typing together":
- AI-agent observability. Spawn the agent inside a wisp session. Humans
wisp upto watch live, intervene through the pause menu, thendownwithout killing the agent — a DVR for autonomous coding agents. - Real-time peer steering for agents. Two (or more) agents attached to the same shell, coordinating like human pair-programmers — one drives, others observe and nudge. See the swarm orchestration TODO.
- Attended automation / approval gates. A CI job or deploy script runs in a wisp PTY; on a sensitive step it pauses and pings a human to attach and confirm. Pairs naturally with the planned hooks system.
- Classroom and livecoding broadcast. Many read-only attachees, one driver.
- Remote support / shoulder-surf debugging. A customer attaches their session, you join — like tmate, but on infrastructure you own.
- Recording infrastructure. Wrap any command in wisp to get asciinema-shaped output for free.
The strategic shape: wisp is best understood as a daemon-as-platform, where the RPC surface is a public API and other tools (agent harnesses, CI runners, support portals) embed sessions as a first-class primitive.
