Polaris v1.4.14-beta.1
This one is about getting PyroWave the bitrate it needs, and a host that tells you why when something doesn't work. PyroWave stops getting cut down to H.264 numbers, a stream the host can't feed is turned away before it starts, and changes 1.4.13 shipped without a word finally get their mention. Your settings, paired devices and Spaces keep working.
PyroWave gets the bits it needs
It's a hungry codec. Now the host knows how hungry.
- Polaris carries the bitrate model PyroWave's author published. For a TV or monitor it aims for what the author calls good quality, and for the device's own screen a lower target, matched to what looked right on a Retroid Pocket 6. At 1920x1080 and 60 fps in 4:2:0 that's about 101 Mbps on the device's own screen and 246 on a TV or monitor (109 and 298 in 4:4:4), at the default 10% FEC with stereo audio.
- When a PyroWave stream runs more than a tenth below the lower of those figures and the network is clean, Doctor offers to raise it in guarded steps, with Undo. Apart from Live Tuning lifting a request below
adaptive_bitrate_min(2 Mbps by default) to that floor, it's the only thing that goes above the bitrate you asked for, and never past 300 Mbps or yourmax_bitrate. With Live Tuning on, which is the default, Doctor says what to set instead. This is the clean-network PyroWave quality raise, separate from the sustained-loss recovery step below. - Doctor quotes one figure: the bitrate to set in your client, FEC and audio included. With Live Tuning on it names the live bitrate instead, a little lower, because a live change skips the FEC and audio. Control on the Retroid Pocket 6 at 1920x1080, 120 fps and 4:4:4 looked right at 200 Mbps. The figure there is 215, so 200 reads healthy.
- Where 300 Mbps or your
max_bitrateis less than PyroWave asks, as at 3840x2160 and 120 fps in 4:4:4 on the device's own screen, and most frames still fill the codec's byte budget, Doctor says so and suggests a lower resolution or frame rate, or HEVC. If only Doctor's 300 stands in the way, it adds that you can set more yourself. - Polaris takes a bitrate you set yourself up to 500 Mbps now, up from 300, and tells your client it does. Doctor's raise, and anything else Polaris recommends on its own, still stops at 300.
- The Stability preset, a device profile and a saved paired profile stop capping a PyroWave request to H.264 sizes. Only
max_bitratedoes, and the log names any cap that applied. - Live Tuning stops at half the advice, and Doctor suggests HEVC or a lower mode from there.
- In Nova's 1.4.14 beta, the handheld target is 31 dB too: at 1920x1080, 120 fps and 4:4:4 the request is about 214.9 Mbps, or 192.4 Mbps of video after the default FEC and stereo audio. Auto and Use recommended stay at or below 300 Mbps. A bitrate you enter yourself can reach the host's advertised 500 Mbps limit; an older host that does not advertise it keeps the 300 Mbps limit. This is advice for that picture and link, not a promise that Wi-Fi can carry it.
- A client can see how your bitrate splits on any codec, not just PyroWave: what you asked for, any cap the host put on it, what the encoder gets, what it runs at right now, and the audio and FEC around it. PyroWave advice asked for during a stream counts that stream's own audio too, so 5.1 asks a little more than stereo.
Turned away up front, with a reason
A stream that can't work shouldn't connect and then show you nothing.
- Host Virtual Display no longer looks available on GNOME Wayland just because EVDI can add a connector. Polaris also checks that it can capture that exact screen. A forced or stale choice is turned away with the reason before adding a display. Use Mirror Desktop for the existing GNOME desktop, or Private Stream for an app on its own screen. GNOME virtual-screen streaming is not added in this release. (#796)
- On a KDE desktop in HDR with
capture = kms, PyroWave used to connect and carry nothing, because it can't read the sixteen bit float KWin scans out. Now the host refuses it before the stream, and tells a client that names its codec at launch what to do instead. Private Stream captures its own session, so it keeps offering PyroWave. capture = nvfbcrefuses PyroWave by name too, and so does a second stream that would share the host's one capture with another codec, which used to get no picture.- A client that leaves during video setup, like one whose GPU can't run PyroWave, gets named: for fifteen minutes Doctor and the support report lead with the failed start and a next step, not two
Initial Ping Timeouterrors.
No more falling back in silence
- When a stream mode or host rule sets your capture backend aside, the log says which mode, what you chose and for how long.
- The System page has a Capture row under Host Now: where DRM/KMS capture stands for the capture this host is really set to, and the one step still missing, with a Copy button.
- Doctor's network-path check tells you what it tested. A check the host runs against itself covers local listeners and UDP hints, not the streaming device's loss, latency or bitrate ceiling. Missing client measurements stay unavailable; another stream's readings are not a clean bill of health for yours.
- Settings > Encoder Profiles has PyroWave and 4:4:4 rows: whether this host can stream PyroWave, why not when it can't and which launches it turns away, the advice and what it assumes while a PyroWave stream runs, and which encoder here gives you 4:4:4.
- A settings file Polaris won't read says why, in the log and the console, with the fix. Settings used to sit on its loading placeholder.
Clearer for Moonlight players
-
Moonlight players can opt in to Close Steam on the host to start games for each paired device. It is off by default, asks desktop Steam to quit before a private Steam launch, and refuses the launch if Steam does not finish closing. It leaves SteamOS Game Mode and unsaved game state alone. Nova for Android keeps asking the player at launch. (#797)
-
Each app has a Launch as setting, so a Moonlight library can mix a private game, your real desktop and a desktop on a screen of its own. It replaces Mirror the host desktop and Always create Virtual Display, which did nothing on a Private Stream host and left you in an empty session. A mode the host can't run is greyed out, and a launch that needs it is turned away with the reason. (#790)
-
Refusals Moonlight shows word for word name the setting to change, instead of sending you to Nova.
-
Mission Control says whether each live stream is Nova or Moonlight / Artemis.
-
Session Snapshot on Doctor & Support has a Client type tile, Nova or Moonlight / Artemis (the host can't tell those two apart), and for Moonlight or Artemis it says what that player can't use.
-
The compatibility guide has one table of what each client gets, and what the host can set for a Moonlight player instead.
Fixed
Squashed.
-
Desktop Takeover on Hyprland supports the Lua dispatcher interface and restores monitor power even when the desktop has no windows to move. The existing special-workspace safety checks stay in place. (#783)
-
With HEVC or AV1 set to Auto, Nova now sees the codecs Polaris detected as available. The paired capability list used the Auto setting itself instead of the encoder result, so a working codec could appear Unavailable before launch. A codec that is disabled or fails its encoder check remains unavailable.
-
If End game cannot finish cleaning up a Host Virtual Display session, Polaris keeps its virtual screen and session owner available for another End attempt. Removing the screen first could move a surviving game to your physical monitor. This safeguard also keeps the session when screen removal fails; it does not make an unverified Heroic process safe to terminate. Private Stream keeps its existing shutdown route.
-
The mouse lands where you point on a desktop with a rotated or scaled monitor, with wlroots capture, and with KMS capture when Wayland names every output KMS sees. Polaris measured your desktop by each monitor's resolution before rotation, so a 1920x1080 monitor turned to portrait counted as 1920 wide and 1080 tall instead of 1080 wide and 1920 tall, and the pointer landed off from where you aimed. It measures each monitor the way your compositor lays it out now, and on a HiDPI monitor the pointer still reaches every pixel. This applies when the monitor you stream is not itself rotated 90 or 270 degrees. Streaming a rotated monitor itself behaves as in 1.4.13: its picture looks as it did, usually sideways, and the pointer lands where it did, and a later fix will turn that picture upright. On other streams, touch and pen use the corrected desktop size too, but still leave out where the streamed monitor sits on your desktop. Thanks to ertywastaken, who tracked down the cause (#793).
-
Streaming a monitor that sits right of or below another puts the pointer on that monitor, not on the one in the corner of your desktop. This is for wlroots, KMS and X11 capture, NvFBC included. With wlroots or KMS, streaming a monitor rotated 90 or 270 degrees keeps its 1.4.13 input mapping. Portal and KWin capture work as before. (#793)
-
Doctor holds its verdict. It graded the network one second at a time, so over Wi-Fi the same stream could read as under network pressure and as fine a few seconds apart. It now judges video frame loss and round trip time over the last 20 seconds, calls loss network pressure at 2% and clears it below 1%. Doctor, the Dashboard's Loss tile and chart, Fix My Stream and the post-session report quote that one figure: the share of video frames that never arrived whole after FEC. With Live Tuning on and loss at that level, Doctor now offers to lower your bitrate one step, with Undo. Taking it turns Live Tuning off for that stream until you undo it, it rolls back, or the stream ends. This is a separate recovery step for sustained media loss, not an automatic PyroWave quality raise. Live Tuning's own loss handling is unchanged in this release.
-
Gamescope Stream starts again on the gamescope your system ships, SteamOS's included. Since 1.4.12 Polaris asked gamescope to draw the pointer into the stream with an option only Polaris's own gamescope build has, and a stock gamescope quit on it, so every launch failed. Polaris now checks first and leaves the option out when your gamescope doesn't have it. Those streams show no pointer, as before 1.4.12. On 1.4.12 and 1.4.13, add
Environment=POLARIS_GAMESCOPE_COMPOSITE_CURSOR=0under[Service]withsystemctl --user edit polarisand restart the service. (#792) -
sudo -H polaris --setup-host --enable-kmsno longer leaves the service unable to start until your next login: it waits for that login, says so, and a second run finishes the job. -
Doctor and the Update Center stop calling the
polaris-kmshelper a stale copy, and with betas on and nothing newer out, the Update Center says so. -
On Fedora, removing only
polaris-kmskeeps your Spaces setup. The helper ran the main package's removal step, and every update printed the install message twice. On 1.4.13, update before you remove the helper. -
The Ubuntu package depends on PipeWire's client library now. Without it, on a minimal Ubuntu 24.04, every
polariscommand stopped. On 1.4.13,sudo apt install libpipewire-0.3-0t64fixes it. -
The first Space for a launcher works on Docker's containerd image store, the default on a fresh Docker 29, and a failed Space create names its cause in the host log.
-
NVENC with
nvenc_vbv_increaseat 258% or more no longer overflows its buffer at 500 Mbps. -
Polaris removes the filler AMD drivers add to H.264 and HEVC at constant bitrate, rather than sending padding the client throws away. In the earlier RX 7900 XTX encoder-output tests, a synthetic still screen at 1080p60 fell from 20 Mbps to about 0.04 Mbps with identical decoded pictures. That was a test of driver output, not a live game-stream measurement or a promise for every AMD card.
-
Clients on Tailscale, WireGuard or another tunnel with no MAC of its own now learn the host's MAC for Wake-on-LAN. Whether a magic packet from outside reaches a sleeping host still depends on your network.
-
Private Stream asks the game's owned windows to close before stopping its display, then waits before escalating to process termination. An already-open desktop app is not signalled. This keeps the existing private-session route; it is not a guarantee that every launcher can close its game cleanly.
-
Desktop Takeover on Hyprland no longer hands hyprctl a special workspace name it would read as a different request, like one holding
/--batch. That workspace stays where it is, and the host log says why. (#788)
Shipped in 1.4.13, announced now
Its notes forgot these. Sorry about that!
- Peers in the shared
100.64.0.0/10range, Tailscale's included, get the WAN policy: a LAN-only web console or Browser Stream refuses them, and streaming useswan_encryption_mode. Pairings are kept. - Heroic finds installed Amazon and sideloaded games, and earlier Heroic imports report their platform and runtime without a re-import.
- Doctor & Support has a Spaces checks section, collapsed until you open it, and Mission Control shows running Space sessions.
- Arch and SteamOS releases carry matching debug packages.
Heads up before you update
Here's what changes under you.
-
Games you imported from Steam, Lutris, Heroic or a ROM folder had Always create Virtual Display on without you setting it. They're Host default now, and so is any app with a Steam app id, so on a host whose mode isn't Private Stream they follow that mode instead of getting a virtual display. Set Launch as to Host Virtual Display on any that should keep one.
-
Heroic games on Host Virtual Display still have an unresolved shutdown limitation: Polaris may not be able to prove which game processes it can stop. The display and owner are kept when cleanup is unconfirmed, so you can close the game yourself and try End game again. An accepted End game request is not proof that the game quit. Private Stream remains the recommended default; this update does not switch an existing host's chosen mode.
-
On AMD, Auto now tries Vulkan Video first on Gamescope Stream through the portal. A historical report on an RX 9070 XT at 4K60 measured host processing latency of 9 ms with Vulkan Video and 16 ms with VA-API. These are that tester's readings, not a new beta benchmark or an encoder-only measurement. It costs AV1 and HDR there, and a client that picked AV1 fails as it starts when its launch switches into Gamescope Stream from another mode.
encoder = vaapiorav1_mode = 2keeps VA-API. -
capture = kwinnow captures through the portal, andcapture = drmthrough KMS. Both used to take whatever the automatic check found. -
adaptive_bitrate_maxlimits nothing now. With Live Tuning on, its 100 Mbps default cut every stream encoding above that for good, PyroWave included. It still loads, with a warning: move a cap you relied on tomax_bitrate, which now caps live changes too. -
A live bitrate set by hand turns Live Tuning off for that stream only, not for every stream after.
-
The bitrate in your client includes FEC, audio and packet overhead; the encoder's live video rate does not. Nova uses the host's split to convert between them when it is known. If the split is unavailable, the UI keeps the available video or unknown units instead of inventing a request. For example, a 500 Mbps request at the default 10% FEC with stereo audio leaves about 449 Mbps for video. A raw live-bitrate API write uses video units, so it is not the same number.
-
The PyroWave advice is an objective metric on four game clips. The device's own screen figure is matched to one check on a Retroid Pocket 6, the TV figure hasn't been checked on a big screen yet, and Doctor's 300 Mbps ceiling may move.
-
Every package builds Polaris with link time optimisation again, as before 1.4.13. Tell us if one misbehaves where 1.4.13 didn't.
-
Betas now sort below their release (
1.4.14~beta.1in RPM and DEB,1.4.14beta.1in pacman), so the release replaces a beta through an ordinary upgrade.polaris-kmsneeds its exact Polaris: install both files in one command. -
This is an opt-in prerelease. The install commands below use this beta's attached packages. Stable updates remain on 1.4.13.
Install (Fedora 44, Arch / CachyOS, Ubuntu 24.04, SteamOS 3.8)
The signed package repositories serve stable releases. To try beta.1, use its attached packages below. If polaris-kms is already installed, download its matching beta package too and install both in the same command; the helper requires the exact Polaris version.
Fedora 44
wget --output-document=./Polaris-fedora44-x86_64.rpm https://github.com/papi-ux/polaris/releases/download/v1.4.14-beta.1/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.4.14-beta.1/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.4.14-beta.1/Polaris-ubuntu24.04-x86_64.deb &&
sudo apt install ./Polaris-ubuntu24.04-x86_64.deb &&
sudo -H polaris --setup-host &&
systemctl --user restart polarisSteamOS 3.8
Run this in Desktop Mode. It sets up the package keyring when needed and restores the read-only root before starting Polaris.
wget --output-document=./Polaris-steamos3.8-x86_64.pkg.tar.zst https://github.com/papi-ux/polaris/releases/download/v1.4.14-beta.1/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 polarisUpdating an existing DRM/KMS installation
Download the matching Polaris-kms asset alongside the main package. Install the pair together, then restart Polaris. Use the same platform and beta tag for both files:
# Fedora 44
sudo dnf install ./Polaris-fedora44-x86_64.rpm ./Polaris-kms-fedora44-x86_64.rpm
# Arch Linux / CachyOS
sudo pacman -U ./Polaris-arch-x86_64.pkg.tar.zst ./Polaris-kms-arch-x86_64.pkg.tar.zst
# Ubuntu 24.04
sudo apt install ./Polaris-ubuntu24.04-x86_64.deb ./Polaris-kms-ubuntu24.04-x86_64.debFor SteamOS 3.8, use both Polaris-steamos3.8-x86_64.pkg.tar.zst and Polaris-kms-steamos3.8-x86_64.pkg.tar.zst in the pacman -U line inside the read-only-root block above. Installing the helper for the first time is optional; follow the KMS setup guide if you need that capture route.
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
Debug symbols, for crash reports: Polaris-debug-arch-x86_64.pkg.tar.zst · Polaris-debug-steamos3.8-x86_64.pkg.tar.zst