This cycle ran bugs first, features second, both in one version. The bugs came from a real machine. The features came from using the app.
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, every tab splitting into as many panels as you need. The idea the app is built around: umux reads the completion signals that AI CLIs emit when a long task finishes, and turns them into a desktop notification.
v1.7.6 carries three interface changes and one deleted crash class. Interface first, because that is what you see.
The interface
Scrollbars now appear only while you scroll: they show up, they show where you are, they fade when you stop. One shared module styles and flashes them across every scrollable region: the sidebar, the Settings card, the tab bar, the import preview, the dialogs. The terminal pane keeps its own bar, on purpose.
Tabs learned multi-selection. Ctrl+click toggles a tab into the selection, Shift+click takes the range, a plain click or Escape clears it. With two or more tabs selected the context menu grows group actions: close all selected, drag them together with their order kept, or move the whole group to another workspace. Working directories and live sessions travel with the tabs, the same way a single-tab move already worked.
The selection logic is a pure reducer: toggle, range, clear, group reorder, move. The UI attaches a context menu and drag behavior to it and stays out of the state business. And Settings now shows the installed version next to the update status, in both of its states.
Seven seconds
Between 1.7.5 and this release, one Windows machine killed the app on every start. The app came up, lived about seven seconds, and was gone. Always the same, and only while a Storestation daemon was alive.
The trail ended in the autostart entry. It pointed at a daemon built from the dev tree during earlier testing, and it had outlived the testing that left it there. The installed app was 1.7.5. The daemon it met at startup was older. The meeting was fatal.
The same machine carried two more pieces of rot. At every login a console window flashed and stayed, because Windows Terminal, now the default terminal host, draws its own window and ignores the daemon's request to hide. And umux --version reported 1.0.2: a copy of the CLI from another era, installed once by hand with cargo, still winning PATH over the bundled one. The app was current. The machine was not.
The attempt measurement killed
The obvious fix for the console window was to rebuild the daemon with no console at all. A GUI-subsystem process opens no window, ever, by construction. It was implemented. Then it was measured, and the measurement reversed the decision.
At a live PowerShell prompt the shell reads the keyboard in raw mode. Ctrl+C never becomes a console-wide event, so an attached daemon never hears it. The same daemon stops on a generated console event the moment the prompt is not reading. That is the difference between a daemon that stops when you ask and one that ignores you, and it fails the oldest requirement a terminal program has. So the binary went back to the console subsystem.
What shipped instead: the daemon keeps its console, the autostart entry wraps it in a headless console host that draws nothing, and the app spawns it with the no-window flags. From a real terminal the commands print as they always did. From a console-less launch, output routes itself: real handles print, an attachable parent console prints through, and dead handles get nothing, so no verb panics on a closed stream.
Deleting the class
Fixing one crash leaves every crash of the same shape alive. So 1.7.6 removes the shape.
The greeting between app and daemon now compares versions. An older or incompatible daemon gets stopped and replaced with the daemon bundled with the app, and nobody has to do anything. If even that fails, Settings shows a card that says what happened. The abort path is gone. The specific panic lived in how the app moved pipe work across its async workers, and that work runs elsewhere now.
Autostart defends itself in both directions. Dev builds refuse to write the entry, so testing can never poison it again. A release install verifies the entry at startup and rewrites it when it points anywhere but the installed daemon, which is what heals already-poisoned machines on update, no registry editor involved.
The lying CLI got the same honesty. The shadowing copy came off that machine by hand; everywhere else, a failing umux attach now names the lookup command, so the next stale copy announces itself instead of winning in silence.
Shipping
1.7.6 rides in the five regular installers: the .deb, the .AppImage, the .rpm, the NSIS installer and the universal .dmg. Free, MIT, no accounts.
The honest list
The no-window guarantee is Windows work; the autostart self-check runs on all three systems and changes nothing where nothing was wrong. Scrollbars stay out of the terminal pane, by decision. Import from cmux still does not work on Windows. X11 sessions are untested; Wayland is the reference.
Landing: https://umux.pages.dev
GitHub: https://github.com/CrystalPlatforms/umux
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.