• v0.14.0
    apple / swift (push) Successful in 1m21s
    ci / web (push) Successful in 54s
    apple / screenshots (push) Successful in 6m19s
    ci / docs-site (push) Successful in 1m6s
    ci / bench (push) Successful in 5m16s
    release / apple (push) Successful in 10m54s
    android-screenshots / screenshots (push) Successful in 4m1s
    ci / rust (push) Successful in 26m27s
    decky / build-publish (push) Successful in 20s
    android / android (push) Successful in 14m8s
    deb / build-publish (push) Successful in 10m58s
    docker / deploy-docs (push) Successful in 9s
    docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 12s
    docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 11s
    docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 11s
    docker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 9s
    docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 12s
    docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 10s
    deb / build-publish-host (push) Successful in 10m40s
    linux-client-screenshots / screenshots (push) Successful in 7m14s
    web-screenshots / screenshots (push) Successful in 2m49s
    flatpak / build-publish (push) Failing after 8m19s
    windows-host / package (push) Successful in 16m34s
    windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 6m54s
    rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 16m15s
    rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 16m37s
    windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 6m58s
    arch / build-publish (push) Successful in 12m31s
    Stable

    enricobuehler released this 2026-07-19 09:30:44 +00:00 | 70 commits to main since this release

    Wire-compatible with 0.13.x (WIRE_VERSION stays 2) and the virtual-display driver protocol is unchanged at v4 — existing pairings, clients and installed drivers keep working, with no re-pairing and no driver update required.

    This release is about colour: HDR stops being a Windows-only story, PyroWave grows a full-chroma mode, and 10-bit now travels from capture to glass on every host platform. Alongside it, the web console opens up to third-party plugin UI.

    HDR on Linux

    The Linux host can finally capture HDR. GNOME 50's screencast portal offers 10-bit PQ (x2rgb10/x2bgr10) for a monitor in HDR mode, and the host now takes that offer and encodes HEVC Main10 on both NVENC and VAAPI — live-validated, not inferred. The portal only delivers PQ while the mirrored monitor is actually in HDR colour mode, so the host probes the live mode up front and honestly degrades to 8-bit SDR instead of running capture negotiation into a timeout. punktfunk-host hdr-probe reports what your machine can do.

    RecordVirtual and the native (non-portal) paths stay SDR for now — the portal monitor-mirror is the HDR route on Linux.

    HDR everywhere else

    • Apple — HDR capability is now detected from potential EDR headroom rather than the current value, so a display that can go HDR is treated as HDR-capable before anything asks it to. macOS presents PyroWave through an IOSurface layer.
    • Windows — an SDR-negotiated session now composes SDR even when the virtual display's "Use HDR" is switched on. Previously a client with HDR off could be handed BT.2020 PQ (from a display left in HDR by a prior session, the driver default, or the global toggle) and the picture blew out. client_10bit is authoritative on both codecs now, and a mid-session HDR flip can't override an SDR-negotiated stream.

    PyroWave: 4:4:4, HDR, and a much higher ceiling

    Full-chroma streaming lands end to end — text and UI stop smearing on the chroma plane:

    • Negotiation threads chroma format, bit depth and ColorInfo through the whole path, so a session self-configures in-band.
    • Linux encodes 4:4:4 with per-pixel CSC at full chroma resolution.
    • Windows composes separate-plane zero-copy D3D11→Vulkan.
    • Apple decodes 4:4:4 + HDR in Metal and presents via EDR.

    Throughput went up sharply too. Pooling the encoder's scratch buffers and fixing an O(n²) client parser lifted the 2.5 Gbps wall, and the encode queue now runs at elevated GPU scheduling priority on a global-priority queue. Frame-driven pacing is anchored to arrival so the stream holds full framerate. The docs gained a 4:4:4 + HDR page with an interactive bitrate calculator.

    Console plugins

    The web console can now host third-party UI. The host keeps a plugin registry, the SDK gains servePluginUi, and the console proxies and navigates to plugin pages. Scoped @punktfunk/plugin-* packages are discovered automatically, and the docs have a new Plugins page covering ROM Manager and Playnite with install steps.

    This adds a /api/v1/plugins surface with a regenerated OpenAPI spec and SDK client — which is why this is a minor bump rather than a patch.

    Also in this release

    • Library entries serve their local artwork through the host art proxy.
    • gamescope sessions end when the Steam game exits, and --steam is inferred.
    • Ubuntu 24.04 LTS gets a working host .deb, built by a noble builder that bundles FFmpeg 8.

    Fixes

    • A fresh install of 0.13.0 could not start on Windows. The ring-only crypto switch left rcgen unable to generate an RSA key, so the host died creating its identity with "no support for generating keys for the given algorithm". Existing installs were unaffected — the certificate was already on disk — but every new one failed. The host identity is now generated with the rsa crate and self-signed through rcgen.
    • Windows WSAENOBUFS is treated as a transient send drop instead of tearing down the stream.
    • hooks.json hand-edits are honored without a restart.
    • macOS PyroWave sessions default to glass-gated present pacing, mitigating a DCP swapID kernel panic; windowed sessions present via IOSurface layer contents.
    • PyroWave signals ycbcr_range=LIMITED in the sequence header, and 4:4:4 modes that would overflow the rate controller's 16-bit block index are refused rather than wrapping.
    • Apple clients pointed users at the web console on port 3000 for pairing — the console has served 47992 over HTTPS for a long time, so every pairing instruction led to a dead port.
    • Web console mobile padding no longer squeezes content.
    Downloads