README.md

signaltty — native Linux workspace for parallel AI coding agents

A terminal multiplexer designed for agent-driven development: a persistent session server owns PTYs and state; a CLI and a native GTK4/libadwaita GUI attach as pure clients. Closing the UI never kills running agents.

Status: Phase 4 (extensibility) implemented and tested. All MVP phases (multiplexer core, agent awareness, native GUI, executable plugins) are done.

Quick start

bash
1cargo build --release
2./target/debug/signaltty daemon # start the session server
3./target/debug/signaltty integration install all # hook shims (codex/claude/opencode/cursor)
4./target/debug/signaltty new --cwd ~/code/project -- codex
5./target/debug/signaltty new --cwd ~/code/project -- claude
6./target/debug/signaltty pane read <pane-id>
7./target/debug/signaltty pane attach <pane-id> # Ctrl+] to detach
8./target/debug/signaltty wait --pane <id> --until done
9./target/debug/signaltty pane resume <pane-id> # after restart, via native resume

Note: codex trusts new hooks interactively ("Trust all and continue" once per hook command); codex exec needs --dangerously-bypass-hook-trust to fire untrusted hooks.

Global flags: --socket <path> (default $XDG_RUNTIME_DIR/signaltty/signaltty.sock), --json (machine-readable result object; resource-creating commands return opaque ids).

Architecture

text
1signaltty-server ── owns PTYs, processes, workspaces, scrollback,
2 lifecycle, attention, persistence, IPC
3signaltty ───────── CLI client (same API as the GUI)
4signaltty-gui ───── GTK4/libadwaita GUI: sidebar, tabs, splits,
5 VTE panes, attention rings, desktop notifications

GUI system deps: libgtk-4-dev libadwaita-1-dev libvte-2.91-gtk4-dev (libadwaita ≥ 1.7; GUI crate only; server/CLI build without them).

Install the desktop app

bash
1./contrib/install-desktop.sh install

This builds the GUI in release mode and installs signaltty-gui in ~/.local/bin, the desktop entry in ~/.local/share/applications, the AppStream metadata in ~/.local/share/metainfo, and both icons in ~/.local/share/icons/hicolor/scalable/apps. Make sure ~/.local/bin is on the desktop session's PATH, then sign out and back in if the launcher does not refresh. The GUI connects to the signaltty server.

To remove these files:

bash
1./contrib/install-desktop.sh uninstall

To close a workspace, use the close button on its sidebar row, or select it and choose Close Workspace from the main menu. Confirming stops its running terminals and agents. Closing the GUI window leaves them running.

GUI shortcuts (Ctrl+Shift, so plain Ctrl chords reach the terminal):

KeysAction
Ctrl+Shift+N / Ctrl+Shift+Tnew workspace (folder · name · agent) / new tab
Ctrl+Shift+E / Ctrl+Shift+Osplit right / split down
Ctrl+Shift+Wclose pane
Ctrl+Shift+Jjump to the next pane that needs you
Alt+1…9, Ctrl+PgUp/PgDnswitch tabs
F9 / F10toggle sidebar / main menu

Server → Workspace → Tab → Pane. Lifecycle (unknown/working/blocked/ done/idle/failed/exited) and attention (none/unread/input_required/ permission_required/warning/error) are independent first-class axes.

Docs: architecture · data model · lifecycle & attention · PTY · terminal research · GTK decision · agents · IPC schema · persistence · security · crates · roadmap & risks · plugins · ADRs.

Plugins live in ~/.config/signaltty/plugins/<name>/plugin.toml (event hooks + runnable commands); examples in examples/plugins/, orchestration recipe in examples/workflows/.

Layout

text
1crates/signaltty-core domain model (toolkit/async/OS-free)
2crates/signaltty-proto signaltty/1 IPC envelopes, methods, events
3crates/signaltty-term TerminalBackend trait, headless vt100 backend,
4 OSC 9/99/777 scanner, sanitizers
5crates/signaltty-agent AgentAdapter trait + codex/claude/opencode/
6 cursor/generic adapters, hook classification,
7 session identity, resume commands
8crates/signaltty-server daemon: PTY manager, router, events, snapshots
9crates/signaltty-cli CLI client incl. interactive attach
10crates/signaltty-gui native GUI (sidebar/tabs/splits/VTE,
11 attention rings, next-unread, notifications)
12crates/signaltty-testkit hermetic-server test harness (real PTYs)
13contrib/ systemd user unit and desktop integration

Run as a user service (recommended)

bash
1mkdir -p ~/.config/systemd/user
2cp contrib/signaltty-server.service ~/.config/systemd/user/
3systemctl --user daemon-reload
4systemctl --user enable --now signaltty-server

Development

bash
1cargo build --workspace
2cargo test --workspace # 60+ tests: unit + real-PTY integration + CLI e2e
3cargo clippy --workspace --all-targets

Design rule

The server owns the processes, the terminal backend renders terminal state, agent adapters provide semantic agent state, notifications describe human attention, and the UI helps the user find the work that needs them.