Polaris v1.3.10
Polaris v1.3.10 is an install, launch, and crash-containment patch. SteamOS 3.8 becomes installable, nested Steam sessions start again after a v1.3.9 regression, VAAPI Private Stream capture returns to the stable SHM path after a v1.3.9 crash report, private high-refresh capture holds its output rate, HDR advertisement returns on capable Mesa hosts, and Doctor stops reporting values the encoder never applied.
Important: upgrading from v1.3.9
Nothing extra is required beyond the usual package, --setup-host, and restart sequence. Existing configuration remains valid. If a VAAPI host began refusing connections or coredumping when a Private Stream started on v1.3.9, this release contains that newly enabled DMA-BUF path and restores the prior SHM behavior.
If launching a Steam game or Steam Big Picture through a nested Gamescope session started returning a 503 on v1.3.9, that is the regression described below and this release fixes it. No configuration change is needed; in particular you do not need to hand-set exit-timeout on your app entries as a workaround, and any workaround you added can be removed.
This release is especially relevant if you run SteamOS, launch Steam through Gamescope Stream, use VAAPI for Private Stream or HDR on a Mesa host, stream a private session at a high refresh rate, or have watched Doctor report a bitrate or a jitter figure that did not match what you were seeing.
Fedora 44
wget --output-document=./Polaris-fedora44-x86_64.rpm https://github.com/papi-ux/polaris/releases/download/v1.3.10/Polaris-fedora44-x86_64.rpm &&
sudo dnf install "./Polaris-fedora44-x86_64.rpm" &&
sudo -H polaris --setup-host &&
systemctl --user restart polarisArch Linux / CachyOS
wget --output-document=./Polaris-arch-x86_64.pkg.tar.zst https://github.com/papi-ux/polaris/releases/download/v1.3.10/Polaris-arch-x86_64.pkg.tar.zst &&
sudo pacman -U ./Polaris-arch-x86_64.pkg.tar.zst &&
sudo -H polaris --setup-host &&
systemctl --user restart polarisUbuntu 24.04
wget --output-document=./Polaris-ubuntu24.04-x86_64.deb https://github.com/papi-ux/polaris/releases/download/v1.3.10/Polaris-ubuntu24.04-x86_64.deb &&
sudo apt install ./Polaris-ubuntu24.04-x86_64.deb &&
sudo -H polaris --setup-host &&
systemctl --user restart polarisBazzite users should follow the exact-output rpm-ostree flow in the Bazzite guide. SteamOS 3.8 needs a pacman keyring bootstrap and a read-only restoration trap, and its install command changed in this release; follow the SteamOS guide rather than the Arch command above. SteamOS remains an experimental Desktop Mode package rather than certified Game Mode support.
Changes
SteamOS installability
- Removes
labwcfrom the SteamOS 3.8 package dependencies. Polaris links nothing from labwc, but declaring it as a hard dependency pulled in wlroots0.19, which pinslibdisplay-info.so.2. SteamOS installslibdisplay-info0.3.0, which provideslibdisplay-info.so.3and which KWin, Mesa, and Vulkan link against, so every install had to downgrade a library the desktop depends on or abort. No SteamOS install could complete. - Makes labwc an optional dependency. The Private Stream paths already reported themselves unavailable when the binary is missing, and the shipped default is Mirror Desktop, so no default behavior changes on any platform.
- Adds the pacman keyring bootstrap to the SteamOS guide. SteamOS ships without an initialized keyring, so the first transaction that had to download a dependency failed with
keyring is not writablebefore installing anything. The guide now runspacman-key --initandpacman-key --populatewhile the root is writable. - Documents which stream paths work on a Steam Deck. Mirror Desktop and Gamescope Stream are available; Private Stream is not, because labwc cannot be installed on SteamOS 3.8 without breaking Desktop Mode.
Encoder capability and HDR
- Probes VAAPI HEVC Main10 with the requested 10-bit P010 input surface. The probe previously selected the Main10 profile while feeding the encoder an 8-bit surface, an invalid pairing that made capable Mesa hosts fail the probe and suppress HDR advertisement.
- Selects HEVC Main, Main10, or RExt from the actual input format, and keeps live-session fallback behavior separate from capability detection.
Nested Steam session launches
- Fixes a v1.3.9 regression that broke every nested Gamescope launch. v1.3.9 began bounding preparation commands by the app's
exit-timeoutso that a command which never exits could not freeze the session lifecycle. That bound is correct, butexit-timeoutdefaults to five seconds on every generated app entry, and the nested Gamescope helper needs up to about forty seconds to bring up a compositor, attach Xwayland, and rebind the portal. Every launch through that path was therefore terminated mid-startup and returned a 503. This affected the HDR path as well as the SDR one. - Gives nested Gamescope startup its own 120-second budget, separate from the app's exit policy.
- Gives nested Gamescope teardown its own 30-second budget. The stop path waits up to about fifteen seconds of its own accord, so the same five-second bound could terminate it mid-drain and leave a session needing manual recovery.
- Routes nested helper diagnostics to the Polaris service journal for both startup and teardown. A nested failure previously inherited the app's output pipe and could be silent.
- Selects the nested Steam session for SDR clients as well as HDR. Nesting owns both the visible surface and input focus, so gating it on HDR meant SDR sessions attached Steam and the game to the idle compositor, where Big Picture could stay focused and be streamed instead of the game.
- Supports nested Steam Big Picture without requiring a Steam app id up front.
- Removes the unused Nix
injectAppsoption, which had never been consumed and advertised behavior it did not provide.
VAAPI Private Stream crash containment
- Restores fail-closed GPU-native capture eligibility for VAAPI on every wlroots route. A v1.3.9 field report showed that a private-headless buffer exported with
DRM_FORMAT_MOD_LINEARwas not sufficient evidence that the first live VAAPI import and conversion would be safe on the affected AMD/CachyOS stack. - Returns VAAPI Private Stream capture to the conservative system-memory path used before v1.3.9. A contained run reports
vaapi_headless_dmabuf_disabled_for_stability,capture_transport=shm, andframe_residency=cpu. CUDA/NVENC GPU-native capture is unchanged. - This is crash containment, not the 4K performance fix. The SHM copy can remain the capture ceiling at high resolutions; GPU-native VAAPI enablement stays tracked in #409 and requires a stronger safety guard plus affected AMD and Intel evidence.
Private high-refresh capture cadence
- Paces private-compositor wlr-screencopy from the compositor's own frame callbacks. Screencopy completes on an output frame, so placing a second fixed-interval timer in front of it can consistently miss the next tick and hold the capture source below the output's actual refresh.
- Keeps direct desktop capture fixed-interval, which preserves client-rate limiting on that path.
- Rechecks the current labwc mode when a session resumes.
- Reports output refresh, capture-source FPS, encoded FPS, and capture pacing as four separate values, so a cadence problem can be attributed to the source, the encoder, or the pacing rather than guessed at.
Honest runtime reporting
- Reports only adaptive bitrate targets the encoder actually applied. A rejected runtime update previously walked an internal VAAPI target down to the 2000 kbps floor while the encoder kept using the session bitrate, and Doctor surfaced that phantom value as live state.
- Exposes whether an encoder supports runtime bitrate updates, enables live adaptive control only where it can be applied, and disables the live controller when an update is rejected.
- Separates Doctor's backend detection from configuration readiness, so a detected but unconfigured KDE backend no longer looks like missing software, and gives backend-specific configuration guidance.
- States that Private Stream does not require the Virtual Display path.
- Filters expected encoder-probe failures only inside the explicitly safe probe window, and reports target interval error and target FPS gap separately from network jitter, so a steady half-rate source is no longer labeled a network problem.
Field-validation limits
- The SteamOS dependency fix is reasoned from the released package, the shipped binary's dynamic dependencies, and Valve's
holo-3.8.1xandextra-3.8.1xpackage repositories. It was not run on a Steam Deck. Continuous integration builds the SteamOS package inside a clean bootstrapped root, which by construction cannot reproduce a conflict against an already-populated device image, so it did not catch the original problem and does not prove the fix end to end. Confirmation still needs hardware. - SteamOS support remains scoped to Desktop Mode. Game Mode, gameplay, OLED 90 Hz behavior, suspend and resume, and persistence across SteamOS updates are all uncertified.
- The VAAPI HEVC Main10 probe fix is unit and sanitizer tested. Restored HDR advertisement on an affected Mesa host still needs hardware confirmation.
- Adaptive bitrate reporting is unit tested against encoders that accept and reject runtime updates. The corrected live behavior still needs an affected-host session.
- The VAAPI containment is covered by exact-head Linux builds, sanitizer tests, and policy/source contracts, but the #367 reporter has not yet confirmed that the same Private Stream launch stays running with
capture_transport=shm,frame_residency=cpu, and no new coredump. This release must not be described as affected-host validated until that evidence arrives. - The nested Gamescope fixes are unit, contract, and sanitizer tested, and the timeout regression is reasoned directly from the helper's own readiness budget against the five-second default. An end-to-end nested launch on an affected NixOS or SteamOS host is still wanted.
- The private high-refresh pacing fix was measured on maintainer hardware that does not reproduce the reported fault. On an RTX 4090 with a 120 Hz client, it raised encoded cadence from roughly 116 to 120 FPS against a 120 Hz output on the affected code path, which shows the mechanism working and no regression. The reported symptom is roughly 60 FPS, which that host never produced on any capture path, so this is not affected-host validation and #434 has not been confirmed closed by its reporter.
- The Nix
polaris-streampackage now builds in continuous integration, for the first time in the v1.3.x line. That is a new gate rather than a validated one: no previous release had a verified Nix package build, so the first green run is the baseline, not a regression check. - Other field gates recorded in v1.3.9 remain open: Hyprland virtual-display ownership and same-mode session normalization need affected-host confirmation, and the Gamescope Stream route needs an end-to-end portal retest.
Official assets
Polaris-arch-x86_64.pkg.tar.zstPolaris-fedora44-x86_64.rpmPolaris-steamos3.8-x86_64.pkg.tar.zstPolaris-ubuntu24.04-x86_64.deb