Skip to main content

Prior Art & Design Rationale

Research on modern terminals revealed why a new approach was needed.

Research Scope

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  TERMINALS STUDIED                                                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚    β”‚  Terminal   β”‚  Language  β”‚  Focus Area                       β”‚    β”‚
β”‚    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€    β”‚
β”‚    β”‚  Alacritty  β”‚  Rust      β”‚  VTE parsing, GPU rendering       β”‚    β”‚
β”‚    β”‚  Ghostty    β”‚  Zig       β”‚  Performance, sync mechanisms     β”‚    β”‚
β”‚    β”‚  Hyper      β”‚  TS/Electronβ”‚ IPC boundaries, batching         β”‚    β”‚
β”‚    β”‚  WezTerm    β”‚  Rust      β”‚  Multiplexing, configuration      β”‚    β”‚
β”‚    β”‚  xterm.js   β”‚  TypeScriptβ”‚  Browser rendering, buffer mgmt   β”‚    β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

What We Learned

Ghostty (Zig)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  GHOSTTY: PERFORMANCE BOUNDARIES                                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    Key Insights:                                                       β”‚
β”‚    ─────────────                                                       β”‚
β”‚    - BSU/ESU Mode 2026 with 1-second timeout safety                    β”‚
β”‚    - Page-based mmap architecture for zero-copy operations             β”‚
β”‚    - Triple buffering (SwapChain) for GPU sync                         β”‚
β”‚                                                                        β”‚
β”‚    What we learned:                                                    β”‚
β”‚    ────────────────                                                    β”‚
β”‚    --> Timeout safety is essential (apps can hang)                     β”‚
β”‚    --> Memory architecture matters for performance                     β”‚
β”‚    --> Type safety at compile time prevents bugs                       β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Hyper (Electron/TypeScript)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  HYPER: ARCHITECTURE LESSONS                                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    Key Insights:                                                       β”‚
β”‚    ─────────────                                                       β”‚
β”‚    - NO native BSU/ESU - delegates entirely to xterm.js                β”‚
β”‚    - DataBatcher: 16ms timeout / 200KB max batch                       β”‚
β”‚    - Electron IPC overhead is significant                              β”‚
β”‚    - React bypassed for terminal writes (performance)                  β”‚
β”‚                                                                        β”‚
β”‚    What we learned:                                                    β”‚
β”‚    ────────────────                                                    β”‚
β”‚    --> 16ms batching aligns with 60 FPS                                β”‚
β”‚    --> Delegating to xterm.js means inheriting its limitations         β”‚
β”‚    --> IPC boundary is where optimization matters                      β”‚
β”‚                                                                        β”‚
β”‚    MonoTerm's evolution:                                               β”‚
β”‚    ─────────────────────                                               β”‚
β”‚    Started as Electron (like Hyper)                                    β”‚
β”‚    --> Moved to Tauri for Rust backend                                 β”‚
β”‚    --> Bypassed xterm.js parser entirely                               β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

