Prior Art & Design Rationale
Research on modern terminals revealed why a new approach was needed.Research Scope
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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)
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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)
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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. β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Related Research
- Terminal Analysis - Architecture comparison