Component Architecture
MonoTerm consists of four main components working in a carefully designed pipeline.System Overview
Copy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β MONOTERM ARCHITECTURE β
β β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β PTY DAEMON β β
β β (Separate Process) β β
β β β β
β β * Manages shell processes (bash, zsh, fish) β β
β β * Survives application crashes β β
β β * One daemon serves multiple terminals β β
β β β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β β Unix Socket β
β β (Raw PTY bytes) β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β RUST BACKEND (Tauri) β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β SessionActor β β β
β β β (Manages all terminal sessions) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β v β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β GridWorker β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββ β β β
β β β β Alacritty VTE Parser β β β β
β β β β (Interprets escape sequences) β β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββ β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β β Tauri Event β
β β (Grid Update) β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β TYPESCRIPT FRONTEND β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Grid Injector β β β
β β β (Receives updates, injects to display) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β v β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β xterm.js + WebGL β β β
β β β (GPU-accelerated rendering) β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Component 1: PTY Daemon
The PTY Daemon runs as a separate sidecar process from the main application.Copy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β PTY DAEMON β
β β
β Purpose: β
β * Manage shell processes (bash, zsh, fish) β
β * Provide session persistence across app restarts β
β * Isolate PTY management from UI process β
β β
β β
β Process Isolation: β
β β
β ββββββββββββββββββββ ββββββββββββββββββββ β
β β Main App β β PTY Daemon β β
β β (Tauri) β β (Sidecar) β β
β β β β β β
β β If app β β Daemon β β
β β crashes... β ββββΆ β keeps β β
β β β β running β β
β β X UI dies β β OK Shells β β
β β β β survive β β
β ββββββββββββββββββββ ββββββββββββββββββββ β
β β
β β
β Communication: β
β β
β βββββββββββββββ Unix Socket βββββββββββββββ β
β β Tauri β ββββββββββββββββββββΆ β Daemon β β
β β Backend β /tmp/pty-xxx.sock β β β
β βββββββββββββββ βββββββββββββββ β
β β
β * One socket per terminal session β
β * Bidirectional: read output, write input β
β * Raw bytes (no JSON overhead) β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Component 2: SessionActor (Rust Backend)
The SessionActor is the central coordinator using the Actor Model pattern.Copy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β SESSIONACTOR - Lock-Free Session Management β
β β
β β
β Design Pattern: Actor Model β
β β
β * Single point of ownership for all state β
β * No locks needed (MPSC message passing only) β
β * Commands processed sequentially β
β β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β SESSIONACTOR β β
β β β β
β β Owned State: β β
β β β β
β β sessions: { session_id βββΆ SessionState } β β
β β grid_workers: { session_id βββΆ GridWorker channel } β β
β β β β
β β β β
β β Commands Handled: β β
β β β β
β β * CreateSession βββΆ Start new terminal β β
β β * CloseSession βββΆ End terminal β β
β β * ResizeSession βββΆ Change dimensions β β
β β * WriteToPty βββΆ Send input to shell β β
β β * PtyData βββΆ Received output from shell β β
β β * GridAck βββΆ Flow control acknowledgment β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β Message Flow: β
β β
β Frontend SessionActor Workers β
β β β β β
β β CreateSession β β β
β β ββββββββββββββββββββββΆ β β β
β β β Spawn GridWorker β β
β β β ββββββββββββββββββββββΆ β β
β β β β β
β β WriteToPty β β β
β β ββββββββββββββββββββββΆ β β β
β β β Forward to PTY β β
β β β ββββββββββββββββββββΆ β β
β β β β β
β β β PtyData received β β
β β β ββββββββββββββββββββ β β
β β β Send to GridWorker β β
β β β ββββββββββββββββββββββΆ β β
β β β β β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Component 3: GridWorker + Alacritty VTE Parser
Each terminal session has its own GridWorker with an embedded VTE parser.Copy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β GRIDWORKER (One Per Terminal Session) β
β β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β GRIDWORKER β β
β β β β
β β Input Channel (MPSC) β β
β β β β
β β Receives: β β
β β * Data(bytes) - PTY output to process β β
β β * Resize(w,h) - Terminal size changed β β
β β * Ack - Frontend ready for more β β
β β β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β
β β β ALACRITTY VTE PARSER β β β
β β β β β β
β β β * State machine for escape sequences β β β
β β β * CSI sequence handling β β β
β β β * OSC command processing β β β
β β β * UTF-8 decoding β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β v β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Grid State (Terminal Content) β β β
β β β β β β
β β β * Cell contents (characters) β β β
β β β * Cell attributes (colors, styles) β β β
β β β * Cursor position β β β
β β β * Scrollback history β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β β β
β β Output: Grid Update (cells, cursor, DiffHint) β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β Why Alacritty VTE Parser? β
β β
β * Battle-tested in production terminal β
β * Excellent escape sequence compatibility β
β * Fast Rust implementation β
β * Well-maintained and documented β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Component 4: Grid Injector (TypeScript Frontend)
The frontend component that receives Grid Updates and injects them into xterm.js.Copy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β GRID INJECTOR β
β β
β β
β Purpose: β
β * Listen for Grid Update events from Rust β
β * Validate updates (EPOCH check) β
β * Inject cell data directly into xterm.js β
β * Send ACK back to Rust for flow control β
β β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β GRID INJECTOR β β
β β β β
β β Event Listener β β
β β β β
β β listen("pty-grid-{sessionId}") β β
β β β β β
β β v β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Epoch Validation β β β
β β β β β β
β β β if (update.epoch < currentEpoch) β β β
β β β βββΆ DISCARD (stale update) β β β
β β β β β β
β β β if (update.size != xterm.size) β β β
β β β βββΆ REQUEST RESIZE β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β v β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Direct Injection β β β
β β β β β β
β β β For each row in update: β β β
β β β Write cells directly to xterm.js β β β
β β β Set cursor position β β β
β β β Trigger WebGL refresh β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β
β β v β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Send ACK β β β
β β β β β β
β β β invoke("grid_ack", { sessionId }) β β β
β β β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Complete Data Flow
The journey of a single command through the entire system.Copy
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β DATA FLOW: User Types "ls" and Presses Enter β
β β
β β
β ββββββββββββ β
β β User β β
β β Keyboard β β
β ββββββ¬ββββββ β
β β β
β β 1. Keypress events: 'l', 's', 'Enter' β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β xterm.js β β
β β Captures keypress, sends to backend β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 2. invoke("write_to_pty", { data: "ls\n" }) β
β β β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Tauri Backend (SessionActor) β β
β β Forwards to PTY Daemon β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 3. Write "ls\n" to Unix socket β
β β β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β PTY Daemon β β
β β Sends to shell, shell executes "ls" β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 4. Shell output: "file1.txt\nfile2.txt\n$ " β
β β β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Tauri Backend (SessionActor) β β
β β Receives PTY data, sends to GridWorker β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 5. MPSC Message: Data(bytes) β
β β β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β GridWorker + Alacritty VTE Parser β β
β β Parse escape sequences, update grid state β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 6. emit("pty-grid-xxx", GridUpdate) β
β β β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Grid Injector β β
β β Inject cells directly into xterm.js β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 7. Direct write to xterm.js internal structures β
β β β
β v β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β xterm.js + WebGL β β
β β GPU-accelerated rendering β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
β β β
β 8. User sees "file1.txt\nfile2.txt\n$ " β
β β β
β v β
β ββββββββββββ β
β β Display β β
β ββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Technologies
| Component | Technology | Purpose |
|---|---|---|
| PTY Daemon | Rust Sidecar Binary | Session persistence, crash isolation |
| SessionActor | Rust + MPSC Channels | Lock-free session management |
| VTE Parser | Alacritty (Rust) | Native-speed escape sequence parsing |
| Renderer | xterm.js + WebGL | GPU-accelerated display |
| IPC | Tauri Events | Efficient frontend-backend communication |