Repository navigation
release: 0.6.20 - #112
Merged
Merged
release: 0.6.20#112
Conversation
Bump version.txt and finish the 0.6.20 notes: drop the DRAFT block, record what was verified live (the new installer on a self-contained folder; update notifications on and off, with a real GitHub check from the SYSTEM account), and say plainly that one reporter's host still ignores the scale override. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This release adds optional update notifications (off by default) and makes the source-build installer safe on a host whose install folder was once self-contained.
What was happening
scripts\install-service.ps1built from source withdotnet publishstraight intoC:\Program Files\MultiSeat.dotnet publishcopiesMultiSeat.Service.runtimeconfig.jsononly when the source file is newer than the one already there. On a folder that had been self-contained, that left a hybrid: a framework-dependentruntimeconfig.jsonbeside the oldhostfxr.dll. The host then looked for a bundled runtime the config no longer declared, and the service failed to start withNo frameworks were found(service control manager errors 7000 and 7009 after a 30 second timeout). It looked like a missing .NET runtime. The host had one installed.The first publish onto such a folder could also pass by accident. The old self-contained config was newer, so it survived, and the new files ran on the leftover bundled runtime. Only a later publish broke it.
What changes
-FromZipuses to replace the install folder as a whole.MultiSeat.Service.exe,appsettings.json,wwwroot\index.html, and a runtime layout that agrees with itself. A payload is consistent whenhostfxr.dllis present exactly whenruntimeconfig.jsonhasincludedFrameworks, and a framework-dependent payload carries no bundled runtime files. The installed folder gets the same check after the copy. A mismatch fails with the exact reason.runtimeconfig.jsondemands (Microsoft.NETCore.App,Microsoft.AspNetCore.App) and compares them with the host's .NET install under the normal roll-forward rules. If one is missing, the installer stops before it stops the service, and says what to install or to use-FromZipinstead.C:\ProgramData\MultiSeat\install-backups\<timestamp>. The newest three are kept.config-backupsandinstall-backupshold copies ofappsettings.local.json, which can carry the API key. They inherited ProgramData's permissions, so any standard user on the host could read them. They are now limited to SYSTEM, Administrators and the account that ran the installer. Existingconfig-backupsfrom earlier installs are covered too.appsettings.jsonandappsettings.local.jsonare now kept byte for byte, as-FromZipalready did. A newerappsettings.jsonin the repo no longer replaces yours. Settings the build adds that your file lacks are listed during the install.//comment lines in the shippedappsettings.jsonand printed the whole file as an error note instead.scripts\lib\install-lib.ps1, which the installer loads.New: optional update notifications (off by default)
MultiSeat can now tell you on the dashboard when a newer MultiSeat, ApolloVibe or MoonlightVibe release exists. It is off unless you turn it on, because it is the first time the service would contact the internet. If you turn it on (
"UpdateCheckEnabled": trueinappsettings.local.json, or the switch on the System page), the service asksapi.github.comfor each project's release list about every 12 hours (UpdateCheckIntervalHours). It sends a generic User-Agent and nothing about your host. It never downloads or installs anything; it shows the release link, and you update by hand (see "Updating" in the README). Details:docs/security-posture.md, "Outbound connections". MoonlightVibe runs on your other devices, so MultiSeat cannot tell which version they have; it only shows the latest release.If you upgrade with
install-service.ps1 -FromZip, your existingappsettings.jsonis kept, so the new options are named by the installer and nothing changes until you opt in.GET /api/system/updates,POST /api/system/updates/check(at most once a minute) andPOST /api/system/updates/settings.C:\ProgramData\MultiSeat\update-check.json, readable only by SYSTEM and Administrators. It is safe to delete.How this was checked
The installer, live. It was run for real on a host whose install folder was self-contained, which is exactly the situation that used to break the service. The source build staged the payload, verified it, checked the host's runtimes, stopped the service only after that, backed up the config files and the whole folder, replaced the folder, restored the config, and confirmed the installed folder is consistent. The service came back running, framework-dependent, with no
hostfxr.dllleft. The new backup folders were limited to SYSTEM, Administrators and the installing account, and the list of settings the build adds was printed correctly.Update notifications, live. On the same host:
2026.6.1-ms6by the SHA-256 of itssunshine.exeand read as up to date, and MoonlightVibe showed the latest release only, labelled as not tied to a client.update-check.jsonwas readable only by SYSTEM and Administrators and held no host name or user name.appsettings.local.jsonfrom the dashboard switch kept its access list and owner. Only the file's primary group field changed, which Windows does not use for access checks.Tests. The full suite passes, and each new group was mutation-checked. The tests for timing-dependent code prove that the reader and writer overlapped instead of hoping they would, after one such test failed on a slow CI runner.
Not verified: a check behind a proxy, the failure and offline paths on a real network, the dashboard in a real browser (layout at phone width and the notices), and the settings switch on a host whose
appsettings.local.jsonhas a custom access list.Known limitations
Install
Afterwards, confirm what landed:
It should report
0.6.20.🤖 Generated with Claude Code