• v0.13.0
    audit / cargo-audit (push) Successful in 2m30s
    deb / build-publish (push) Successful in 13m42s
    web-screenshots / screenshots (push) Successful in 2m47s
    ci / bench (push) Successful in 6m1s
    android-screenshots / screenshots (push) Successful in 3m59s
    apple / screenshots (push) Successful in 6m27s
    decky / build-publish (push) Successful in 24s
    windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 7m4s
    rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 15m46s
    docker / deploy-docs (push) Successful in 11s
    docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 13s
    docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 12s
    docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 12s
    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 12s
    rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 15m2s
    windows / build (aarch64-pc-windows-msvc) (push) Successful in 8m21s
    flatpak / build-publish (push) Failing after 8m1s
    windows / build (x86_64-pc-windows-msvc) (push) Successful in 9m18s
    windows-host / package (push) Has started running
    ci / rust (push) Failing after 17m36s
    linux-client-screenshots / screenshots (push) Successful in 7m54s
    windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 6m57s
    arch / build-publish (push) Successful in 13m5s
    android / android (push) Successful in 13m44s
    release / apple (push) Successful in 10m22s
    apple / swift (push) Successful in 1m25s
    audit / bun-audit (push) Successful in 16s
    ci / web (push) Successful in 48s
    ci / docs-site (push) Successful in 57s
    Stable

    enricobuehler released this 2026-07-17 20:31:42 +00:00 | 0 commits to main since this release

    Wire-compatible with 0.12.x back to 0.10.x — no protocol change (WIRE_VERSION stays 2), so existing pairings and clients keep working with no re-pairing. This is the biggest release yet: the host opens up to automation and scripting, the clipboard follows the stream, Intel GPUs get a native encoder, controller rumble is rebuilt end to end, latency drops at both ends of a session, and host audio on Windows and Linux gets root-cause fixes for the most-reported problems.

    Automation — events, hooks, SDK, script runner

    The host now tells you what it's doing and lets you act on it:

    • Lifecycle events over SSEGET /api/v1/events streams session/pairing/display lifecycle events.
    • Operator hooks (hooks.json) — run commands or call webhooks on events, with filters and debounce.
    • Per-app prep/undo commands — Sunshine prep-cmd parity for per-title setup/teardown.
    • Provider API — an external tool can own library entries declaratively (reconcile-style).
    • @punktfunk/host — a typed TypeScript SDK (built on Effect), published to the Gitea npm registry.
    • punktfunk-scripting — a supervised runner that keeps operator scripts/plugins alive against the host, with a working VirtualHere DualSense-passthrough recipe as the worked example.
    • The script runner and the web console now ship across the packaging matrix (deb, rpm, Arch, nix, Windows) — the runner opt-in, installed with its service disabled.
    • The docs' new Automation page covers the whole surface.

    Shared clipboard (phase 1)

    Copy on one side, paste on the other — text and images (PNG everywhere, with original JPEG/GIF passed through verbatim). The host side ships for Linux (Wayland ext-data-control / Mutter) and Windows, with macOS as the first client; content travels over its own QUIC plane. It is off by default — the host neither advertises nor accepts clipboard traffic until you opt in with PUNKTFUNK_CLIPBOARD=on (or text-only). Files, drag-and-drop, and more clients are next.

    Native Intel QSV encoder (Windows)

    punktfunk now drives Intel's VPL runtime directly instead of going through libavcodec, keeping the frame on the GPU end to end. That unlocks what the old path never could on Intel — 10-bit/HDR encode, AV1 on Arc, loss recovery without a full keyframe (LTR-RFI), and mid-stream bitrate retargets — with typed errors instead of silent stalls, validated on-glass on an Arc laptop. If the native open fails, it falls back to the ffmpeg path automatically.

    Rumble, rebuilt

    One shared policy engine in core now drives every platform's renderer (macOS/iOS/tvOS, Android, Linux, Windows, Steam Deck), fed by a lossless report ring from the Windows virtual-pad drivers and rumble-keyed idle watchdogs. The audible results on Windows hosts: a DualSense no longer latches a stale effect, a game that abandons rumble mid-effect no longer leaves the pad buzzing, and a failed pad create no longer haunts the host as a phantom controller.

    Latency, at both ends of a session

    Session start (Windows):

    • The virtual display republishes its last frame the moment a stream attaches — no more black first seconds.
    • First-frame latency dropped across the attach path (verified-state waits replace fixed sleeps, display prep starts at Welcome time).
    • A mid-stream resolution change can now happen in-place in the driver (protocol v4) instead of a simulated monitor replug.
    • Lid-closed streaming works reliably — a resident virtual HID pointer (new pf-mouse driver) plus a display wake/compose kick keep the desktop composing with no lid, no monitor, and no physical mouse.

    Steady state:

    • Per-stage latency attribution landed in the stats.
    • The send path goes data-first with a pacing cap; flushes are time-based.
    • The encoder is triggered per frame instead of on a clock.
    • Linux NVENC retrieves on its own thread, with an automatic REALTIME scheduling gate.
    • The Windows virtual-display capture runs at pipeline depth 1, escalating only under contention.
    • The gamescope/LINEAR zero-copy path converts NV12 in a compute pass.

    Host audio, finally boring

    • Windows — capture opens the wiring plan's endpoint explicitly instead of "whatever the default was", reacts to device changes with a self-healing watchdog, and plays stream audio on the client only by default (a silent sink on the host; set PUNKTFUNK_HOST_AUDIO=1 to keep it audible on the PC). This ends the "no audio until I cycle the output device" class of reports.
    • Linux — the host now owns a "Punktfunk Stream Speaker" sink and claims the default for the session (saved and restored afterwards), so apps play straight into the capture and a flapping HDMI/TV endpoint can no longer crackle or stall the stream.

    Also in this release

    • Render scale on every client (0.5×–4×) — supersample for sharpness or render under native for a lighter host GPU and thinner link; the host encodes the scaled mode, the client rescales on present.
    • Automatic bitrate only climbs through territory it has proven — a utilization gate and a proven-throughput cap end the settle-then-spike overload cycle on hard links.
    • 10-bit streaming is on by default when the encoder and client both support it, and AV1 now participates in codec negotiation (HEVC > AV1 > H.264).
    • iPhone/iPad — home-screen widgets, a Live Activity for the running stream, Siri/Shortcuts intents, punktfunk:// deep links, and an opt-in background keep-alive.
    • Mac client — scroll direction is now a setting (natural/inverted), Cmd/Option can be swapped for PC-layout keyboards, and ⌃⌘F toggles fullscreen (also in the Stream menu).
    • Conflicting-host detection — the host warns when Sunshine, Apollo, or another streaming host is running alongside it (console, tray, installer, and a detect-conflicts subcommand) — the usual cause of "capture is black" mysteries.
    • Security hardening — the July security review landed (no critical or high findings): webhook/artwork fetches refuse loopback/link-local/metadata targets, paired-device rosters move off the streaming-client auth lane, and device-name sanitizing covers bidi/format control characters.
    • NVENC failures are survivable and diagnosable — open failures back off and self-heal instead of wedging the session, and the error messages name the actual cause.
    • Android — the stats overlay names the real negotiated codec instead of assuming HEVC.
    • NixOS — the repo is now a flake: host, client, web-console, and script-runner packages, services.punktfunk.* modules, and a devShell (packaging/nix).
    • Logging pass across the host — quieter defaults, structured fields, and flood latches on the hot paths.

    Windows driver note

    The virtual-display driver protocol is now v4. An already-installed v3 driver keeps working — mid-stream resizes just fall back to the monitor re-arrival path until you update the driver package.

    Fixes

    • Linux — the tray no longer crashes at startup when installed beside the host (a cargo feature-unification trap).

    Under the hood

    The host and client cores were decomposed into focused crates (capture, encode, inject, vdisplay, GPU, frame vocabulary, and friends) — groundwork for faster builds and cleaner platform ports.

    Downloads