Awesome TUIs catalog and terminal user interface design
Published reference · snapshot 2026-10-24
↓ Facts as markdownall context files
Source-anchored research for Awesome TUIs catalog and terminal user interface design. Run status: BUDGET_EXHAUSTED.
These notes link each claim to its source. Some citations identify archived research reports that are no longer hosted on this site. A published reference means the content is available; it does not certify independent review or accuracy.Read the editorial policy and follow the sources before relying on a claim.
Definitions
- Unicode East_Asian_Width is not a complete terminal-cell-width algorithm: UAX 11 explicitly requires case-specific tailoring for modern terminal emulators. (low confidence) [source]
How it works
- A Ratatui draw callback must render every widget intended for that frame. Drawing only changed widgets is incorrect because the current frame buffer is cleared before reuse. (low confidence) [source]
- Textual documents stale-result races when network replies arrive out of request order; its exclusive worker option cancels earlier workers when newer work starts. (low confidence) [source]
- Textual exposes mouse events with character-column and line coordinates and supports mouse capture, which routes events to a widget even when the pointer moves outside it. (low confidence) [source]
- Ratatui leaves the application responsible for deciding when to draw and for orchestrating input events. (low confidence) [source]
- Ratatui recommends restoring raw mode and the main screen before invoking the original panic hook so that panic output appears after terminal cleanup. (low confidence) (verified as of 2026-10-25) [source]
- For asyncio-backed TUI work, Task.cancel() requests cancellation on a later event-loop cycle; a started coroutine can suppress CancelledError, so requesting cancellation does not prove that the task stopped. (low confidence) [source]
- Asyncio coroutines should perform cancellation cleanup in try/finally and generally propagate CancelledError afterward; swallowing it can disrupt TaskGroup and asyncio.timeout because they use cancellation internally. (low confidence) [source]
- The kitty keyboard protocol reports repeat and release events only when its report-event-types enhancement is enabled; ordinary reporting treats repeats as key presses. (low confidence) [source]
- When a Ratatui application launches an external editor, it must relinquish terminal input and output, and concurrent input readers must pause until the editor exits. (low confidence) (verified as of 2026-10-25) [source]
- Textual sends Worker.StateChanged to the creating widget when a worker changes state, allowing completion handling without awaiting the worker inside a message handler. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui buffer diffing skips the trailing cell when writing a double-width glyph, but emits both cells when replacing that glyph with two narrow characters. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui 0.30.1 CellWidth adds a terminal-compatibility adjustment for halfwidth katakana U+FF9E and U+FF9F because terminals commonly display them as one cell while unicode-width reports zero. (low confidence) [source]
- Synchronized terminal output holds the previously displayed frame while continuing to process incoming text and sequences, then allows the updated buffer to display when synchronization ends; this addresses visual tearing during a multi-write update. (low confidence) [source]
Problems, failure modes and limitations
- Textual workers allow a message handler to schedule slow work and return promptly. Awaiting worker.wait() inside a message handler can still prevent that widget from updating until completion. (low confidence) [source]
- Terminal restoration performed inside a Ratatui panic hook should avoid panicking itself, because a second panic can obscure the original failure. (low confidence) (verified as of 2026-10-25) [source]
- The Ratatui external-editor recipe identifies a concrete competing-reader failure: Vim background-color query replies can be consumed by Crossterm and appear as RGB escape data after returning to the TUI. (low confidence) (verified as of 2026-10-25) [source]
- A Textual worker exception exits the application by default; exit_on_error=False changes that failure policy. (low confidence) (verified as of 2026-10-25) [source]
- Textual Worker.wait distinguishes failure from cancellation by raising WorkerFailed for a worker exception and WorkerCancelled for cancellation before completion. (low confidence) (verified as of 2026-10-25) [source]
Comparisons and alternatives
- Textual thread workers should dispatch UI changes through App.call_from_thread or thread-safe post_message rather than directly mutating widgets or reactive variables. (low confidence) [source]
- The kitty keyboard protocol provides opt-in enhancements for disambiguating keys and reporting additional event information; applications can query support rather than assume every terminal implements the protocol. (low confidence) [source]
- Textual thread workers require cooperative cancellation checks rather than coroutine-style interruption. (low confidence) [source]
- Crossterm raw mode disables terminal-driver handling of special keys including Ctrl+C; an application using raw mode must handle its quit interaction rather than assume that Ctrl+C retains normal driver behavior. (low confidence) (verified as of 2026-10-25) [source]
- Enabling kitty keyboard disambiguation changes Ctrl+C into a CSI-u key sequence rather than SIGINT, while Enter, Tab, and Backspace retain legacy bytes to permit shell recovery after a crash. (low confidence) [source]
- Textual work(exclusive=True) cancels other workers in the same worker group rather than indiscriminately cancelling every background operation; the decorator defaults group to default. (low confidence) (verified as of 2026-10-25) [source]
- To detect partial kitty keyboard-protocol implementations, applications can set the desired enhancement flags and query the flags back rather than treating basic protocol detection as proof of every enhancement. (low confidence) [source]
- Synchronized-output support can be queried with CSI ? 2026 $ p; Contour documents no reply, unrecognized mode, or permanently reset mode as unsupported, rather than treating an emitted begin command as proof of support. (low confidence) [source]
Facts and statements
- Bubble Tea structures a program around an application model and three methods: Init returns an initial command, Update handles incoming messages and returns an updated model and optional command, and View derives the UI from the model. (low confidence) [source]
- Ratatui reconstructs the logical UI from application state during each draw call, but compares successive cell buffers to reduce terminal writes. Immediate-mode rendering therefore does not imply transmitting the entire screen every frame. (high confidence) [source]
- Ratatui offers several event-handling patterns: one central handler, central capture followed by message passing, or module-owned loops. Its documentation identifies scaling limits in a monolithic handler and duplication risks in distributed loops. (low confidence) [source]
- Responsiveness depends on allowing the UI processing path to advance: blocking Ratatui rendering delays visual updates, and awaiting a network request inside a Textual message handler delays other messages. (high confidence) [source]
- Terminal key bindings require compatibility checks: legacy encodings can conflate Tab with Ctrl+I, and terminal or operating-system handling can prevent combinations from reaching the application. (high confidence) [source]
- In Textual, focus selects the widget receiving key input; Tab and Shift+Tab move focus. Ordinary binding lookup starts at the focused widget and proceeds through ancestors, while priority bindings take precedence. (low confidence) [source]
- Visible shortcut descriptions can make TUI interaction discoverable: Textual footers display bindings, and the Bubble Tea sample displays an explicit quit instruction in its view. (medium confidence) [source]
- Textual provides focus() for programmatic focus changes and Focus/Blur events for observing transitions. (low confidence) [source]
- Textual recommends key bindings and actions over experimental key-specific handler methods. (low confidence) [source]
- Textual exposes alternative names for an input key through its Key event aliases list. (low confidence) [source]
- Crossterm alternate-screen rendering preserves the main-screen contents, but the alternate screen has the terminal window dimensions and no scrollback area. (low confidence) (verified as of 2026-10-25) [source]
- Unicode extended grapheme clusters provide default units for text selection and arrow-key movement, so a base character plus combining accents can be traversed as one editing unit despite containing multiple code points. (low confidence) [source]
- Unicode grapheme boundaries only approximate cursor placement; font and text-rendering behavior can require editing frameworks to place cursors differently. (low confidence) [source]
- East_Asian_Width does not preserve canonical equivalence; looking up a decomposed base and combining marks separately does not necessarily reproduce the width properties of the corresponding precomposed character. (low confidence) [source]
- The kitty keyboard protocol maintains independent keyboard-mode stacks for main and alternate screens, allowing an alternate-screen program to change its mode without knowing or changing the main-screen mode. (low confidence) [source]
- Xterm terminal-window focus reporting is separately enabled with mode 1004 and emits CSI I on focus gain and CSI O on focus loss; it can coexist with mouse reporting. (low confidence) [source]
- Crossterm permits read and poll on the same thread or EventStream, but forbids mixing those input APIs or calling read and poll from different threads. (low confidence) (verified as of 2026-10-25) [source]
- Crossterm poll returning true guarantees the subsequent read will not block; otherwise read can wait indefinitely for an event. (low confidence) (verified as of 2026-10-25) [source]
- Textual ties workers to their creating DOM node; removing the widget or popping its screen cleans up the associated tasks, and application exit cancels running tasks. (low confidence) (verified as of 2026-10-25) [source]
- Writing directly to a Ratatui backend can desynchronize its diff buffers and cursor bookkeeping from the display; Terminal.clear resets the previous buffer and forces the next draw to repaint the viewport. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui automatically checks fullscreen and inline viewport size during draw, but fixed viewports require explicit resize to change their region. (low confidence) (verified as of 2026-10-25) [source]
- In ncurses keypad mode, Escape is also a prefix of function-key sequences, so wgetch waits for more bytes or ESCDELAY before deciding which key occurred. (low confidence) [source]
- Ncurses notimeout makes the escape-sequence disambiguation delay effectively infinite, so pressing Escape can appear to hang until additional input arrives. (low confidence) [source]
- Xterm bracketed paste mode wraps pasted content in ESC [ 200 ~ and ESC [ 201 ~ delimiters so applications can distinguish paste from ordinary typed input. (low confidence) [source]
- The xterm maintainer records the 2005 editor motivation for paste bracketing: applications could suspend autoindent and command-prefix interpretation while receiving pasted text. (low confidence) [source]
- Textual Message.prevent_default suppresses base-class handlers, whereas Message.stop stops propagation to parent widgets; these controls operate on different handler paths. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui Buffer.diff_iter assumes well-formed buffers in which a double-width glyph is followed by a blank cell; custom buffer writers must preserve that representation. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui init has installed a terminal-restoring panic hook automatically since version 0.28.1; older examples that install the hook manually reflect an earlier setup requirement. (low confidence) [source]
- Constructing Ratatui Terminal directly does not implicitly set raw mode or alternate-screen mode; applications using Terminal.new or Terminal.with_options own that setup and teardown. (low confidence) (verified as of 2026-10-25) [source]
- Textual Worker.is_cancelled can be true while the work is still running, so this cancellation flag is not a thread-termination observation. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui Buffer.set_stringn skips zero-width graphemes and control characters; sending a string through this buffer API does not reproduce every control operation from the original text. (low confidence) (verified as of 2026-10-25) [source]
- Kitty event-type reporting alone does not supply release events for Enter, Tab, or Backspace; those require report-all-keys mode too. (low confidence) [source]
- Kitty report-all-keys mode replaces ordinary text output with key events; applications needing the generated text must also enable associated-text reporting, which is undefined without report-all-keys. (low confidence) [source]
- Ratatui CellDiffOption.ForcedWidth overrides width inference for a stored cell symbol, allowing visible text wrapped in ANSI or OSC sequences to occupy its intended terminal-cell width during diffing. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui CellDiffOption.AlwaysUpdate bypasses comparison with the previous buffer and emits the cell on every diff. (low confidence) (verified as of 2026-10-25) [source]
- Contour synchronized-output documentation leaves the existence and duration of a recovery timeout unspecified, so it does not establish a portable maximum time an application can leave a frame open. (low confidence) [source]
- Ratatui warns that multiple semver-incompatible Crossterm versions maintain separate event queues and raw-mode state, which can produce lost input or incorrect terminal restoration. (low confidence) (verified as of 2026-10-25) [source]
- Ratatui restore prints and ignores restoration errors; applications that need to handle a failed cleanup explicitly must use try_restore. (low confidence) (verified as of 2026-10-25) [source]
Children
- Terminal keyboard protocols and key ambiguity (frontier)
- TUI focus and key-binding routing (frontier)
- Immediate-mode terminal rendering and differential buffers (frontier)
- TUI background workers and event-loop responsiveness (frontier)
- Model-view-update architecture for terminal applications (frontier)
- Terminal input protocols and key ambiguity (frontier)
- TUI focus and binding design (frontier)
- Immediate-mode rendering and terminal diffing (frontier)
- TUI background work and cancellation (frontier)
- Terminal user interface interaction and architecture