Skip to content

Polaris v1.4.13

This release is about installing, updating and uninstalling Polaris, and the first piece lands here: a beta channel, so packaging changes reach the people who volunteered for them before they reach anyone’s working setup. Turning DRM/KMS capture back off is one command now instead of three, and there’s a new codec to try if you’ve got a wired link. Nova 1.4.13 is out too! Your existing settings, paired devices and Spaces keep working.

Betas, only if you ask for them

Opt in and packaging changes reach you first. Don’t, and a beta never will.

  • A release can go out early as a beta, tagged v1.4.13-beta.1 and marked as a prerelease. It carries the version it’ll ship as and reuses that release’s notes.
  • A beta never reaches anyone who didn’t ask for it. GitHub keeps prereleases out of releases/latest, the package repositories never serve one, and Polaris only mentions one when PreRelease Notifications is on in the console’s General tab.
  • A beta offer always hands you the download command. The repositories carry stable only, so dnf upgrade on a beta would answer “nothing to do”, which reads like the beta failed, not like advice that could never have worked.

DRM/KMS capture survives updates now

Set it up once, then stop thinking about it.

  • The capture permission belongs to a package now, polaris-kms, instead of to the binary. Updating Polaris doesn’t take it away anymore, so DRM/KMS capture won’t quietly break every time you update.
  • It’s a separate package because it’s a second copy of the binary, about 31 MB, and most hosts never capture this way. Install it alongside Polaris only if yours does.
  • It works on image-based hosts. Bazzite couldn’t hold the permission at all before, which is why its guide had you copy the binary somewhere writable by hand, and why that copy outlived every update after: rpm reported one version while the console ran another.
  • Not every account on the machine gets the permission anymore. The helper is readable only by the polaris-kms group, and --enable-kms adds you to it. A session picks up groups at login, so the first time, log out and back in before capture works.
  • sudo -H polaris --setup-host --disable-kms turns it back off, and cleans up what older releases had you do by hand too: the capability on the binary, the copy at /usr/local/bin/polaris-kms, and the service drop-in that pointed at it. It tells you what it removed, says so plainly when there was nothing to remove, and leaves alone a drop-in that points somewhere else.

Desktop gets a screen of its own

Mirror your desk, or get a screen made for the device you’re streaming to. Your call.

  • Pick Host Virtual Display for Desktop and that’s what you get, instead of a mirror of the screen on the desk.
  • It still mirrors by default, even on a host whose Default Display is Host Virtual Display. The desktop is the screen you already have, so mirroring it is that entry’s own answer, not borrowed from how the host runs games. Everything else still takes the display you configured.
  • The picker only offers what can actually happen. Desktop used to list Private Stream, Gamescope and GPU-native and then quietly mirror anyway, because an entry whose job is the desktop can only run where a desktop is.
  • The separate Virtual Display tile is gone from the library, folded into Desktop now that it can be either. Moonlight still sees it, because a client without a picker has no other route to a virtual screen.
  • Screen To Add and Screen Scale are per device, in Play Setup. The screen a host creates is sized from the device that asked for it, not from the stream, and the scale decides whether you can actually read the result: a 2560x1600 desktop is comfortable on a monitor and unusable on a ten inch tablet.
  • A created screen takes the scale it was asked for, whichever backend made it. On KDE, an EVDI screen was being adopted at whatever a stored layout said, which on one host was a 135% nobody chose.

Covers for the whole library at once

Three hundred imported ROMs used to mean three hundred blank tiles and three hundred trips through Find Cover. Now it’s one pass and a review.

  • Find covers on the Apps page looks up every published game with no cover and proposes a match for each. Nothing is stored until you apply it: the review lists one row per game with the matched title and how close it is, and opening a row shows that game’s other posters.
  • A title search is right most of the time, not always, so the review is the point, not a formality.
  • Entries Polaris ships artwork for are never looked up, because a title search for one of those finds some coincidental game instead of nothing. A game you used Remove artwork on stays untouched until you use Find artwork again.
  • Numbered ROM sets stop dragging their index into the library. 0001 - Super Mario 64 DS (USA).nds becomes Super Mario 64 DS, and that’s what gets searched for too. Titles that only look like an index keep it: 1943 - The Battle of Midway is a year, and 007 - GoldenEye is a name.

