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

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

KeysAction
Ctrl+Shift+N / Ctrl+Shift+Tnew workspace / 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

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.