• v0.8.0 b57e414618

    v0.8.0
    apple / swift (push) Successful in 1m10s
    audit / cargo-audit (push) Successful in 1m23s
    ci / web (push) Successful in 1m7s
    ci / docs-site (push) Successful in 1m23s
    windows / build (aarch64-pc-windows-msvc) (push) Successful in 3m58s
    release / apple (push) Successful in 9m58s
    ci / bench (push) Successful in 4m55s
    ci / rust (push) Successful in 8m57s
    windows / build (x86_64-pc-windows-msvc) (push) Successful in 4m18s
    apple / screenshots (push) Successful in 5m55s
    windows-host / package (push) Successful in 7m56s
    windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 1m19s
    windows-msix / package (x64, C:\Users\Public\ffmpeg, x86_64-pc-windows-msvc, C:\t) (push) Successful in 1m16s
    android-screenshots / screenshots (push) Successful in 2m29s
    arch / build-publish (push) Successful in 5m11s
    decky / build-publish (push) Successful in 19s
    android / android (push) Successful in 4m36s
    flatpak / build-publish (push) Successful in 5m7s
    linux-client-screenshots / screenshots (push) Successful in 6m15s
    rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 10m14s
    web-screenshots / screenshots (push) Successful in 2m40s
    rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 9m45s
    docker / deploy-docs (push) Successful in 7s
    docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
    docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 5s
    docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 5s
    docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 6s
    docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 8s
    deb / build-publish (push) Successful in 4m21s
    Stable

    enricobuehler released this 2026-07-05 19:45:56 +00:00 | 2 commits to main since this release

    Wire-compatible with 0.7.x — existing pairings and clients keep working.

    Display management — configurable virtual displays

    punktfunk gives every client a virtual output at its exact resolution and refresh. This release adds a user-configurable policy surface on top of that, editable from a new Virtual displays section in the web console (persisted to display-settings.json). Unconfigured hosts behave exactly as before — nothing changes until you opt in.

    • Keep-alive displays. A virtual display can now outlive the client that created it, so a momentary disconnect no longer tears the monitor down and reshuffles your windows. Reconnect is hardened: a returning client reclaims its own display instead of spawning a second one, a deliberate quit skips the linger entirely, and the disconnect-detection timeout is tunable (PUNKTFUNK_IDLE_TIMEOUT_MS).
    • Forever displays (gaming-rig). Pin a virtual display for the lifetime of the host — created once and kept, ideal for a headless streaming box that should always present the same screen. Released on demand from the console or POST /api/v1/display/release.
    • Topology. Choose how the virtual output sits relative to the machine's real monitors — extend, primary (virtual becomes primary, physicals stay on), or exclusive (virtual is the sole display) — independently of everything else.
    • Conflict handling. When a second client asks for a display that's already busy, decide up front: separate / join / steal / reject. Windows (single-capturer IDD) defaults to reject with a clean error; GameStream returns 503.
    • Per-client identity, and scaling that sticks. Each client gets a stable display identity, so on KDE your display scale round-trips — set the virtual output to 150 % or 125 % once and it is reapplied automatically on every reconnect.
    • Multi-monitor. Several clients can act as monitors of a single desktop via display groups and a layout engine, arranged in a console x/y table.

    Validated live on KWin (KDE), Mutter (GNOME), and the Windows IDD host. The status tray now lists any kept virtual displays in its tooltip.

    GNOME / Mutter — high refresh by default

    GNOME hosts now stream above 60 Hz with no configuration. The high-refresh virtual-monitor path (the client's exact WxH@Hz via Mutter's RecordVirtual) was previously gated behind an opt-in flag, added after an old gnome-shell teardown crash. That crash is fixed, so the flag is gone — a 120/144/240 Hz client gets its real refresh out of the box. (On a host that also has a physical monitor attached, promoting the desktop and cursor onto the streamed output still uses Topology = Exclusive or PUNKTFUNK_MUTTER_VIRTUAL_PRIMARY=1.)

    Performance & connectivity

    • GameStream: FEC packetization moved off the encode loop into a dedicated pipeline stage, taking forward-error-correction work off the video critical path.
    • Native protocol: configurable data-plane port (--data-port) — the punktfunk/1 data plane can bind a fixed UDP port and stream directly, skipping the hole-punch (and its ~2.5 s timeout) on a firewalled host.

    Clients — Wake-on-LAN and saved-host editing

    • Wake a sleeping host, and wait for it. The macOS/iOS/tvOS and Android clients now send the wake-on-LAN magic packet and show a wait-until-up overlay — power the box on and watch it come online before the stream connects, instead of failing against a host that isn't ready yet.
    • Edit saved hosts. Both clients gained saved-host editing with MAC prefill, so wake-on-LAN is one tap away.
    • Android also gets a console-style UI refresh and TV/tablet layout polish.
    • macOS drops a sandbox entitlement that the App Store rejected.

    Packaging & install

    • Firewall openers now ship on RPM and DEB (firewalld services, shared from packaging/linux), alongside a web-console opener — the host's ports are opened for you on a fresh install.
    • CachyOS firewall handling corrected to ufw, with ufw openers.
    • Arch repo setup is fish-safe, ships firewalld services, and fixes the client package label.

    Release engineering

    • The Rust toolchain is now pinned to an exact version (rust-toolchain.toml, 1.96.0) instead of the floating stable channel. A rebuilt CI image no longer silently changes rustfmt's rules and red-lights cargo fmt --all --check on untouched files — local development, Linux CI, and the Windows runner all format identically now.

    Install

    Per-platform install and upgrade instructions: https://punktfunk.unom.io/docs/install — channel details: https://punktfunk.unom.io/docs/channels

    The app-store builds (Apple TestFlight, Google Play alpha) are uploaded to their testing tracks and promoted manually.

    Downloads