rexnux
A desktop client for Rex, the terminal multiplexer and session server by Superlogical, drawn as a native Go interface with MyGo and its Liquid Glass material.
Rex keeps sessions running on the server: windows, split panes and terminals
live there, and a client is a view of them. This client speaks Rex's control
API over WebSocket, renders each terminal with Ghostty's own VT engine
(libghostty-vt through MyGo's terminal plugin), and paints the workspace the
way the official macOS app does — a warm glass window, raised tab pills,
10 pt pane cards, hairline strokes and an accent-ringed active pane.
What works
- Real server only. No mock data. On launch it looks for a local server
(
$XDG_RUNTIME_DIR/rex/server.sock), and otherwise offers to start one withrex server startor to connect tohost:port/ a socket path. - It never guesses which session to open. A returning user lands in the session they used last; a new one gets the session picker, and a server with no sessions gets a welcome screen rather than an empty terminal. Closing a pane removes it at once, before the server's view confirms.
- Live sessions. Bootstrap, attach, and a session view driven by the server's events, with one palette (⌘K or ⌘⇧P) holding sessions, windows, commands and themes, and a tab strip of the session's windows.
- Real terminals. Each pane is a Ghostty emulator fed by the block's data
stream. The stream's snapshot is skipped and the screen is restored with
com.superlogical.terminal.format; Rex's inlineresize,themeandchild_exitedmessages are handled. Keystrokes go back asclient.key, and the pane claims the block and reports its size so the server's PTY matches the window. - Layout operations. New window, split horizontally/vertically, zoom, close, focus a window or block, all through the documented API.
- Pane tabs. Drop a pane on another pane's title bar to make the two tabs in that slot; the dropped pane becomes the visible tab and the other stays running in the background. Click a tab in the pane header to switch. The pane close button closes the active tab. Rex has no native nested tabs: the inactive tabs are detached on the server and the grouping is stored in rexnux's own settings, so other clients see only the visible tab.
- Drag tiling. Drag a pane by its header and drop it on another pane's
edge to dock it there. Drop it on a tab, the empty tab strip, or the
+button to give it its own tab; dropping on a tab places the new tab right after it. Hold it over a tab to preview that window, then drop on a pane to move the pane inside. The focused pane can also move from the palette, for the keyboard. With pane headers hidden, a narrow strip at the top of each pane stays draggable. - Renaming. Double-click a tab, or a session or window row in the palette, to rename it. Panes are not renamed: a pane's header follows the program's own title.
- Appearance. The 41 palettes and 73 design tokens Rex ships, a settings
window with the material switch (Glass / Classic), inactive-pane fading,
headers, and the theme grid. Preferences persist under
~/.config/rexnux/settings.json.
Running
go build -o rexnux .
./rexnuxA Rex server must be reachable. Start one with the rex CLI:
rex server start # or: rex server run
rex new demo -- bash # a session to look atThe client needs the rex CLI on PATH only for the Start Local Server
button; connecting to an existing socket or address needs nothing else.
Keyboard
| Shortcut | Action |
|---|---|
| ⌘K / Ctrl K | Palette: sessions, windows, commands, themes |
| ⌘⇧P / Ctrl P | The same palette |
| ⌘N / Ctrl N | New window |
| ⌘T / Ctrl T | Split right |
| ⌘D / Ctrl D | Split below |
| ⌘W / Ctrl W | Close the focused block |
| ⌘, / Ctrl , | Settings |
Development switches
These exist so the interface can be checked without a compositor's screenshot tool:
| Variable | Effect |
|---|---|
REXNUX_SHOT=/path.png | Capture the window four seconds after launch |
REXNUX_SHOT_SETTINGS=/path.png | Capture the settings window |
REXNUX_OPEN=sessions|palette|settings | Open a surface at launch |
REXNUX_SETTINGS_PAGE=appearance|panes|themes|server|about | Open that settings page |
REXNUX_ENDPOINT=host:7297 | Connect to this server instead of discovering |
REXNUX_PANEL=1 | Float the window (handy in a tiling compositor) |
Layout
main.go window creation, dev hooks
internal/theme the shipped palettes and token parsing
internal/rex control protocol, data streams, typed calls
internal/ui the interface: chrome, panes, terminals, palette,
settings, connection flow
docs/reference the build specification and reference screenshots
docs/screenshots screenshots of this clientdocs/reference/REX-BUILD-SPEC.md records what the official app does — the
API surface, the GUI map, and the measured design system — extracted from
Superlogical's site, docs and shipped app bundle. The large research corpus
(videos, DMGs, frames) stays out of git.
Known gaps
- No automatic resume when a data stream drops; reopen the pane to reconnect. (Rex's RESUME handshake is specified in the docs and not implemented here.)
- The session picker lists sessions but not per-session activity or host grouping yet.
- Pane motion and the theme editor are not implemented; the settings window covers appearance, panes, themes, server and about.
- The window's glass is drawn over an in-app desktop tone, because Linux has
no compositor material for MyGo's
Vibrancy.
License and notice
MIT licensed; see LICENSE.
rexnux is an independent project and is not affiliated with, endorsed by, or sponsored by Superlogical, the makers of Rex. "Rex" is used only to describe what this client talks to. Rex, its app, its icon set and its screenshots belong to their respective owners; anything of theirs included here for reference or compatibility remains theirs, and is not covered by this project's license.