PyroWave: a new codec for wired links (experimental)

Got a wired link? Give this one a spin!

  • Polaris can stream PyroWave, an intra only wavelet codec that runs as plain Vulkan compute instead of on the GPU’s video engine. Every frame costs about the same to encode, and a lost packet costs you one frame instead of everything up to the next keyframe.
  • It’s in every Linux package from this release, but only a client that asks for it by name gets it. No Moonlight client asks, so nothing changes for a host nobody asks.
  • On Android, it’s in Nova’s beta, v1.4.13-beta.3, a separate app named Nova Pre that installs beside stable Nova. Pick it under Settings → Client Stream Defaults → Change codec settings → PyroWave (experimental). Nova’s stable 1.4.13 APKs don’t turn it on, so it isn’t in stable’s Play Setup codec row. 4:4:4 is available in the beta too, which is what makes small text on a streamed desktop readable.
  • On Linux, Nova 1.4.13 attaches a separate experimental bundle, Nova-Linux-PyroWave-x86_64-alpha.flatpak. Install it and pick Play Setup → Video Codec → PyroWave · Experimental. That route is SDR 8-bit 4:2:0 only: no HDR, no 4:4:4. The regular Nova Linux Alpha Flatpak doesn’t include the decoder.
  • When capture delivers a compatible GPU-resident DMA-BUF, PyroWave can import it without a CPU upload, depending on capture negotiation, the pixel format and driver support. Capture that delivers frames in host memory (including Private Stream, wlroots and X11 capture) copies each frame to the GPU first: in a recorded 1080p Private Stream session on an RTX 4090, that averaged 0.35 ms for the copy plus 0.95 ms to encode.
  • It wants a wired link at a couple of hundred megabits. It’s not a codec for wifi, and it’s not a replacement for H.264, HEVC or AV1.
  • HDR on this codec needs a capture route that delivers ten bit frames with HDR metadata, and desktop portal capture doesn’t: outside a Gamescope HDR session, a PyroWave HDR request on a KDE or GNOME desktop is refused. HDR on this codec has not been shown end to end yet.
  • On a KDE host with capture = kms and the display in HDR, PyroWave can’t stream at all, SDR included. KWin scans out sixteen bit float, which the codec can’t read, so the stream ends right after it starts. Turn HDR off on the host display, or capture another way. The conversion for this format isn’t written yet.
  • An ultrawide source costs more when frames arrive in host memory, because the whole source is copied to the GPU every frame, about 66 MB for a 7680x2160 desktop. A 32:9 desktop is letterboxed, not stretched, and the bars cost nothing. Stream a matching aspect ratio if you have one.
  • Steam Remote Play added the same codec, by the same author, in its own beta the same week: Windows and macOS now, Linux behind the experimental SteamRT3 client, mobile still to come. Valve quotes 100 to 500 Mbit/s and at least gigabit ethernet for it, which is the envelope measured here too, so the bandwidth this codec wants isn’t a number Polaris made up. The two are separate streams and can’t talk to each other.

Encoding on AMD, straightened out

Streaming from an AMD GPU? This part’s yours.

  • A scene change no longer arrives as one huge frame on AMD (Mesa radeonsi) when the strict frame bitrate limit is on, or with AV1. The radeonsi driver only keeps to that limit in CBR, and Polaris was using VBR. It uses CBR there now, which on an RX 7900 XTX kept the largest frame to two or three times the average instead of twelve to fifteen, at no visible cost.
  • On AMD (Mesa radeonsi), the VA-API quality presets go out as the switches the driver actually reads, not as a scale. Balanced is now the encoder’s balanced preset instead of its fastest one, at no measurable encode cost on VCN 4. Prefer quality still adds pre-encoding, same as before. The driver’s slower quality presets are left alone, because on VCN 4 they were too slow for a 4K AV1 stream at 60 fps.
  • The encoder settings tell you what a quality choice costs: a step toward quality can spend more time encoding every frame, and that time is added to your latency. On AMD, the Vulkan tuning choices that leave low-latency mode off now say so.

Fixed

