TUI¶
The interface is a custom terminal UI: a cell buffer painted per frame, platform backends for Linux, BSD/macOS, and Windows, and ANSI output. No curses dependency.
Layout¶
Top to bottom: a title bar, a session tab strip, the transcript, and a
multi-line input box with a status line under it. The busy indicator on
a tab shows a spinner, elapsed seconds, and the live tool. A /view
pane can open beside the transcript for files and artifacts.
Tabs¶
Every tab is a live session. Work continues in background tabs, and a
tab flags when its turn finishes. The strip caps at 16 tabs and scrolls
with markers at the edges. Tabs are clickable, including the + button
that opens a new one.
| Control | Action |
|---|---|
ctrl-x then n |
New tab |
ctrl-x then w |
Close tab |
ctrl-x then arrows |
Move between tabs |
ctrl-x then digits |
Jump to tab |
ctrl-x then o |
Session picker |
f4 / shift-tab |
Cycle tabs |
ctrl-g |
Close tab |
/tab |
list, new, open, next, prev, close, N |
Open tabs persist across restarts in open_tabs under the config dir.
NULLRAY_SESSION or --session wins over the saved layout.
Input¶
Plain text input with multi-line editing. /attach PATH queues a file
or media attachment for the next message, /attach lists the queue,
/attach clear empties it. Images, audio, and video send as content
parts on providers that accept them.
Esc cancels a running turn in the active tab. While a turn is busy, Enter
injects the input as a mid-turn steer and Tab queues a follow-up for when
the turn ends. /pause stops after the current step, /continue resumes
with an optional note, /stop aborts.
Collapsed blocks¶
Long tool results and thinking blocks fold to a marker line plus the
last few lines, so a read_file dump or a noisy run_shell does not
bury the conversation. Click a collapsed block to expand it, click again
to fold it back. /expand toggles every block at once and
NULLRAY_COLLAPSE=0 turns folding off entirely.
Markdown¶
Assistant messages render as markdown: headings, quotes, bullet and
numbered lists, horizontal rules, fenced code blocks with syntax colors
when the fence names a known language, and pipe tables drawn as boxed,
aligned columns. Inline code, bold, italic and strike are
styled, and links show as the underlined text followed by the target.
History overlay¶
/history opens a scrollable view of the entire session, including
thinking and reasoning text rendered dim under a think: label. It
works while a turn is running, scrolls with the usual keys or the mouse
wheel, and Esc closes it.
View pane¶
After a turn writes a file, the view pane auto-opens on that path.
/view PATH opens a file, /artifact ID opens an artifact from the LID
store, /close closes the pane, and /view auto off or
NULLRAY_VIEW_AUTO=0 stops the auto-open.
A strip at the top lists recently viewed files. Clicking a name opens it,
and clicking anywhere else in the pane gives it focus (same as Tab).
While focused, Up/Down or PgUp/PgDn scroll and Left/Right or [ ]
cycle through the recent files. Esc closes the pane when the input box
is empty.
Keybinds¶
/keys shows the active bindings. Presets live in
~/.config/nullray/keys.ini (preset=default|neovim|emacs) or come
from --keys / NULLRAY_KEYS. Individual binds can be overridden in
the same file.
Themes¶
Built-ins: ink, ember, moss, slate, rose, mono, dusk. Switch with
/theme NAME or --theme, list with /themes.
Terminal behavior¶
NULLRAY_COLOR=none|16|256|trueforces a color depth.TERM=dumbor an empty TERM skips mouse and alt-screen.NO_COLORdisables color.- WSL falls back to
COLUMNS/LINESwhen the ioctl reports zero size. NULLRAY_MOUSEandNULLRAY_ALT_SCREENoverride detection.
Notifications¶
When a background tab finishes or a print run ends, nullray sends a
notification. NULLRAY_NOTIFY=auto|desktop|osc|bell|off picks the
backend: a desktop helper (notify-send, osascript, PowerShell toast),
the OSC 9 escape (tmux-aware), or a terminal bell.
Splash¶
The startup splash defaults on. --no-splash, NULLRAY_SPLASH=0, or
values false/off/no/disable skip it, and --splash forces it.