Repository navigation
Releases
v0.9.0
Added
-
Version-skew marker in the TUI status bar (#852). While
the daemon's version and the client's differ, the workspaces
status line carries a warning-colored marker after the URL
naming both versions (msksd 1.2.3 ≠ client 1.2.4); the
CLI's one-line notice with its remedy keeps its own behavior.
The marker refreshes on the listing's five-second reload, a
/healthconnection that fails leaves the standing marker in place,
and the marker leaves when the versions agree. The URL and the
state summary crop before the marker does, so the marker stays
visible at 80 columns. -
Open-shell counts in the TUI (#858). Every interactive
msks sshwrites a heartbeat session record under
~/.local/state/msks/sessions(relocatable with thestate_dir
key /MSKSC_STATE_DIR), and the workspaces list shows the live
count beside a row's status word (»2) and on the detail strip
(shells »2); the workspace page's header carries the count
beside the status (2 shells open). The count covers the shells
open on the host the TUI runs on, survives a tree restart, and a
session killed without cleanup stops counting about twenty
seconds after its death. Windows the tree opens carry the
workspace's name and the session record's five-character token in
their title (msks tree-vm f8x2n); a later release will use the
token to match a session to its window. -
Detail strip at the bottom of the workspaces list (#849).
A two-line strip renders at the bottom of the listing's box
and carries the focused workspace's quick facts: name, id,
image, cpu count, memory, egress mode, the mounts-issue count,
and the storage the workspace charges the state disk (the same
root-plus-home costmsks storagereports). The strip follows
the selection and refreshes on the list's standing cadence;
the storage figure uses a cached capacity report, so moving
the selection costs no roundtrip. An empty list hides the
strip. -
State summary in the TUI status bar (#853). The workspaces
count now carries a summary of the fleet's states:
4 workspaces · all stoppedwhen every row holds one state,
or each state's count (4 workspaces · 1 running 3 stopped)
when they mix. The summary follows the standing five-second
refresh. The daemon's URL comes after the summary, and it crops
first when the terminal runs narrow. -
?key overlay in the TUI (#851). Every page of the tree
answers?with an overlay listing that page's bindings,
hidden ones included (the escape leaves among them), each with
its action label. Any key closes the overlay. The footer stays
as it was. The overlay is where the full key list lives. -
Sortable listing columns in the TUI (#854). Clicking a column
header in the workspaces list sorts by that column; clicking the
active header flips the direction, and the arrow in the header
shows the active sort. CREATED sorts by creation date (newest
first by default), STATUS in lifecycle order, the other columns
by their text. You sort by clicking a header; the keymap stays
as it was, and the sort holds across the standing refresh. -
Agent reference card (#842).
msks agent-cardprints the agent
reference card: one markdown text grouped by task (read state,
lifecycle, run inside, egress consent) with the status vocabulary
and the exit-code table whole. The same text is the
Agent Reference Card
docs chapter. The card covers the status vocabulary, the exit-code
table, and the non-interactive egress-consent flow. -
Machine-readable CLI (#841). Every printing
mskscommand takes
--json: the mutating commands emit the affected workspace row as one
JSON document (create,clone,start,stop,resize,mount,
umount;rmprints one JSON line per removed id), the read commands
emit their documents, and failures print
{"error": {"status": ..., "detail": ...}}on stderr. The exit codes
are a documented table (docs/cli.md): 3 not found, 4 name conflict,
5 wrong state.msksd doctor --jsonprints its check rows as one
document. Human output is unchanged. -
host.msks(#816). Every egress workspace's resolver answers the
name with its own tap address, so a guest connects to the gateway by name
(https://host.msks:8660with a-R 8660:localhost:8660proxy stored)
instead of discovering it throughip route show default. The name
answers in every consent mode, feeds no policy row or address pin, and
a well-formed internet-class query for it is never sent upstream. -
The proxies docs chapter (#814).
docs/proxies.mdowns the whole
proxies story in one place: the persistent proxy port concept, the
-L/-Rdirections in ssh's grammar, the live status vocabulary, and
worked examples for both the CLI and the TUI. The networking, CLI, and
TUI chapters link to it where they introduce proxies. -
The TUI's proxies page (#809, part of #807). Each workspace's
page opens its own proxies page (the action row, orp), which adds
and removes that workspace's persisted-L/-Rproxies with the
same spec grammarmsks proxy addreads, and shows live status —
refreshed on every proxy transition the daemon publishes beside a
five-second standing re-read. The workspace page carries a compact
port-pair line (8888 -> 8889 | 8881 <- 8882), each pair green
while it listens and red while its bind refused. -
msks proxy(#808). A new command manages the daemon's
persisted workspace proxies:addwith ssh's own spec shape
(-L [BIND:]PORT:HOST:PORTbinds the daemon host and bridges to
the workspace;-R RPORT:HOST:TPORTbinds the workspace's
gateway and bridges to a daemon-side service),lswith live
status, andrm. The daemon owns every listener, rows live in its
database, every workspace start re-establishes them, andadd
is idempotent for an identical spec. Part of #807.
Changed
-
The workspaces list's ID column (#849). The EGRESS column
became an ID column: each row carries its immutable workspace
id. The egress posture reads on the detail strip instead,
beside the row's other facts. Clicking the ID header sorts by
the id itself; the NAME header keeps the name sort. -
Graded status colors in the TUI listing (#850). The
workspaces list colors the status column by state class:
runningkeeps the success color,stoppedandcreated
render in the muted text color,starting,stopping, and
pausedin the warning color, andabsentandunknownin
the error color. A fleet at rest reads calm. The transitional,
paused, or lost row is the one the eye finds. The✗Nmounts-issue
marker keeps the warning color beside whatever color the
status word takes. -
The arm64 stop caveat is documented (#826). cloud-hypervisor's
arm64 power button (the PL061 gpio key) delivers only the first
press, so amsks stopcannot rescue a lost press by re-pressing.
The fallback kill at theMSKSD_SHUTDOWN_TIMEOUT_Sdeadline carries
the stop instead. Size that setting to cover the guest's slowest
clean shutdown. A value above 120s outlives the client's wait, and
the client reports a timeout while the daemon still finishes the
stop.
Breaking
terminal_title/MSKSC_TERMINAL_TITLEremoved (#858). The
window title template setting is gone; every terminal window msks
opens for a workspace shell now carries one fixed title,
msks <workspace-name> <token>, and windows msks does not open keep
the terminal emulator's own title. The client refuses a config
file that still carries theterminal_titlekey, on every
command, until the key is deleted — delete it from your
msks.yamland unset the variable. The refusal names the key.
Fixed
-
The legacy create default cmdline (#833). A create with
explicit kernel/rootfs paths and nocmdlinenow boots with
this host's console device in the default:ttyAMA0on an
aarch64 daemon,ttyS0elsewhere. The console answers on
both; the catalog-record path was already per-arch and is
unchanged. -
msks doctorqemu-kvm apk hint (#832). The hint now
prints this host's Alpine emulator package:
qemu-system-aarch64on an aarch64 host,
qemu-system-x86_64elsewhere. -
msks doctorcloud-hypervisor install hint (#831). The
hint now prints this host's release assets: the-aarch64
builds on an aarch64 host, the unsuffixed x86-64 builds
elsewhere. The installation chapter states the same
architecture distinction beside its install block, and
installsch-remoteunder the unsuffixed command name the
demo and dev tooling calls. -
Egress slice release on a failed teardown (#828). A
detach
whose table or tap delete raised left the workspace's slice
claimed with no retry path, so the nextmsks startwas refused
with "held by another live workspace" until the daemon
restarted. A failed teardown now leaves a record the
workspace's next stop or start retries, and the slice releases
when that retry completes. -
Workspace starts after a guest-initiated poweroff (#825). A
VMM that exited outside the stop flow — the guest's ownpoweroff,
or a guest landing its shutdown just past a stop deadline — left a
stale entry that refused every latermsks startwith "VM already
exists" until an operator passed astop. The start now reconciles
the dead VMM's residue (its tracked entry, share daemons, and tap)
and boots. -
Fedora guest's sshd address-wait wiring (#819). The Fedora
image's sshd ordering dropin now lands insshd.service.d(Fedora's
own unit names) instead of Debian'sssh.service.d, so
msks-wait-address.serviceactually runs on a Fedora egress
workspace and sshd listens once the NIC has its address. The image
build fails when the wiring names a unit the image does not ship. -
*...
fedora aarch64 image (e7af55a9e0f1)
debian aarch64 image (e3be6765b5e1)
fedora x86_64 image (a4ffa33bcc75)
nixos aarch64 image (774b1d3f6552)
debian x86_64 image (6ef2f0c789a5)
nixos x86_64 image (3fc8f4251f7a)
v0.8.3
Fixed
msks sshafter a host-share change (#803). A changed mount
set renews the workspace's seed at the next start, and the
re-provisioning guest regenerates its ssh host keys. The
workspace's identity row now serves a seed epoch (a counter,
one bump per bake or renewal), and the client rotates its
host-key pin on it, so the next session re-pins the new key
instead of refusing it.
What's Changed
Full Changelog: v0.8.2...v0.8.3
v0.8.2
Breaking
- The
clientflake output is gone (#793). The flake's
clientpackage and devenv'soutputs.clientare removed.
The wheel installs every console script, somsksd(the
default flake output) andoutputs.servercarry the client CLI
in the daemon closure. Install.#msksd(or.#server/
devenv build outputs.server) for everything theclientoutput
andoutputs.clientused to provide. Wheel installs with pip or
uv do not change.
Added
- The Debian image ships apt list state; the NixOS guest turns
on nix-command and flakes (#783). A fresh Debian workspace's
firstapt-get installresolves with no update run — the image
stages the trixie main InRelease and Packages index under the
names apt itself derives. The NixOS guest's nix.conf enables
both experimental nix features, so a flake-carrying checkout
builds before any per-user override. - Workspace rows read
stoppingthrough a stop's graceful
window (#789). A stop request now writesstoppingbefore
the graceful shutdown begins, somsks lsand a second TUI
see the truth for a window that lasts up to the shutdown
timeout. The row lands onstoppedwhen the shutdown finishes,
and returns to the status it carried before the stop when the
shutdown times out. A daemon crash mid-stop heals on the next
watcher scan, and the gates that read the status (volume
moves, resize, clone) refuse while the row readsstopping.
The TUI's stop action dims with "workspace is stopping", and
the attach commands (msks ssh,msks console,msks forward,
msks rsync) wait out the window instead of booting into the
shutdown.
Changed
-
New workspaces default to 4 vCPUs (#791). A create that
leaves the count unset boots 4 vCPUs, up from 2. The 1–64 bound
is unchanged, an explicit--cpusstill wins, and existing
workspaces keep their stored count. -
shutdown_timeout_sdefaults to 90 seconds (#787). A
workspace stop now waits up to 90s for the guest to power off
(was 20s). An idle guest still answers in seconds.
MSKSD_SHUTDOWN_TIMEOUT_Sstill overrides. The dev daemon's
supervised stop grace moves to 180s to cover the longer stop
cycle, matching the product unit's window. -
New workspaces default to a 20 GiB root overlay (#784). The
create default forroot_mibmoves from 10240 to 20480 on every
surface (TUI create form, CLI, API) — NixOS guests' nix store
outgrows 10 GiB after a few rebuilds.MSKSD_ROOT_MIBstill
overrides the default, an explicit size on create still wins
over both, and existing workspaces keep the size they were
created with. The create form's root placeholder names the
daemon's real default on every healthy load (it always did for
home), and the first-run config template'shome_mibcomment
now states the real 20480 default (it read 2048). -
The create form's image dropdown shows the import date and
sorts newest-first (#781). Each option now carries the import
date beside the reference, and the options order by distro name
A→Z with each distro's newest build first — the newest build of
a release leads instead of the oldest. The designated default
row is marked with a trailing asterisk (the blank option's own
line names the marker), where it read "— default" before.
Options for the same reference still resolve by hash, and the
plain reference still names the build the daemon itself
resolves it to.
What's Changed
- Show import date in the create form's image dropdown and sort newest-first (#781) by @mcdonc in #782
- Bump the default root size for new workspaces to 20G (#784) by @mcdonc in #786
- Raise the default shutdown timeout to 90 seconds (#787) by @mcdonc in #788
- Honest stopping status for workspaces mid-stop (#789) by @mcdonc in #790
- Raise the default workspace vCPU count to 4 (#791) by @mcdonc in #792
- Collapse the client and msksd flake outputs into one derivation (#793) by @mcdonc in #794
- Ship apt list state in the Debian image; enable nix-command and flakes in the NixOS guest (#783) by @mcdonc in #802
Full Changelog: v0.8.1...v0.8.2