DEV Community

Crystal Studio
Crystal Studio

Posted on

We built a free terminal manager for 3 platforms. Four days later it imports cmux setups

v1.0.2 shipped on August 27. It was the first release with native builds for all three platforms. Four days later the tree sits at v1.0.4, with 26 commits and two releases in a single day behind it. Here is what went in.

Landing: https://umux.pages.dev
GitHub: https://github.com/CrystalPlatforms/umux

The first feature after launch was a door out of cmux

cmux is the closest project to umux, and a good one: macOS only. Launching a cross-platform alternative and waiting for people to switch is the obvious move. But switching means rebuilding your workspace setup by hand, and my bet is that cost kills more migrations than missing features do. So the importer came first.

It reads cmux's state strictly read-only and builds a plan: workspaces, groups, sidebar order, working dirs, tabs. You preview the plan before anything lands. umux import cmux --dry-run prints the resolved tree and writes nothing. Name collision? Nothing gets overwritten. "api" becomes "api from cmux". Taken too? "api from cmux 2".

Two implementations exist. The in-app wizard is TypeScript, the CLI command is Rust. A parity suite keeps them honest: golden JSON fixtures of cmux state, one expected plan, and a test that goes red the moment the two drift apart.

The app updates itself, for $0

v1.0.3 added in-app updates. The app checks at startup, and one click downloads, verifies and relaunches. The update bundles carry a minisign signature, and the app verifies them before install. The installers themselves stay unsigned. Code-signing certificates cost money, and this project's whole budget is $0. Same for the update server: it is GitHub Releases. The free CDN that serves the installers also serves latest.json to every running copy.

The CLI rides in every installer

v1.0.4 put the umux CLI on PATH in every installer, Windows included. It works offline against the same store the app uses. umux list prints your workspaces as JSON, umux new, rm, rename and split edit them, and umux export writes a neutral backup format. One more: umux notify shows a desktop notification with the app closed. Your cron jobs can use it too.

curl | sh, with a test suite

The newest piece is install.sh. One line on macOS or Linux:

curl -fsSL https://raw.githubusercontent.com/CrystalPlatforms/umux/main/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

213 lines of POSIX sh. There is no jq dependency; the script parses the GitHub API response with sed. On macOS it mounts the universal .dmg and copies the binary out of the app bundle. On Linux it opens the .deb in place with ar and tar and extracts usr/bin/umux. Nothing lands outside the install directory (~/.local/bin by default).

The odd part: the script has its own Vitest suite. 102 lines that invoke sh install.sh --dry-run the same way a user's pipe would, kept deterministic through the script's own environment hooks so the tests never touch the network. One test guards a real gotcha: release tags are v-prefixed (v1.0.4) and asset filenames are not (umux_1.0.4_universal.dmg), so a user pinning either form must land on the same file. The real download path got verified by hand on macOS against v1.0.4. Both the .dmg mount and the .deb extraction produce a working umux --version.

Also landed

Workspaces nest into groups now: a tree in the sidebar, drag & drop, multi-select, and a collapsed-group badge that shows how its AI agents are doing. The landing page got a proper install section and a new logo. Tests: 722 across frontend and Rust, up from 449 at launch, all green on today's HEAD.

The honest list

Import does not work on Windows yet. Agent status (working, needs attention, idle) is the roughest feature in the app; the completion notification is the solid part. X11 sessions are untested; Wayland is the reference platform.

The app itself: .deb, .AppImage and .rpm on Linux, a universal .dmg on macOS 11+, an NSIS installer on Windows 10+. MIT licensed, no accounts, and one anonymous app-open event is the entire telemetry.

Landing: https://umux.pages.dev
GitHub: https://github.com/CrystalPlatforms/umux

If you run cmux on a Mac and ever wondered what your setup would look like somewhere else — the dry-run is non-destructive by design.

Top comments (0)