# 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 cancels - `esc` - back to the menu, `q` or `ctrl-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. - `libc` is 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.