phux
guidesinteractive TUI

TUI defaults and scope

The reference TUI's consumer-facing product surface: subcommands, keybinds, status bar, layout, hooks, recording.

evolving document
Full source summary

The reference TUI's consumer-facing product surface: subcommands, keybinds, status bar, layout, hooks, recording. The TUI is the wedge — the daily-driver adoption surface — and its differentiator is the wire: attach/detach, remoting, and a human and their agents sharing the same live terminals. It is held a pure consumer with no protocol privilege by ADR-0017. What's normative lives in ../spec/; this file is the human-facing reference for the tmux-shaped consumer that ships in tree.

11. Things we explicitly do not ship

Repeating from CONTRIBUTING.md because the design decisions here lean on these:

  • No embedded scripting language. No tmux-style if-shell, no format-template DSL with conditionals. Templates are interpolation only.
  • No tmux-style copy-mode reimplementation. No second parser for selection boundaries, no mouse drag selection, and no custom clipboard format path. The client may expose a focused-pane copy-mode projection for cursor movement, viewport scrolling, highlighting, and literal search over mirrored scrollback, then delegate extraction/formatting to libghostty and native clipboard behavior.
  • No multi-row status bar, no widgets, no themes-as-config. The status bar is one row. Themes are color slots, not a styling engine.
  • No embedded plugin runtime in core. Plugin manifests are declarative config today. Future runtime surfaces execute argv commands over the same CLI/socket contract instead of embedding a scripting language.
  • No homegrown crypto. Transport is the right layer; SSH and Unix socket perms cover it.

12. Defaults table

The shipped defaults, in one place:

SettingDefault
Shelldefaults.shell; unset → $SHELL, fallback /bin/sh
TERM advertised to panesxterm-256color (phux-7vx/phux-0o8; set defaults.term = "ghostty" to opt in)
History limit per pane50 000 lines
Backpressure threshold32 unacked frames
Journal size cap (per pane)10 MiB ring
Prefix keyC-a
Which-key popupon, 600 ms hesitation delay
Pane on PTY exitclose
Mouseon (defaults.mouse; false = pass-through only, §7)
New-pane CWD inheritanceinherit-focused (tmux-shaped)
Spawn-on-attachdefaults.shell (unset = inherit)
Session name template"default" (supports ${cwd-basename})
Window-size policysmallest (shared Terminal geometry, ADR-0027)
Status bar[{ kind = "windows" }] / [{ kind = "help-hints" }] / ["session-name", { kind = "time", format = " %H:%M" }]
Status bar positionbottom ([status] position, or top)
Activity / silence thresholdsactivity off; silence 2 min when enabled
Resize on attachaggregate min bounding box per session
Cursor blinkfollow inner program request

14. Out of scope, but on the radar

These are not in v0.1 but the design accommodates them so they don’t require breaking changes:

  • Resilient remote transport (zmosh-style UDP/SSP). Hooks into the Transport abstraction in the wire spec (see ../spec/proto.md §4).
  • Native GUI client (libghostty surface). Talks the same protocol as the TUI client — the client’s libghostty_vt::Terminal already parses PANE_OUTPUT bytes locally (ADR-0013); a GUI client swaps the TUI’s RenderState-to-VT renderer for a RenderState-to-GPU renderer and reuses everything else.
  • Multi-user shared sessions. Today’s protocol already supports multiple clients per session; ACL and identity will be a future authenticated transport addition.
  • Tabbed layouts (nested tab containers). The wire spec (see ../spec/L3.md §3.2) reserves the TABBED layout node.
  • Image protocols (sixel, kitty graphics). Under ADR-0013 these ride on the PANE_OUTPUT byte stream like any other VT sequence; per-client gating happens in the server’s capability rewriter (see ../spec/proto.md §6.2). The Sixel / KittyGraphics / Iterm2 capability bits already exist; the work is in the rewriter, not the wire format.
  • tmux control mode (CC) frontend. Optional adapter that would let a CC-aware terminal (iTerm2 today; Ghostty when 1.4+ binds its parser to the GUI) render phux Terminals as native splits of that terminal. The native byte-stream protocol (ADR-0013) stays primary and strictly more capable; CC is one possible alternative consumer, not a roadmap commitment. Per ADR-0017 the reference TUI has no protocol-level privilege, so a CC adapter picks its tier set (typically L1+L3) the same way the native TUI does. The earlier CC_FRONTEND capability bit in the wire spec (see ../spec/proto.md §6.2) is reclaimed under ADR-0017; no capability bit is needed.
View exact source