The terminal UI (TUI)

Launch the Ratatui TUI, navigate its panels, browse effects, and read the live spectrum view.

Hypercolor ships a full-featured terminal UI built on Ratatui. It gives you a live dashboard, a searchable effect browser with per-effect controls and canvas preview, a connected-devices table, and a real-time audio spectrum strip β€” all without leaving the terminal.

The TUI dashboard showing Now Playing, canvas preview, device table, and audio strip

πŸ”—Launching the TUI

just tui          # preferred: auto-starts a local daemon if one is not running
hypercolor tui    # via the CLI binary; expects a daemon already running

The tui subcommand accepts one flag:

--log-level <LEVEL>    Tracing level for the TUI session (default: warn)
                       Values: error, warn, info, debug, trace

Tracing output goes to $TMPDIR/hypercolor-tui.log, not to the terminal, which keeps the alternate screen clean. Quitting the TUI never stops a daemon that was already running. The one exception is just tui: when it has to spin up a local daemon for you, that daemon is its child and gets shut down when the TUI exits.

If the daemon is running on a non-default host or port, set HYPERCOLOR_HOST and HYPERCOLOR_PORT before launching, or add a connection profile with hypercolor config profile add. See configuration for details.

πŸ”—Frame layout

Every screen shares the same persistent chrome shell:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ H Y P E R C O L O R β”‚ Dashboard          60fps β”‚ Audio β”‚ 3 dev  β”‚  ← title bar (1 row)
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                 β”‚
β”‚                     main content area                           β”‚
β”‚                                                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ ▇▇▆▅▄▃▂▁ Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· Β· ▁▂▃▄▅▅           β”‚  ← spectrum bars (row 1)
β”‚  Level: β–‡β–‡β–‡β–‡β–‡β–‘β–‘β–‘  62%  β”‚ Beat: ● ● β—‹ β—‹  β”‚ 128 BPM            β”‚  ← stats row (row 2)
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Borealis  ─  Vapor Scene  ─  3 devices Β· 312 LEDs   dashβ”‚effx│…│  ← status bar (1 row)
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Title bar β€” brand shimmer animation on the left, active screen name in the center, live FPS / audio status / device count on the right.

Audio strip β€” two rows of live audio data. The top row is a full-width spectrum bar chart colored by frequency band (coral for bass, yellow for mids, cyan for treble). The bottom row shows an 8-block level meter, four beat-detection dots, and BPM when detected. The whole strip collapses to a single β€œNo audio” line when no audio source is configured β€” see audio setup.

Status bar β€” gradient-colored active effect name on the left, clickable screen shortcuts and ?help on the right. In a multi-zone scene it also shows the targeted zone name.

πŸ”—Screens

Press the corresponding letter to switch screens. The active screen is highlighted in the status bar.

KeyScreenWhat it shows
dDashboardNow Playing panel, canvas preview, device table, quick actions
eEffectsThree-pane effect browser with search, preview, and controls
vDevicesConnected device list and per-device details

These three screens are what currently ships in the TUI; they are the only entries in the status-bar navigation. The keymap reserves p, s, and b for Profiles, Settings, and Debug, but those views are not mounted yet, so pressing those keys currently does nothing.

πŸ”—Dashboard screen

The dashboard is the landing screen and the fastest way to see current system state at a glance.

TUI dashboard with panels labeled

It is divided into four panels, all resizable by dragging the divider lines with the mouse:

Now Playing (top-left) β€” the active effect name, description, author, category, feature badges (audio reactive, control count, preset count), and tags. Below those, a brightness gauge and live FPS readout. In a multi-zone scene, this panel lists each zone with its effect and enabled state; [/] cycles the apply target between zones, x toggles the targeted zone on or off.

Preview (top-right) β€” the live render canvas streamed from the daemon over WebSocket. The canvas adapts automatically to the terminal’s image protocol (Kitty, sixel, or Unicode half-blocks). If no canvas data has arrived yet, the panel shows a placeholder.

Connected Devices (middle) β€” a table of every discovered device with columns for Device, Type, LEDs, Status, and FPS, plus a footer totaling LEDs across all devices. Navigate rows with j/k or the arrow keys; Enter jumps to the Devices screen.

Quick Actions (bottom) β€” your first five favorited effects, bound to 1 through 5. If you have no favorites yet, the bar suggests pressing f in the effect browser to add some.

πŸ”—Effects screen

The effect browser uses a three-pane layout: effect list on the left, canvas preview top-right, and controls bottom-right. All three panes are resizable.

TUI effects screen with three panes

πŸ”—Effect list pane

Effects are grouped by category. The selected effect is highlighted with a pointer; favorited effects show a star marker; each entry also carries a source badge (native or web) indicating whether the effect runs as compiled Rust or as an HTML canvas effect rendered by Servo.

KeyAction
j / ↓Move selection down
k / ↑Move selection up
g / HomeJump to top
G / EndJump to bottom
PgDn / PgUpJump ten effects
EnterApply selected effect
fToggle favorite
/Enter search mode
EscClear search / return to list

