Skip to main content

Component Architecture

MonoTerm consists of four main components working in a carefully designed pipeline.

System Overview

╔════════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  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.
╔════════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  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.
╔════════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  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.
╔════════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  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.
╔════════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  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.
╔════════════════════════════════════════════════════════════════════════╗
β•‘                                                                        β•‘
β•‘  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

ComponentTechnologyPurpose
PTY DaemonRust Sidecar BinarySession persistence, crash isolation
SessionActorRust + MPSC ChannelsLock-free session management
VTE ParserAlacritty (Rust)Native-speed escape sequence parsing
Rendererxterm.js + WebGLGPU-accelerated display
IPCTauri EventsEfficient frontend-backend communication