-
v0.20.1
Stableaudit / bun-audit (push) Successful in 25sci / web (push) Successful in 59sci / docs-site (push) Successful in 1m32saudit / cargo-audit (push) Successful in 2m13sapple / swift (push) Successful in 5m18sci / bench (push) Successful in 5m33sci / rust-arm64 (push) Successful in 13m8sandroid-screenshots / screenshots (push) Successful in 3m13swindows / build (aarch64-pc-windows-msvc) (push) Successful in 1m11swindows / build (x86_64-pc-windows-msvc) (push) Successful in 1m52sdeb / build-publish-host (push) Successful in 10m14sci / rust (push) Successful in 34m31swindows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 2m15sdecky / build-publish (push) Successful in 28sarch / build-publish (push) Successful in 12m48sdeb / build-publish (push) Successful in 13m17swindows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 2m48sandroid / android (push) Successful in 18m46sdeb / build-publish-client-arm64 (push) Successful in 7m55slinux-client-screenshots / screenshots (push) Successful in 8m3sweb-screenshots / screenshots (push) Successful in 3m3sdocker / build-push-arm64cross (push) Successful in 5m33sdocker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 13m15sdocker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 16sdocker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 11m40sdocker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 8m17sdocker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 23sdocker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m32sdocker / deploy-docs (push) Successful in 12srpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 15m9srpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 16m38srelease / apple (push) Successful in 31m20sapple / screenshots (push) Successful in 23m22swindows-host / package (push) Successful in 12m1swindows-host / winget-source (push) Failing after 12sflatpak / build-publish (push) Successful in 6m40sreleased this
2026-07-27 19:04:53 +00:00 | 19 commits to main since this releaseUpdate whenever it suits you — the app and the machine you stream from can still be updated one at a time, and everything already paired keeps working. This release is entirely fixes and hardening on top of last release's session⇄game work — nothing new to opt into.
Fixed: installing or updating the Windows host
Three separate reports came in within hours of the last release, all blocking install:
winget installcould fail outright if you'd ever had another streaming host on the machine — even one you had since disabled or mostly uninstalled. A leftover, disabled service or an empty folder from an old install was enough to trip the "conflicting host" check and abort. Only a host actually set to start on its own counts now.- Installing through a package-manager app (like UniGetUI) could fail with a file-path error before the install wizard ever appeared, because of a broken setting the installer passed itself. Fixed.
- The package source instructions were incomplete.
winget install unom.PunktfunkHostsays "no package found" until you've pointed winget at Punktfunk's own source, once per machine — the command for that is now spelled out.
Fixed: Moonlight compatibility no longer turns on without asking
A fresh Windows install used to enable Moonlight-app compatibility silently, with no checkbox ever shown — even though that mode pairs over a less secure connection and the host warns about it on every start. It's opt-in now. Existing installs are untouched either way; Punktfunk's own clients were never affected.
Fixed: switching into Steam's Game Mode on Linux could black out the machine
Last release shipped the permission needed to properly take over the screen for Steam's Game Mode — and surfaced a few sharp edges that only show up once that takeover is actually live:
- The takeover could kill Punktfunk's own background service a few seconds later, leaving the display dark with nothing left to bring it back except a physical console or SSH.
- It could also hang waiting on a permission prompt nobody could see, delaying recovery until well after the stream had already dropped — or act on a leftover marker file from months ago and jump the machine to the desktop for no reason.
- Restarting the host mid-stream — including a routine update — could leave the display stuck off, since nothing told the screen to come back.
All three are fixed. Recognizing the machine's built-in Steam Game Mode may now need a one-time permission on some distributions; installing or updating normally takes care of it.
Fixed: a laptop with its built-in screen turned off stuttered constantly
On a laptop with two graphics chips and the internal screen switched off — a common setup for streaming from a laptop docked to a TV or monitor — streaming stuttered roughly every two seconds, for the whole session. Punktfunk now recognizes a dark-but-connected laptop screen as the cause and points at the actual fix, instead of pointing at an external monitor that isn't the problem.
Fixed: latency creeping up over the course of a fast, high-bitrate stream
On a fast local network, especially at higher bitrates, latency could climb steadily over a long session instead of staying flat. Several separate causes are fixed at once: the stream's internal clock sync could get starved by a busy connection and let the two ends' clocks drift; a stream mode could put more data on the wire than its bitrate setting actually allowed; a slow-to-decode moment could build up a backlog that took a while to work through instead of catching up immediately; and the one-time startup speed test could be mistaken for real network congestion and permanently cap the stream below what the connection could actually handle.
Fixed: missing cover art looked broken
A library entry with no cover art showed as an empty grey box, which read as something that failed to load. It now shows a controller icon instead, so "no art yet" looks intentional rather than broken.
Improved: the Windows app now keeps its own log file
The desktop app writes its own log to
%LOCALAPPDATA%\punktfunk\logs\client.lognow, instead of only printing to a console window that a normal launch never shows. If you're ever asked to send logs for a problem, this is where they are.Under the hood (for developers)
- Nothing changed on the wire or at the API boundary. Streaming protocol stays at version 2, the embeddable C ABI at 13, the Windows virtual-display driver protocol at 6 — 0.18–0.20 hosts and clients keep mixing freely.
- Windows conflict detection now keys on the competing service's
Startregistry value (0–2 = boot/system/auto only), matching the tray's own dormant-is-harmless logic from last release; install directories no longer count. - The winget
Logswitch used the literal string|LOGPATH|instead of winget's actual<LOGPATH>substitution token, so Inno received an illegal filename on any install that requested a log (UniGetUI does by default). Guarded by a new manifest check. gamestreaminstaller task lost its default-checked flag; a silent/unattended install now landsPUNKTFUNK_HOST_CMD=serve./MERGETASKS=gamestreamopts in. Fresh installs only —GamestreamParamalready omitted the flag on upgrades.- The gamescope display-manager takeover now calls privileged
systemctlverbs non-interactively (--no-ask-password) so a headless polkit prompt can no longer block the stream's own recovery thread;session_select_requested's sentinel baseline is now recorded at takeover time as well as at successful launch, closing a window where a months-old~/.config/steamos-session-selectwrite could false-positive a session-select honor; andpunktfunk-hostnow handles SIGTERM/SIGINT by restoring the display manager it stopped (20 s grace) before exiting, so asystemctl --user restartor package upgrade mid-takeover can't strand the box. The takeover also now ensures the invoking user has systemd lingering enabled before touching the display manager — without it, stopping the DM stops the user's own service manager ~10 s later and takes the host down with it. - A new
internal_paneltarget class lets the exclusive-topology stall detector name a deactivated eDP/LVDS laptop panel as a disturbance suspect; previously the suspect list was filtered to external physicals only, so the one display responsible on a hybrid laptop reported as none.EvtIddCxMonitorI2CTransmit/Receivenow answer every DDC/CI probe against the virtual monitor with an immediateSTATUS_NOT_SUPPORTED, so third-party brightness/monitor tools stop occupying win32k's serialized physical-monitor path on it. The swap-chain drain thread now falls back toTIME_CRITICALpriority if MMCSS registration is refused, and raisesIddMinimumVersionRequired4 → 10 to useIddCxSetRealtimeGPUPriority. - Clock re-sync now spaces its probe rounds ~7 ms apart, tracks a running best-RTT guard band instead of a static connect-time floor, and applies the best batch of a rejection streak after three consecutive rejections rather than drifting unbounded.
- A new per-frame
WireBudget(shared between encoder backends) tracks the real bitstream-to-wire inflation ratio for datagram-aligned PyroWave sessions and deflates the rate-control target by it, so the configured bitrate pin holds on the wire rather than on the raw codec bitstream. - The pre-decode frame channel now drains to the newest AU for all-intra (PyroWave) streams, since those have no reference chain forbidding a mid-stream drop — capping any standing backlog at roughly one frame instead of ratcheting between the coarse jump-to-live thresholds.
- The ABR capacity probe's first post-probe report window is now discarded outright, rather than measured, so the probe's own deliberate overload can no longer read as session congestion and permanently end slow-start early.
- New
display-disturbdev tool for reproducing DDC/CI and modeset-class display disturbances on demand during stall-immunity testing; not shipped to end users.
Downloads