Squashed.

  • A reading of the Game Mode screen that had already answered no longer makes the next one report that the last one never came back, which placed touch across the whole frame for nothing.
  • The Vulkan encoder no longer crashes Polaris the moment it starts. On an AMD GPU that’s the encoder Auto tries first for Private Stream, so on the second and third betas a stream could take the host down before its first frame. The culprit: the new codec brings a Vulkan library whose variables share names with the Vulkan functions the encoder calls, and the encoder’s calls were landing on those variables.

Heads up before you update

Ran beta.2 or beta.3? The first bullet is for you.

  • If this host ran 1.4.13-beta.2 or beta.3, reinstall this release over it. The betas and the release share the version 1.4.13, so a package manager can treat the release as already installed: on Fedora, installing the RPM answers “Nothing to do”, and an update from the Polaris repository leaves the beta in place on Fedora and Arch. Left in place, the beta still has the Vulkan encoder crash fixed above. Reinstall with sudo dnf reinstall ./Polaris-fedora44-x86_64.rpm on Fedora, sudo pacman -U ./Polaris-arch-x86_64.pkg.tar.zst on Arch, or sudo apt install --reinstall ./Polaris-ubuntu24.04-x86_64.deb on Ubuntu. If the KMS helper is installed, name its file from this release in the same command, or the beta’s helper stays. On SteamOS, run the install block below again. Then restart Polaris.
  • If this host captures through DRM/KMS, install polaris-kms as well, then run sudo -H polaris --setup-host --enable-kms once and log out and back in. After that, updates leave it alone: this is the last release that asks you to do anything about it!
  • Bazzite hosts should still install the Fedora 44 RPM through rpm-ostree.
Install (Fedora 44, Arch / CachyOS, Ubuntu 24.04, SteamOS 3.8)

Already added repo.papi-ux.com? Updating is sudo dnf upgrade on Fedora or sudo pacman -Syu on Arch, then restart Polaris.

Terminal window
wget --output-document=./Polaris-fedora44-x86_64.rpm https://github.com/papi-ux/polaris/releases/download/v1.4.13/Polaris-fedora44-x86_64.rpm &&
sudo dnf install "./Polaris-fedora44-x86_64.rpm" &&
sudo -H polaris --setup-host &&
systemctl --user restart polaris
Terminal window
wget --output-document=./Polaris-arch-x86_64.pkg.tar.zst https://github.com/papi-ux/polaris/releases/download/v1.4.13/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 polaris
Terminal window
wget --output-document=./Polaris-ubuntu24.04-x86_64.deb https://github.com/papi-ux/polaris/releases/download/v1.4.13/Polaris-ubuntu24.04-x86_64.deb &&
sudo apt install ./Polaris-ubuntu24.04-x86_64.deb &&
sudo -H polaris --setup-host &&
systemctl --user restart polaris

Run this in Desktop Mode. It sets up the package keyring when needed and restores the read-only root before starting Polaris.

Terminal window
wget --output-document=./Polaris-steamos3.8-x86_64.pkg.tar.zst https://github.com/papi-ux/polaris/releases/download/v1.4.13/Polaris-steamos3.8-x86_64.pkg.tar.zst &&
(
set -e
trap 'sudo steamos-readonly enable' EXIT
sudo steamos-readonly disable || exit $?
sudo pacman-key --init || exit $?
sudo pacman-key --populate || exit $?
sudo pacman -Sy || exit $?
sudo pacman -U ./Polaris-steamos3.8-x86_64.pkg.tar.zst || exit $?
sudo -H polaris --setup-host --enable-headless-boot || exit $?
sudo steamos-readonly enable || exit $?
trap - EXIT
) &&
systemctl --user enable --now polaris

Bazzite users should follow the Bazzite guide and use the Fedora RPM through rpm-ostree. SteamOS 3.8 users should follow the SteamOS guide, which also covers keeping Polaris running in Game Mode.

Assets: Polaris-fedora44-x86_64.rpm · Polaris-arch-x86_64.pkg.tar.zst · Polaris-ubuntu24.04-x86_64.deb · Polaris-steamos3.8-x86_64.pkg.tar.zst

DRM/KMS capture, only if you use it: Polaris-kms-fedora44-x86_64.rpm · Polaris-kms-arch-x86_64.pkg.tar.zst · Polaris-kms-ubuntu24.04-x86_64.deb · Polaris-kms-steamos3.8-x86_64.pkg.tar.zst