Search filters by name, category, and tags simultaneously. The filter is live β€” results update as you type.

πŸ”—Preview pane

Shows the live canvas for the selected effect. If multiple virtual display simulators are enabled, cycle between them with h/l or horizontal scroll in the preview pane. The source label in the pane title shows which feed is active.

When the effect has named presets, a preset indicator appears at the bottom of the controls pane. Navigate presets with j/k in the preview pane; Enter applies the highlighted preset.

πŸ”—Controls pane

Lists every adjustable parameter for the selected effect. Tab into this pane and navigate with j/k. Adjust the focused control with ←/β†’:

Control typeKeys
Slider← / β†’ β€” adjust by step, accelerates when held
ToggleSpace or Enter β€” flip on/off
Dropdown← / β†’ or Enter β€” cycle options
ColorEnter β€” open HSL color picker popup

Inside the color picker, ↑/↓ selects the channel (hue, saturation, lightness), ←/β†’ adjusts it, Enter confirms, Esc cancels.

Press r in the controls pane to reset all controls to their defaults.

πŸ”—Pane focus

Tab cycles focus forward through List β†’ Preview β†’ Controls. Shift+Tab cycles backward. The focused pane’s border is highlighted. Esc returns focus to the list.

πŸ”—Fullscreen preview

Press z (or Z) from any screen to expand the canvas preview to fill the entire terminal. The audio strip and a minimal status line remain visible.

Fullscreen bubble-garden effect

Fullscreen cymatics effect

In fullscreen mode, the preview transport is chosen automatically based on your terminal’s capabilities and the render cost. In Kitty the TUI uses a fast direct-protocol path; in other terminals it falls back to sixel or Unicode quarter-blocks.

Press z or Esc to return to the normal layout.

πŸ”—Global keybindings

These work from any screen and any pane:

KeyAction
qQuit the TUI (daemon keeps running)
?Toggle keybinding help overlay
TOpen the live theme picker
MCycle motion sensitivity (Off β†’ Subtle β†’ Full)
ZToggle fullscreen canvas preview
COpen the scene picker modal
[Cycle zone target backward (multi-zone scenes)
]Cycle zone target forward (multi-zone scenes)
EscGo back / close overlay
d/e/vSwitch directly to Dashboard / Effects / Devices

The letter shortcuts are case-insensitive, so T, M, Z, and C work whether or not Shift is held. When the sponsor link is enabled, $ opens the project’s GitHub Sponsors page.

Mouse is fully supported. Click panels to shift focus, drag divider lines to resize, scroll in lists and controls, and click status-bar shortcuts to jump screens.

πŸ”—Live motion effects

The TUI runs a tachyonfx-based motion layer that animates state changes without blocking input or the render loop:

  • Title shimmer β€” continuous color wash on the H Y P E R C O L O R brand text.
  • Screen transitions β€” dissolve when switching screens.
  • Effect changes β€” quick visual feedback when the active effect changes.
  • Device arrival / departure β€” sweep-in and dissolve-out animations.
  • Connection lost / restored β€” persistent glitch effect on loss, green flash on reconnect.
  • Spectrum pulse β€” border brightness driven by audio bass energy.
  • Canvas bleed β€” background tint that tracks the canvas dominant color.
  • Idle breathing β€” gentle border breathing after a period of no input.

Press M to cycle through Off, Subtle, and Full sensitivity levels if the motion is distracting.

πŸ”—Theme picker

Press T to open the live theme picker modal. Themes apply immediately without a restart and are persisted to ~/.config/hypercolor/tui.toml.

πŸ”—Connecting to a non-default daemon

By default the TUI connects to localhost:9420. To point it elsewhere, set environment variables before launch:

HYPERCOLOR_HOST=192.168.1.10 HYPERCOLOR_PORT=9420 hypercolor tui

For a connection you reuse, save it as a profile instead of exporting variables every time:

hypercolor config profile add studio --host 192.168.1.10 --port 9420
hypercolor --profile studio tui

See configuration for the full precedence rules.

πŸ”—Troubleshooting

β€œNo canvas data” in the preview panel β€” the daemon is running but the render loop has not produced a frame yet. Apply an effect from the effect browser and the preview will populate within one render cycle.

Audio strip shows β€œNo audio” β€” no audio source is configured or the daemon cannot open the system audio device. See audio setup.

Preview looks pixelated or uses block characters β€” your terminal does not support the Kitty or sixel graphics protocol. The TUI automatically falls back to Unicode quarter-blocks, which is correct behavior. Switch to a Kitty-compatible terminal for full-resolution preview.

TUI does not start or crashes immediately β€” check $TMPDIR/hypercolor-tui.log. The most common cause is the daemon not running on the expected address. Start the daemon first with just daemon (or the desktop app, which supervises it), then re-launch the TUI. just tui handles this for you by auto-starting a local daemon when one is not already reachable.

For device-specific issues, see troubleshooting.