BSU/ESU Support Matrix

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  BSU/ESU MODE 2026 SUPPORT                                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    MODERN TERMINALS SUPPORT BSU/ESU                                    β”‚
β”‚    ════════════════════════════════                                    β”‚
β”‚                                                                        β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚    β”‚  Terminal   β”‚  Support  β”‚  Notes                              β”‚   β”‚
β”‚    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€   β”‚
β”‚    β”‚  Alacritty  β”‚  YES      β”‚  Lock-based event loop              β”‚   β”‚
β”‚    β”‚  Ghostty    β”‚  YES      β”‚  1s timeout safety                  β”‚   β”‚
β”‚    β”‚  WezTerm    β”‚  YES      β”‚  Sequence number tracking           β”‚   β”‚
β”‚    β”‚  xterm.js   β”‚  YES      β”‚  SynchronizedOutputHandler class    β”‚   β”‚
β”‚    β”‚  Hyper      β”‚  VIA      β”‚  Delegates to xterm.js              β”‚   β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The Unsolved Problem

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  WHY AI CLI STILL FLICKERS                                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    OBSERVATION                                                         β”‚
β”‚    ═══════════                                                         β”‚
β”‚                                                                        β”‚
β”‚    - All modern terminals support BSU/ESU Mode 2026                    β”‚
β”‚    - AI CLIs (Claude Code, Aider, etc.) still flicker                  β”‚
β”‚    - Even in native GPU-accelerated terminals                          β”‚
β”‚                                                                        β”‚
β”‚    ───────────────────────────────────────────────────────────────     β”‚
β”‚                                                                        β”‚
β”‚    ROOT CAUSE ANALYSIS                                                 β”‚
β”‚    ═══════════════════                                                 β”‚
β”‚                                                                        β”‚
β”‚    1. BSU/ESU requires APPLICATION to emit sequences                   β”‚
β”‚                                                                        β”‚
β”‚       Application must send:  begin-sync ... end-sync                  β”‚
β”‚       Most AI CLIs do NOT send these sequences                         β”‚
β”‚                                                                        β”‚
β”‚    2. AI CLIs use different patterns                                   β”‚
β”‚                                                                        β”‚
β”‚       Common pattern:  cursor hide --> update --> cursor show          β”‚
β”‚       This is NOT BSU/ESU, but achieves similar intent                 β”‚
β”‚                                                                        β”‚
β”‚    3. Producer-driven architecture                                     β”‚
β”‚                                                                        β”‚
β”‚       PTY --> Parser --> Renderer --> Display                          β”‚
β”‚        β”‚                      β”‚                                        β”‚
β”‚        └── Producer           └── No feedback (open loop)              β”‚
β”‚                                                                        β”‚
β”‚    ───────────────────────────────────────────────────────────────     β”‚
β”‚                                                                        β”‚
β”‚    THE GAP                                                             β”‚
β”‚    ═══════                                                             β”‚
β”‚                                                                        β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚    β”‚                                                               β”‚  β”‚
β”‚    β”‚  Terminal has BSU/ESU support                     YES         β”‚  β”‚
β”‚    β”‚  AI CLI sends BSU/ESU sequences                   NO          β”‚  β”‚
β”‚    β”‚  AI CLI sends cursor hide/show pattern            YES         β”‚  β”‚
β”‚    β”‚  Terminal recognizes this as frame boundary       NO <── GAP  β”‚  β”‚
β”‚    β”‚                                                               β”‚  β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

MonoTerm’s Approach

