It has been quiet here for two weeks. This release is what the quiet went into.
Landing: https://umux.pages.dev
GitHub: https://github.com/CrystalPlatforms/umux
umux is a free, open-source terminal workspace manager for Linux, Windows and macOS. One workspace per project, tabs inside it, and every tab splits into as many panels as you need. The feature the app is built around: umux reads the OSC 9;9, 99 and 777 escape sequences that AI CLIs like Claude Code emit when a long task finishes, and turns them into a desktop notification.
v1.6.2 taught the app to notice when an agent stops mid-task. v1.7.0 ships the thing the last post promised and deferred: a daemon that lets sessions outlive the window. The last release note ended on "it can wait". It couldn't wait: the daemon that post called Core ships as umux Storestation.
The daemon
Off by default, and off is exactly v1.6.x: the app owns its shells, closing it ends them, byte for byte the old behavior. Switch Storestation on in Settings and ownership moves. A small headless binary serves one local socket and owns every session. The desktop app becomes a view on work that lives outside it: close every window and the shells keep running, an agent halfway through a task keeps going, and the output keeps growing into a scrollback you can read later.
Settings keeps its main page short. umux Storestation is one entry there; opening it swaps the whole page for just the two switches, daemon and autostart, plus the live status line. Factory reset got the same room, so the main page stays a list of doors instead of a wall of switches.
attach
umux attach is the way back. Run it from a terminal and it launches the app bound to the daemon's living sessions, or focuses the one already open. An offline daemon is an honest failure: attach explains that nothing is running and exits. The whole point is coming back after minutes or hours and finding the work where you left it.
The headless surface
The CLI drives Storestation with no window anywhere in the loop:
-
umux statusanswers with the daemon's health. Offline is a state, not an error: it exits 0 and says so. -
umux status --jsongives the machine-readable document: running, version, pid, uptime, sessions, attached clients. -
umux sessions listprints the live sessions the daemon owns. -
umux agent-contextdescribes the CLI itself as data, so scripts can discover the surface instead of parsing help text.
Exit codes follow one catalog across both binaries: 0 ok or offline, 2 usage, 3 unreachable, 4 already running, 5 internal. A second daemon refuses to start with that 4 instead of half-starting.
Lifecycle discipline
Three rules carry the whole design. A clean stop terminates every owned shell, so stopping the daemon never leaves orphan processes behind. A hard kill does leave a trail, and the next start detects the leftovers and sweeps them. And the socket decides liveness, never the pid file, so a crashed daemon's stale files cannot fake a running one.
Autostart at login ships natively per platform: a systemd user unit on Linux, a LaunchAgent on macOS, and a Run key on Windows that launches with a hidden console, because a console binary launched at login would flash a window on every boot.
It ships in the installers
Enabling Storestation never means installing something extra. All five packages, the .deb, the .AppImage, the .rpm, the NSIS installer and the universal .dmg, carry the daemon beside the CLI. The macOS PATH line covers both binaries, the Linux package drops it in /usr/bin, and the plain-CLI install script installs it too. An app update replaces the daemon together with the app: one version number for the whole workspace, and umux status reports it.
The storefront shows the real thing
The landing page spent the release with grey placeholders standing in for screenshots. They are gone. Four real shots are in, one per feature tile: workspaces, the terminal, the updates settings, the cmux import wizard. The SSH tile took a different road: rather than ship a stand-in image, it goes without one, at the end of the feature list. A placeholder on a public page is a promise to fix later, and later had arrived.
The numbers
Twenty-three commits since the last post, 134 files, about 12,100 lines added and 5,100 removed. The frontend suite sits at 739 passing tests. The Rust side runs 282 of them across 21 suites, most of them new in this release: protocol, lifecycle hardening, reattach, live session lists, attach resolution.
The installers: .deb, .AppImage and .rpm on Linux, a universal .dmg on macOS 11+, an NSIS installer on Windows 10+. MIT licensed, no accounts. The in-app updater picks 1.7.0 up on its own.
Landing: https://umux.pages.dev
GitHub: https://github.com/CrystalPlatforms/umux
Top comments (0)