Decision #8
Why Bubbletea + Lip Gloss as the headless fallback to the pixel office
Not everyone wants a game-like desktop app. Server environments, SSH sessions, and CI need text-based visibility with the same coordination awareness. The orchestrator must be observable without a display server, a GPU, or a native window manager. The question is which TUI framework — if any — earns a place alongside the pixel office as a first-class interface.
Agent sprites at desks with animated state transitions, spatial awareness, and desk-to-desk handoff visuals.
Tabular agent list, status indicators, scrolling log, and task queue — readable over SSH with no display server.
Bubbletea shares the Go runtime with the orchestrator, eliminating any IPC bridge. Its Elm architecture — a single model, a pure update function, and a view function — maps cleanly onto the orchestrator's own event model. State mutations that happen inside the orchestrator produce messages that flow directly into the Bubbletea update loop; the TUI view is always a deterministic function of the current model, which makes render/state parity a structural guarantee rather than a discipline.
Lip Gloss handles layout and styling without a DOM: adaptive columns, colour themes, and borders work across terminal capabilities from 256-colour to basic ANSI. The result is a UI that degrades gracefully rather than failing silently in constrained environments.
"The TUI is not a lesser version — it's the right tool for its context. Server operators, SSH sessions, and CI pipelines deserve first-class visibility too."
| Area | Concern | Impact |
|---|---|---|
| Spatial awareness | The TUI cannot match the spatial metaphor of the pixel office. Agent-to-agent handoffs are logged events, not visible movements across a floor plan. | Medium |
| Two UIs to maintain | A shared gRPC state stream reduces coupling, but changes to agent state shape must be reflected in both the pixel office and the TUI view functions. | Medium |
| Elm boilerplate | Every new piece of state requires a message type, a case in the update switch, and a view fragment. The pattern is mechanical but verbose for large models. | Low |
| Terminal capability variance | Lip Gloss adapts to terminal capability, but some environments (minimal Docker images, legacy CI runners) may render box-drawing characters as garbage. | Low |