Architecture Success Factors
The architectural decisions that enabled MonoTerm to solve the AI CLI flickering problem.The AI-Era Problem
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE FLICKERING PROBLEM β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Human Typing: AI Streaming: β
β ββββββββββββββ ββββββββββββββ β
β β
β ~5 characters/second ~50 updates/second β
β β
β ββββββββββββββββββββ ββββββββββββββββββββ β
β β H e l l o β β ****************β <ββ Flickering β
β β _ β β ****************β <ββ Reflow β
β β β β ****************β <ββ Eye strain β
β ββββββββββββββββββββ ββββββββββββββββββββ β
β β
β Native terminals optimized for the left. β
β AI CLI tools produce the right. β
β β
β MonoTerm recognized this gap and bridged it. β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The Architecture
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MONOTERM ARCHITECTURE β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β portable-pty (WezTerm) β β
β β ββββββββββββββββββββββββββββ β β
β β - Cross-platform PTY abstraction β β
β β - Production-proven in WezTerm β β
β β - Role: PTY communication only β β
β βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β v β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Alacritty VTE Parser β β
β β ββββββββββββββββββββββββββββ β β
β β - Complete VT100/ANSI parsing β β
β β - Production-proven in Alacritty β β
β β - Role: Parsing only (Grid storage) β β
β βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β v β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β AtomicState Layer β β
β β ββββββββββββββββββββββββββββ β β
β β - BSU/ESU detection (Mode 2026) β β
β β - Pseudo-BSU/ESU (cursor pattern heuristic) β β
β β - Frame synchronization β β
β β - Role: Frame boundary detection β β
β βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ β
β β β
β v IPC (Tauri emit) β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β xterm.js (Buffer Direct Injection) β β
β β ββββββββββββββββββββββββββββββββββββββ β β
β β - Parser BYPASSED β β
β β - Pure rendering machine β β
β β - WebGL GPU acceleration β β
β β - Role: Rendering only β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Tauri (Rust <-> WebView Bridge) β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Success Factor 1: Production-Proven Rust Crates
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STANDING ON GIANTS: RUST ECOSYSTEM β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β β β β β
β β portable-pty β β alacritty_terminal β β
β β β β β β
β β From: WezTerm β β From: Alacritty β β
β β Years: 5+ production β β Years: 7+ production β β
β β Edge cases: Solved β β Edge cases: Solved β β
β β β β β β
β ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β What this means: β β
β β β β
β β - Immediate production-level quality β β
β β - Years of PTY edge cases already handled β β
β β - Hundreds of VTE parsing edge cases already solved β β
β β - We focused on the NEW problem (frame synchronization) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Recognition: The best code is code we didn't have to write. β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Success Factor 2: xterm.js as Pure Renderer
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE KEY INSIGHT: BYPASS THE PARSER β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Typical xterm.js usage: β
β βββββββββββββββββββββββ β
β β
β PTY --> term.write(data) --> Parser (JS) --> Buffer --> Renderer β
β β β
β JavaScript β
β Single-threaded β
β GC pauses β
β β
β MonoTerm approach: β
β ββββββββββββββββββ β
β β
β PTY --> Alacritty VTE (Rust) --> Direct Injection --> Renderer β
β β β β
β Native Parser bypassed β
β Multi-threaded xterm.js renders only β
β No GC β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β xterm.js role transformation: β β
β β β β
β β Before: Parser + Renderer (heavy) β β
β β After: Renderer only (lightweight) β β
β β β β
β β xterm.js becomes a GPU rendering machine. β β
β β WebGL draws what Rust prepares. β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Success Factor 3: AtomicState at IPC Boundary
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE CRITICAL POSITION: WHERE FRAME SYNC HAPPENS β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β β
β Rust Backend β WebView Frontend β
β ββββββββββββββββββββββββββββββββββ β ββββββββββββββββββ β
β β β
β PTY --> VTE --> AtomicState βββββββββββΌβββββββββ> xterm.js β
β β β β
β β β β
β ββββββββββββ΄ββββββββββββ β β
β β β β β
β β - BSU/ESU detect β β β
β β - Pseudo-BSU/ESU β β β
β β - Frame buffer β β β
β β - Diff calculate β β β
β β β β β
β ββββββββββββ¬ββββββββββββ β β
β β β β
β v β β
β GridUpdate (per frame) β β
β β β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Why this position matters: β β
β β β β
β β - Processing happens BEFORE IPC --> minimal data transfer β β
β β - Rust handles heavy work --> no GC, multi-threaded β β
β β - Frame-level emission --> JS just renders complete frames β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Success Factor 4: Pseudo-BSU/ESU (Original Contribution)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PSEUDO-BSU/ESU: WHAT MONOTERM ADDS β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Research Finding (modern terminals analyzed): β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β
β - Alacritty: Cursor affects rendering (not frame boundary) β
β - Ghostty: Cursor affects frame content (not frame boundary) β
β - WezTerm: Cursor visibility check only β
β - xterm.js: Cursor draw decision only β
β - Hyper: Delegates to xterm.js β
β β
β None use cursor pattern AS frame boundary. β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β MonoTerm Pseudo-BSU/ESU: β
β βββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β AI CLI Pattern (most TUI apps): β β
β β β β
β β Cursor hide <ββ "Frame start" (begin buffering) β β
β β ... output ... β β
β β Cursor show <ββ "Frame end" (flush and render) β β
β β β β
β β This is a HEURISTIC, not a standard. β β
β β But it works because AI CLI tools follow this pattern. β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β This is MonoTerm's original contribution: β
β Recognizing that cursor pattern CAN serve as frame boundary. β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Success Factor 5: Tauri as the Bridge
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TAURI: ENABLING THE HYBRID ARCHITECTURE β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β The architecture requires: β
β ββββββββββββββββββββββββββ β
β β
β - Rust crates (portable-pty, alacritty_terminal) β
β - Web rendering (xterm.js in WebView) β
β - Efficient IPC between them β
β β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β Tauri Provides β β
β β β β
β β ββββββββββββββββββββ ββββββββββββββββββββ β β
β β β β β β β β
β β β Rust Backend β <ββ IPC ββ> β WebView β β β
β β β β β β β β
β β β - PTY client β β - xterm.js β β β
β β β - VTE parser β β - HTML/CSS β β β
β β β - AtomicState β β - Extensions β β β
β β β - SessionActor β β β β β
β β β β β β β β
β β ββββββββββββββββββββ ββββββββββββββββββββ β β
β β β β
β β + Sidecar support (PTY Daemon survives app crashes) β β
β β + Type-safe IPC (Rust <-> TypeScript) β β
β β + Lightweight binary (~50MB vs ~200MB) β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Tauri made "Rust parsing + Web rendering" possible. β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Success Factor 6: Web-Based Extensibility
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE EXTENSIBILITY ADVANTAGE β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Native terminal UI: MonoTerm UI: β
β βββββββββββββββββββ ββββββββββββ β
β β
β Prompt Box? Prompt Box? β
β --> OpenGL rendering --> HTML div + CSS β
β β
β Markdown preview? Markdown preview? β
β --> Custom pipeline --> marked.js, one line β
β β
β Image display? Image display? β
β --> Terminal graphics --> <img> tag β
β β
β AI API integration? AI API integration? β
β --> Rust HTTP client --> fetch(), one line β
β β
β Theme customization? Theme customization? β
β --> Recompile or config --> CSS file swap β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β The insight: β β
β β β β
β β Terminal = Rust (performance-critical parsing) β β
β β UI/UX = Web (rapid iteration, rich features) β β
β β β β
β β Each layer does what it does best. β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The Complete Picture
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MONOTERM SUCCESS FORMULA β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. Production-Proven Rust Crates β
β βββββββββββββββββββββββββββββββββ β
β portable-pty + alacritty_terminal β
β --> Immediate production quality β
β β
β 2. xterm.js Parser Bypass β
β ββββββββββββββββββββββββββ β
β Direct buffer injection β
β --> xterm.js becomes pure GPU renderer β
β β
β 3. AtomicState at IPC Boundary β
β βββββββββββββββββββββββββββββββ β
β Frame synchronization in Rust, before data transfer β
β --> Flickering solved at the right layer β
β β
β 4. Pseudo-BSU/ESU (Original Contribution) β
β ββββββββββββββββββββββββββββββββββββββ β
β Cursor pattern as frame boundary heuristic β
β --> Works for AI CLI tools without Mode 2026 β
β β
β 5. Tauri as Bridge β
β βββββββββββββββββ β
β Rust backend + WebView frontend β
β --> Made the hybrid architecture possible β
β β
β 6. Web-Based Extensibility β
β βββββββββββββββββββββββββ β
β HTML/CSS/JS for UI, Rust for performance β
β --> Each layer does what it does best β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Conclusion
MonoTermβs success came from recognizing the right boundaries:- PTY communication: Let WezTermβs portable-pty handle it
- VTE parsing: Let Alacrittyβs parser handle it
- Frame synchronization: Handle at IPC boundary (AtomicState)
- Rendering: Let xterm.js WebGL handle it
- Glue: Let Tauri bridge Rust and Web
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THE RIGHT COMPONENTS AT THE RIGHT BOUNDARIES β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β portable-pty --> PTY communication β
β Alacritty VTE --> Parsing β
β AtomicState --> Frame synchronization (NEW) β
β xterm.js --> Pure rendering β
β Tauri --> Rust <-> Web bridge β
β β
β + Pseudo-BSU/ESU: The original heuristic (NEW) β
β β
β What we add: The frame boundary recognition β
β that solves AI CLI flickering. β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Related Research
- Giants Quote - Philosophical foundations
- Prior Art - What we learned from each terminal