DocsBlinkThe TUI

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 chrome

An 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.

  • c copies it to the clipboard.
  • w rewrites <log_dir>/<svc>.selected.log with the selection.
  • a appends the selection to that file.
  • esc clears 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 key

Key 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.