Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions docs/release-notes/0.6.23.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
**This release fixes the duplicate Apollo after Restart, makes Quit a real quit, and fixes the installer's close-Steam command.**

## What was happening

- **Restart in a seat's Apollo web UI left two Apollo processes running** (issue #124). Both ran on the seat's ports. The service launched a second Apollo while Apollo's own restart child was still alive. This reproduced on 0.6.21 and on 0.6.22, so it is older than this release.
- **Quit did not stay quit** (issue #124). With a console, Apollo exits with code 0 on both Restart and Quit, and the service cannot tell that from a crash. By the code, it starts Apollo again within about 5 seconds. This was read from the code, not measured.
- **The installer printed a close-Steam command that failed** (issue #126). When an isolated Steam blocked an upgrade, the command had `SteamHook.dll` after `--steam` instead of `steam.exe`. The launcher printed its usage text and did nothing.

## What changes

- **The seat's Apollo now starts with no console window** (#128). It is launched with `CREATE_NO_WINDOW`, and the service keeps the process handle so it can read the exit code. With no console, Apollo acts as it does under its own Windows service. Restart exits with 0 and starts nothing. Quit exits with 1115.
- **The service reads the exit code and acts on it.**
- **Quit (1115)** leaves Apollo stopped. The seat shows a message and the Start button. No restart attempt is used.
- **Restart (0)** relaunches Apollo without using a restart attempt. An exit 0 within 30 seconds of launch is counted, so a loop cannot run forever.
- **Any other exit** is a crash and counts against the three restart attempts, as before.
- **A Quit or the dashboard's Stop holds.** It holds through a session drop and through the reconnect after sleep. Start, Restart, reprovision and teardown clear it. It is kept in memory only, so a service restart or a reboot starts seats as usual.
- **Strays are ended.** Before every Apollo start and at the end of every stop, the service ends any `sunshine.exe` that runs this seat's exact config path. Other seats' Apollo and the console Apollo never match.
- **A change to the NVENC preset, resolution or scale restarts Apollo through the normal start path.** On a seat whose Apollo was stopped by the user, this brings Apollo back and clears the stop.
- **The installer's close-Steam command names `steam.exe`** (#127). Each process entry now has an `ImagePath` field with the process's own exe. It is read from the process, with a `Win32_Process` fallback, and is null when neither works. The message uses the first steam entry whose `ImagePath` ends in `steam.exe`. If there is no usable entry, the message keeps the `<path to steam.exe>` placeholder. `Path` is unchanged.

**This reverses the #120 and #121 choice to keep the console, on purpose.** Those changes kept the console so Apollo's Restart and Quit would work as before. That console is the cause of the duplicate. What this means for you:

- There is no Apollo window on the seat at all now.
- The minimized-window setting from #121 is kept. It does no harm, and it still helps if the Apollo exe is ever a GUI build.
- After a Quit, the seat stays in the Moonlight host list but cannot be connected to. Start Apollo from the Apollo row in the dashboard.

## How this was checked

**The Apollo change, live.** On a seat on 2026-10-21, on a build of 0.6.22 plus the #124 service files (`0.6.22+321ea0fe2`):

- Restart from Apollo's web UI left exactly one Apollo, with the service as its parent. No restart attempt was used. The same test before the change left two.
- Quit left Apollo stopped for the 70 seconds watched. The service logged exit code 1115.
- Start brought one Apollo back.
- A game ran in the seat's session at about 20% video encode. Apollo kept writing its log with no console.
- Force-killing Apollo made the service relaunch it within a few seconds. The restart count went from 0 to 1.
- The console Apollo's process and start time did not change at any step.

**Unit tests.** CI passed on `master` after both changes. The suite on the #128 branch finished with 1702 passed, 18 skipped and 0 failed. The tests cover the launch flags, the exit-code rules, the health-check decision, the restart limit, the config-path match (including a near-miss seat name and the console Apollo) and the stopped-by-user marker. The installer message has tests for a holder whose `Path` is the hook DLL, a holder with no `ImagePath`, a DLL-image entry listed before a real `steam.exe`, and a real running process in a temporary `SteamIsolation` folder.

**Not verified:** a real sleep and wake after a Quit (unit-tested only; the dashboard's Stop uses the same code). The WMI step that ends strays was not run against a real stray, and only its path matcher is unit-tested. The #127 installer message was not re-run against a live isolated Steam, because the tests use a stand-in `steam.exe`. The 32-bit `steam.exe` fallback is unexercised.

## Known limitations

- **With Apollo stopped by a Quit, the Moonlight client still lists the seat but fails to connect** until Apollo is started from the dashboard.
- **In one test, Steam stayed up for about two minutes after the installer's close command**, with a game running (issue #126). The cause is not known and this release does not change it.
- **On at least one host the scale override is still ignored** (issue #93). This release does not change that.
- Seats capture the remote desktop surface, not a dedicated virtual display. A Windows constraint, not a regression.
- Steam isolation is experimental and off by default.

## Install

```powershell
.\prerequisites\install-prerequisites.ps1 # drivers - needed either way
.\scripts\install-service.ps1 -FromZip .
```

Afterwards, confirm what landed:

```powershell
& 'C:\Program Files\MultiSeat\MultiSeat.Service.exe' --config
```

It should report `0.6.23`.
2 changes: 1 addition & 1 deletion version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.6.22
0.6.23
Loading