---
name: ratatui
description: Ratatui reference for building rich terminal UIs, plus Kotlin Multiplatform TUI patterns. Rust coverage includes Terminal/Frame/Backend/Buffer architecture, immediate-mode rendering, Layout system (Constraint, Direction, Flex), all built-in widgets (Block, Paragraph, List, Table, Tabs, Chart, BarChart, Gauge, Sparkline, Canvas, Scrollbar), text rendering (Text/Line/Span), styling (Style, Color, Modifier), crossterm event handling, and app architecture (main loop, setup/restore, alternate screen, raw mode). KMP coverage maps the architecture to Kotlin (expect/actual backends, Buffer diff-rendering, Widget/StatefulWidget, Layout solver, styled text, ANSI rendering, coroutine event loop, DSL builders, practical widgets, TestBackend). Use when building a TUI in Rust or KMP, writing widgets, designing layouts, or any ratatui question.
---
## Ratatui 0.30.0
Ratatui is a Rust library for building terminal user interfaces. Forked from tui-rs in 2023.
### Core Concept: Immediate-Mode Rendering
Every frame, you describe the entire UI from scratch. No retained widget tree. The library diffs buffers internally for efficient terminal I/O.
```rust
terminal.draw(|frame| {
frame.render_widget(my_widget, frame.area());
})?;
```
### Installation
```toml
[dependencies]
ratatui = "0.30" # crossterm backend is default; no separate crossterm dep needed
```
Since 0.27.0, ratatui re-exports the backend crate — access via `ratatui::crossterm`.
Alternative backends:
```toml
ratatui = { version = "0.30", default-features = false, features = ["termion"] }
ratatui = { version = "0.30", default-features = false, features = ["termwiz"] }
```
**Default features:** `crossterm`, `all-widgets`, `macros`, `layout-cache`, `underline-color`
**Optional features:** `serde`, `palette`, `scrolling-regions`, `portable-atomic`, `unstable-widget-ref`
**Crate organization (0.30.0):**
- `ratatui` — main crate for applications (re-exports everything)
- `ratatui-core` — core traits/types (for widget library authors)
- `ratatui-widgets`, `ratatui-crossterm`, `ratatui-termion`, `ratatui-termwiz`, `ratatui-macros`
### Quick Start
```rust
use ratatui::crossterm::event;
fn main() -> std::io::Result<()> {
ratatui::run(|terminal| {
loop {
terminal.draw(|frame| frame.render_widget("Hello World!", frame.area()))?;
if event::read()?.is_key_press() {
break Ok(());
}
}
})
}
```
`ratatui::run()` handles initialization, restoration, and panic hooks automatically. For more control use `ratatui::init()` / `ratatui::restore()`, or construct `Terminal` manually.
### Key Types
- `Terminal` — owns the backend, manages double-buffering
- `DefaultTerminal` — type alias for crossterm terminal
- `Frame` — provides `render_widget(widget, area)` and `area()`
- `Widget` trait — `fn render(self, area: Rect, buf: &mut Buffer)`
- `StatefulWidget` trait — adds `type State`; rendered with `render_stateful_widget()`
- `Rect` — `{ x, y, width, height }` — all positioning
- `Buffer` — 2D grid of `Cell`s
### Key Tips
- **No separate crossterm dep** — use `ratatui::crossterm::*`
- **`Event::is_key_press()`** — quick event check
- **`Block::bordered()`** — shorthand for `Block::default().borders(Borders::ALL)`
- **`Layout::vertical([...]).areas(rect)`** — returns fixed-size array
- **`rect.centered(h, v)`** — center a sub-rect
- **Const styles:** `const MY_STYLE: Style = Style::new().blue().bold();`
- **Widget library authors:** depend on `ratatui-core` not full `ratatui`
- **`no_std`:** disable default-features for embedded targets
## Reference Files
Load the relevant reference based on what you need:
| Topic | Reference |
|-------|-----------|
| Widget API — Rust (Block, Paragraph, List, Table, Tabs, Chart, BarChart, Gauge, LineGauge, Sparkline, Canvas, Scrollbar, Clear) | `references/widgets.md` |
| Layout system — Rust (Layout, Constraint, Direction, Flex, Rect, centering, nesting, common patterns) | `references/layout.md` |
| Styling and text — Rust (Style, Color, Modifier, Stylize, Text/Line/Span, symbols, markers, theming) | `references/styling.md` |
| App architecture — Rust (event handling, custom widgets, common recipes — popup, input, routing, testing) | `references/patterns.md` |
| KMP TUI core infrastructure (Rect, Buffer, Style, Color, Layout solver, Terminal backends for JVM/Native, ANSI rendering, escape sequence parsing, TestBackend) | `references/kmp-core.md` |
| KMP TUI widgets and app patterns (styled text model, DSL builders, Block, Paragraph, List, Table, Gauge, Tabs, InputField, Scrollable, coroutine event loop, TuiApp base class, router, testing) | `references/kmp-widgets.md` |
**Loading guidance:**
- For Rust TUI questions → load the relevant Rust reference file.
- For Kotlin/KMP TUI → load `kmp-core.md` for infrastructure, `kmp-widgets.md` for widgets/app patterns, or both.
- For "build a TUI app from scratch in KMP" → load both KMP files.
- For mapping a specific Ratatui concept to Kotlin → load the Rust reference + corresponding KMP file.
All domain knowledge in `references/`:
**Rust — Widgets:** widgets.md — Block, Paragraph, List, Table, Tabs, Chart, BarChart, Gauge, LineGauge, Sparkline, Canvas, Scrollbar, Clear
**Rust — Layout:** layout.md — Layout, Constraint, Direction, Flex, Rect methods, centering, nesting, common patterns
**Rust — Styling:** styling.md — Style, Color, Modifier, Stylize trait, Text/Line/Span, symbols, markers, theming
**Rust — Patterns:** patterns.md — App struct, event handling, async, mouse, panic hooks, custom widgets, recipes, testing
**KMP — Core:** kmp-core.md — Gradle setup, Rect/Margin, Style/Color/Modifier (bitmask), Cell/Buffer (with diff), Layout/Constraint solver, TerminalBackend interface, KeyCode sealed class, JVM backend (JLine 3 + escape seq parser), Native backend (POSIX termios + escape seq parser), Terminal (double-buffered diff rendering), TestBackend, ANSI escape code generation
**KMP — Widgets:** kmp-widgets.md — Styled text (Span/Line/Text + DSL), Widget DSL (FrameScope), BlockWidget, Paragraph, ListWidget+ListState, TableWidget+TableState, Gauge, Tabs, coroutine event loop (eventFlow/tickFlow), TuiApp base class, complete FileBrowser example, testing patterns, popup/modal, ScrollableViewport, InputField+InputState, Router pattern, performance tips