Pseudo-BSU/ESU: Recognizing Cursor Patterns

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  PSEUDO-BSU/ESU: THE BRIDGE                                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    Traditional BSU/ESU (Mode 2026):                                    β”‚
β”‚    ────────────────────────────────                                    β”‚
β”‚                                                                        β”‚
β”‚      begin-sync -->  [content]  -->  end-sync                          β”‚
β”‚      (begin)         (buffered)       (end + flush)                    β”‚
β”‚                                                                        β”‚
β”‚    ───────────────────────────────────────────────────────────────     β”‚
β”‚                                                                        β”‚
β”‚    Pseudo-BSU/ESU (MonoTerm):                                          β”‚
β”‚    ──────────────────────────                                          β”‚
β”‚                                                                        β”‚
β”‚      cursor-hide -->  [content]  -->  cursor-show                      β”‚
β”‚      (hide cursor)    (buffered)      (show cursor + flush)            β”‚
β”‚                                                                        β”‚
β”‚    ───────────────────────────────────────────────────────────────     β”‚
β”‚                                                                        β”‚
β”‚    Why this works:                                                     β”‚
β”‚    ───────────────                                                     β”‚
β”‚                                                                        β”‚
β”‚    - AI CLIs already send cursor hide/show                             β”‚
β”‚    - Intent is identical: "don't show partial updates"                 β”‚
β”‚    - MonoTerm recognizes this pattern as frame boundary                β”‚
β”‚    - No changes needed in AI CLI applications                          β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Consumer-Driven ACK: Closing the Loop

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ACK HANDSHAKE: FROM OPEN TO CLOSED LOOP                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    Traditional (Open Loop):                                            β”‚
β”‚    ─────────────────────────                                           β”‚
β”‚                                                                        β”‚
β”‚      PTY --> Parser --> Renderer --> Display                           β”‚
β”‚       β”‚                      β”‚                                         β”‚
β”‚       β”‚                      └── No feedback                           β”‚
β”‚       └── "I'll send as fast as I can"                                 β”‚
β”‚                                                                        β”‚
β”‚    ───────────────────────────────────────────────────────────────     β”‚
β”‚                                                                        β”‚
β”‚    MonoTerm (Closed Loop):                                             β”‚
β”‚    ───────────────────────                                             β”‚
β”‚                                                                        β”‚
β”‚      PTY --> Parser --> [ACK Gate] --> Renderer --> Display            β”‚
β”‚       β”‚                      ^               β”‚                         β”‚
β”‚       β”‚                      β”‚               β”‚                         β”‚
β”‚       β”‚                      └────── ACK β”€β”€β”€β”€β”˜                         β”‚
β”‚       β”‚                                                                β”‚
β”‚       └── "I'll wait for consumer readiness"                           β”‚
β”‚                                                                        β”‚
β”‚    Why this matters:                                                   β”‚
β”‚    ─────────────────                                                   β”‚
β”‚                                                                        β”‚
β”‚    - Producer can't overwhelm consumer                                 β”‚
β”‚    - Frame sync happens at IPC boundary                                β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Why Prior Art Wasn’t Enough

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  DESIGN RATIONALE                                                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    PRIOR ART                       β”‚   WHY NOT SUFFICIENT              β”‚
β”‚    ══════════                      β”‚   ══════════════════              β”‚
β”‚                                    β”‚                                   β”‚
β”‚    BSU/ESU Mode 2026               β”‚   Requires app to emit sequences  β”‚
β”‚    (Modern terminals)              β”‚   AI CLIs don't emit them         β”‚
β”‚                                    β”‚                                   β”‚
β”‚    ──────────────────────────────────────────────────────────────────  β”‚
β”‚                                    β”‚                                   β”‚
β”‚    Ghostty timeout safety          β”‚   Great pattern, adopted it       β”‚
β”‚                                    β”‚   But still producer-driven       β”‚
β”‚                                    β”‚                                   β”‚
β”‚    ──────────────────────────────────────────────────────────────────  β”‚
β”‚                                    β”‚                                   β”‚
β”‚    Hyper 16ms batching             β”‚   Good for 60 FPS alignment       β”‚
β”‚                                    β”‚   But no frame boundary detection β”‚
β”‚                                    β”‚                                   β”‚
β”‚    ════════════════════════════════════════════════════════════════    β”‚
β”‚                                                                        β”‚
β”‚    MONOTERM'S CONTRIBUTION                                             β”‚
β”‚    ═══════════════════════                                             β”‚
β”‚                                                                        β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚    β”‚                                                               β”‚  β”‚
β”‚    β”‚  1. Pseudo-BSU/ESU                                            β”‚  β”‚
β”‚    β”‚     --> Recognize cursor hide/show AS frame boundary          β”‚  β”‚
β”‚    β”‚     --> Works with existing AI CLIs (no changes needed)       β”‚  β”‚
β”‚    β”‚                                                               β”‚  β”‚
β”‚    β”‚  2. Consumer-driven ACK                                       β”‚  β”‚
β”‚    β”‚     --> Close the loop at IPC boundary                        β”‚  β”‚
β”‚    β”‚     --> Renderer controls the pace                            β”‚  β”‚
β”‚    β”‚                                                               β”‚  β”‚
β”‚    β”‚  3. AtomicState at IPC boundary                               β”‚  β”‚
β”‚    β”‚     --> Frame sync between Rust backend and TS frontend       β”‚  β”‚
β”‚    β”‚                                                               β”‚  β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Acknowledgments

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  THANKS TO THE TERMINAL ECOSYSTEM                                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    Ghostty (Mitchell Hashimoto)                                        β”‚
β”‚    --> Pushed performance boundaries with Zig                          β”‚
β”‚    --> Timeout safety pattern we adopted                               β”‚
β”‚                                                                        β”‚
β”‚    Hyper (Vercel)                                                      β”‚
β”‚    --> Demonstrated Electron terminal architecture                     β”‚
β”‚    --> 16ms batching for 60 FPS alignment                              β”‚
β”‚    --> Lessons on IPC boundary importance                              β”‚
β”‚                                                                        β”‚
β”‚    Collective wisdom from the open source terminal community           β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Conclusion

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  PRIOR ART --> RECOGNITION                                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                        β”‚
β”‚    We studied modern terminals. We learned from all of them.           β”‚
β”‚                                                                        β”‚
β”‚    What we found:                                                      β”‚
β”‚    - BSU/ESU Mode 2026 is widely supported                             β”‚
β”‚    - AI CLI flickering persists despite this support                   β”‚
β”‚    - The gap: app must emit sequences, but AI CLIs don't               β”‚
β”‚                                                                        β”‚
β”‚    What we recognized:                                                 β”‚
β”‚    - AI CLIs already send cursor hide/show                             β”‚
β”‚    - This pattern has the SAME INTENT as BSU/ESU                       β”‚
β”‚    - No one was treating it as a frame boundary                        β”‚
β”‚                                                                        β”‚
β”‚    What we implemented:                                                β”‚
β”‚    - Pseudo-BSU/ESU: cursor pattern as frame boundary                  β”‚
β”‚    - Consumer-driven ACK: closed loop architecture                     β”‚
β”‚    - AtomicState: frame sync at IPC boundary                           β”‚
β”‚                                                                        β”‚
β”‚    ───────────────────────────────────────────────────────────────     β”‚
β”‚                                                                        β”‚
β”‚    This is not innovation. This is recognition.                        β”‚
β”‚    The pattern was always there. We just saw it.                       β”‚
β”‚                                                                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