The terminal face
The kernel's honest reading in a terminal: facts and actions as text, canvases as half-block cells. No widgets, no framework - a Screen of cells, diffed and flushed.
Entering
mrlycli tui, or bare mrlycli on a terminal. Piped stdin still gets the line repl, so scripts and tests are untouched.
Reading
Title bar (emoji, title, beat verb right-aligned), route params, the canvas from the frame fact, the remaining state keys one per row, notices, the action bar, then the status row.
Keys
- arrows or
wasd- the focused app's manifest keymap (keys), if bound 1-9- the nth action; argless verbs fire, the rest prefill the line:- type a verb and optional JSON args, enter acts, esc cancelsesc- back to the menu,qorctrl-c- quit
Laws
- Redraw iff the kernel tick advanced, the terminal resized, or the command
line changed. The kernel decides what changed; the shell only asks.
- The shell owns the clock: a 125ms beat drives
view.beat, never the app. - Cells are diffed at the transport - only changed runs move the cursor,
and style bytes ride only on style changes.
- Render is total: any app, any state, any size down to 20x6.
libcis rented for termios, ioctl and isatty (DEPS.md: own the face,
rent the platform). VT escape codes are a dead spec, so they are ours.