Quick context for anyone new here: umux is an open-source terminal workspace manager. One desktop app (Tauri v2) with its own embedded terminal. Workspaces hold tabs, tabs split into as many resizable panels as you need, and an optional daemon (umux Storestation) keeps sessions alive after the window closes. Linux, Windows, macOS.
The umux CLI shipped as an offline tool. It read and wrote the saved store: list workspaces, create them, color them. Honest work, but with the app open it had exactly one move: edit the files and wait for you to restart.
v1.8.0 changes the deal. The same binary now finds the running app or daemon on one local socket and works against the live thing. Layout changes, terminal I/O and system actions execute in the app, and you watch them land. No restart. No entering the same thing twice.
umux tabs send <tabId> "cargo test" --json # lands in that tab's shell and executes
umux panes split --workspace myproject --vertical --json
umux open port <tabId> 5173 # the browser opens http://localhost:5173
umux update check --json # the Settings row's result, in your terminal
umux window minimize
Every command answers in exactly one of three worlds, and you never have to guess which:
- App alive: the command runs live and the UI moves while you watch.
-
Daemon only: session and Storestation commands keep working; app-domain commands refuse with
appNotRunning(umux attachexists for that world). - Nothing alive: the offline behavior over saved definitions, exactly as always.
One design rule holds it together: single writer. While the app or the daemon is alive, the CLI never writes the store files behind its back. Every mutation rides the socket to the side that owns the live state. A store with two writers is a store you rebuild by hand; umux has one writer per store, and the socket is the road.
Driving umux from scripts and agents: umux agent-context prints the whole surface as one machine-readable document. Every command, alias, limit, plus worked examples. 63 commands. Point your agent at that instead of the README. Ids come back in every result document, so one command's output becomes the next command's argument: create a tab, then send into it with the id you just got.
The error contract stays boring on purpose. Exit codes 0 through 5 separate ok, usage, unreachable target, conflict and internal error. Every --json failure prints one object: {"code","message","next":[…],"retryable"}. The code comes from a documented catalog and next names the move, so a script that hits a refusal knows what to do about it.
Security, because "socket" makes people nervous: one local, per-user transport. A Unix socket with 0600 permissions, or a per-user named pipe on Windows. No auth and no token because there is nothing to authenticate to: nothing binds a TCP port, so no other machine can even try. The path derives from the config directory, so UMUX_CONFIG_DIR isolates store, socket and sessions together.
Also in this release:
- The sidebar shows one agent-status line per split panel.
- Ctrl+Shift+C and Ctrl+Shift+V reach the system clipboard on Wayland.
- PTY writes leave the registry lock.
Install and build steps live in the README: https://github.com/CrystalPlatforms/umux
Full release notes: https://github.com/CrystalPlatforms/umux/releases/tag/v1.8.0
Top comments (0)