-
v0.13.0
Stableaudit / cargo-audit (push) Successful in 2m30sdeb / build-publish (push) Successful in 13m42sweb-screenshots / screenshots (push) Successful in 2m47sci / bench (push) Successful in 6m1sandroid-screenshots / screenshots (push) Successful in 3m59sapple / screenshots (push) Successful in 6m27sdecky / build-publish (push) Successful in 24swindows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 7m4srpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 15m46sdocker / deploy-docs (push) Successful in 11sdocker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 13sdocker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 12sdocker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 12sdocker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 11sdocker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 12srpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 15m2swindows / build (aarch64-pc-windows-msvc) (push) Successful in 8m21sflatpak / build-publish (push) Failing after 8m1swindows / build (x86_64-pc-windows-msvc) (push) Successful in 9m18swindows-host / package (push) Has started runningci / rust (push) Failing after 17m36slinux-client-screenshots / screenshots (push) Successful in 7m54swindows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 6m57sarch / build-publish (push) Successful in 13m5sandroid / android (push) Successful in 13m44srelease / apple (push) Successful in 10m22sapple / swift (push) Successful in 1m25saudit / bun-audit (push) Successful in 16sci / web (push) Successful in 48sci / docs-site (push) Successful in 57sreleased this
2026-07-17 20:31:42 +00:00 | 0 commits to main since this releaseWire-compatible with 0.12.x back to 0.10.x — no protocol change (
WIRE_VERSIONstays 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 SSE —
GET /api/v1/eventsstreams 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-cmdparity 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 withPUNKTFUNK_CLIPBOARD=on(ortext-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-mousedriver) 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
REALTIMEscheduling 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=1to 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-conflictssubcommand) — 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
- Lifecycle events over SSE —