• v0.12.0
    ci / docs-site (push) Successful in 50s
    ci / web (push) Successful in 54s
    ci / bench (push) Successful in 6m1s
    ci / rust (push) Successful in 24m53s
    apple / swift (push) Successful in 1m13s
    apple / screenshots (push) Successful in 4m49s
    docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 12s
    docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 11s
    decky / build-publish (push) Successful in 25s
    docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 11s
    docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 11s
    android-screenshots / screenshots (push) Successful in 3m17s
    docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 7m39s
    windows-host / package (push) Successful in 8m42s
    release / apple (push) Successful in 9m30s
    linux-client-screenshots / screenshots (push) Successful in 9m1s
    docker / deploy-docs (push) Successful in 24s
    web-screenshots / screenshots (push) Successful in 2m52s
    deb / build-publish (push) Successful in 12m52s
    windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 4m4s
    arch / build-publish (push) Successful in 13m47s
    android / android (push) Successful in 14m35s
    windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 4m10s
    rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 13m52s
    rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 13m0s
    flatpak / build-publish (push) Successful in 6m35s
    Stable

    enricobuehler released this 2026-07-15 21:30:20 +00:00 | 2 commits to main since this release

    Wire-compatible with 0.11.x and 0.10.x — no protocol change (WIRE_VERSION stays 2), so existing pairings and clients keep working with no re-pairing. This is a codec + controllers release: PyroWave, a new intra-only low-latency LAN codec, ships in every default build with native decode on every client including a hand-written Apple Metal path; the Steam Controller 2 can be used from an Android client (experimental); and pairing, Automatic bitrate, the gamescope cursor, the web console, and a new launch-script hook all improve. PyroWave is opt-in per session, so nothing changes for existing H.264/HEVC/AV1 streams.

    PyroWave — a low-latency LAN codec

    PyroWave is an intra-only wavelet codec built for the LAN: there is no inter-frame reference chain, so a lost packet costs blocks in a single frame instead of a stall, and every frame is independently decodable.

    • Ships in every default build. NVIDIA hosts advertise it via a per-session CPU-RGB capture fallback, so it's available with zero configuration.
    • Native decode everywhere — Windows, Linux, Android, and now Apple: a hand-written Metal decoder on Mac, Apple TV, and iPad (no MoltenVK), PSNR 77–88 dB.
    • Datagram-aligned packets with partial-frame delivery, so a lost datagram costs blocks, not a frame.
    • Follows a mid-stream resolution change without a reconnect (the HUD tracks the switch).
    • Opt-in per session — existing H.264/HEVC/AV1 sessions are untouched.

    Steam Controller 2 — experimental (Android clients)

    You can now use a Steam Controller 2 while streaming from an Android client to a Linux host: connect the controller to your Android device — wired, or over the wireless Puck dongle — and it's forwarded to your games as a real Steam Controller 2, with working sticks and menu navigation. This is early and experimental, so expect rough edges — please report anything you run into. For now, capturing the controller only works on the Android client; the other clients can't forward one yet.

    Also in this release

    • Typed pairing rejections — every client now surfaces why pairing failed (not armed, bound to another device, wrong ABI, …) instead of a generic "not accepted."
    • Decode-aware Automatic bitrate — Automatic reads the client's decode-stage latency and caps at the real decode limit, so a fast link no longer pins a rate the decoder can't keep up with. Decode latency is now reported by the Apple, Windows, and Linux clients too, not just Android.
    • gamescope pointer in-stream — the cursor shows up in gamescope streams (captured as metadata and composited on the GPU) with no forced compositor composite, so there's no capture performance hit.
    • Stream-active runtime marker — while a client is streaming, the host maintains $XDG_RUNTIME_DIR/punktfunk/stream (a shell-sourceable file with the negotiated mode). A per-title launch script can branch on it — run the game as-is when streaming, or fall back to a local multi-monitor layout otherwise — for streaming-aware game launching on multi-head hosts.
    • Web console pass — native (default-plane) sessions now appear and are controllable on the console (they read as "Idle" while actively streaming before); the codec list follows what the GPU can actually encode; plus a sweep across pairing, displays, library, stats, logs, auth, and localization.

    Fixes

    • Windows — lid-closed virtual-display targets now activate (explicit CCD path-commit fallback) instead of never coming up on a clamshell laptop.
    • Android — the gamepad exit chord is usable again (shorter hold + an on-screen "hold to quit" hint).
    • Apple — export-compliance metadata corrected (unblocks TestFlight/App Store uploads).
    • Docs — the community pf-webos client for LG TVs is now documented.
    Downloads