Courgette is a declarative TUI framework for Elixir built on OTP. Zero runtime dependencies.
Pipeline: Component render/1 → Element Tree → Layout (Flexbox) → Paint (Buffer) → Diff → ANSI → Terminal
- Root apps use
use Courgette.App; children useuse Courgette.LiveComponent - Assigns are maps internally. Public APIs accept keyword lists.
- DSL macros (
box,text,input, etc.) build pure-data element trees live_component(Module, id: "unique")— the:idis required- Events are tuples:
{:key, {:char, "a"}},{:key, :enter},{:key, {:ctrl, "c"}} - Focus: set
focusable: trueonlive_component; Tab/Shift-Tab cycles focus - Children notify parents via
send(assigns.parent_pid, {tag, value})
- App & Lifecycle — run/stop, callbacks, return shapes
- Components — LiveComponent vs Component, reconciliation
- DSL & Layout — element macros, flexbox props, styling
- Events & Focus — event tuples, focus routing
- Built-in Components — TextInput, Select, Spinner, etc.
- Animation — Tween, Frames, Easing, timer patterns
- Testing — ComponentTestHelpers, headless testing