The TUI
Per-service tabs, log selection and copy, the docker container switcher, and rebindable keys.
The default blink UI gives one tab per service plus an all tab, color-coded by status, gray for pending, red for error, and green for running. A footer shows watch stats, uptime, and each service's http://localhost:<port> address. Two other backends drop the interactivity when you do not want it.
Picking a UI
The --ui flag (or the ui: config field) selects the backend.
blink run -u blink # the full TUI (default)
blink run -u plain # line-prefixed stdout, no chrome
blink run -u headless # no UI at all (alias: -u none)
blink run -z # zen mode: native scrollback, no TUI chromeAn empty ui auto-selects plain when stdout is not a TTY, else blink. Every backend writes per-service log files independent of the UI, so plain and headless still produce <log_dir>/<svc>.log.
Tabs and navigation
Each service gets its own tab, and an all tab merges every service's output. Number keys 1 to 9 jump to a tab, →/← walk to the next and previous tab, and [/] walk tab history. pgup/pgdn, home/end, and the mouse wheel scroll the focused view.
For docker services, Tab and Shift+Tab cycle focus to one container's clean logs, so a multi-container compose stack is readable one service at a time.
Selecting and copying logs
Press e to toggle cursor mode, which turns on a line cursor and selection. From there space toggles the cursor line into the selection and shift+↑/shift+↓ extend it. With a selection made, these keys act on it.
ccopies it to the clipboard.wrewrites<log_dir>/<svc>.selected.logwith the selection.aappends the selection to that file.escclears the selection and exits cursor mode.
L toggles per-service log-file writing live, and / or ? opens a help modal that renders the current key bindings.
Rebinding keys
The TUI's keys are data-driven. A closed catalog of named actions is bound to keys by a default keymap, and control.keys in the config rebinds or unbinds any of them.
control:
keys:
x: restart # x now also restarts (r still works unless unbound)
ctrl+r: restart-all
enter: "" # empty value unbinds a keyKey strings use bubbletea's form, for example r, R, ctrl+c, shift+tab, enter, esc, and a single space " " for the spacebar. Overrides layer on top of the defaults, so keys you do not mention keep theirs. Binding a key to an action name that is not in the catalog is a hard error at load time, so a typo fails the run rather than silently doing nothing.
Note
A few navigation keys sit outside the rebindable keymap so they are always available, 1-9, pgup/pgdn, and home/end. control.keys cannot touch these.
The full action catalog and its default bindings live in the keybindings reference.