• v0.8.4 e28160ebb3

    v0.8.4
    apple / swift (push) Successful in 1m12s
    audit / cargo-audit (push) Successful in 27s
    audit / bun-audit (push) Successful in 15s
    ci / web (push) Successful in 52s
    ci / docs-site (push) Successful in 1m16s
    windows / build (aarch64-pc-windows-msvc) (push) Successful in 49s
    ci / bench (push) Successful in 4m45s
    windows / build (x86_64-pc-windows-msvc) (push) Successful in 55s
    apple / screenshots (push) Successful in 5m55s
    ci / rust (push) Successful in 11m23s
    android-screenshots / screenshots (push) Successful in 2m37s
    windows-host / package (push) Successful in 7m37s
    windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 1m15s
    release / apple (push) Successful in 9m2s
    windows-msix / package (x64, C:\Users\Public\ffmpeg, x86_64-pc-windows-msvc, C:\t) (push) Successful in 1m12s
    android / android (push) Successful in 10m53s
    arch / build-publish (push) Successful in 9m4s
    decky / build-publish (push) Successful in 26s
    docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 5s
    docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
    docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 4s
    docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 2m26s
    docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
    flatpak / build-publish (push) Successful in 4m42s
    deb / build-publish (push) Successful in 10m29s
    linux-client-screenshots / screenshots (push) Successful in 6m36s
    rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 10m41s
    web-screenshots / screenshots (push) Successful in 2m44s
    docker / deploy-docs (push) Successful in 20s
    rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 10m2s
    Stable

    enricobuehler released this 2026-07-08 13:20:22 +00:00 | 3 commits to main since this release

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

    Reconnect reliability — the "host shows Offline" fix

    Reconnecting to a saved host that had stopped advertising on the LAN — but was still perfectly reachable over Tailscale / a VPN / another subnet — could fail outright, with the host tile stuck on "Offline" and no connection attempt reaching the host at all. The cause: the client's presence indicator and its connect action shared the same LAN-only mDNS check, so once a host's Wake-on-LAN MAC had been learned, every reconnect was diverted into a "wake and wait for it to reappear on mDNS" loop that a routed host can never satisfy.

    All clients now dial first: the connection is attempted immediately (a wake packet still goes out up front, harmless if the host is already awake), and only a failed dial falls back to the visible "Waking…" wait. A genuinely sleeping machine on your LAN is still woken and reconnected; a remote host over Tailscale simply connects. Fixed on the macOS/iOS/tvOS, Windows, Linux, and Android clients.

    Host

    • Deliberate disconnect tears the virtual display down immediately (Windows). On a user-initiated quit (⌘D / the disconnect chord), the pf-vdisplay virtual monitor is now released at once instead of lingering — so an immediate reconnect gets a clean fresh display rather than racing the old one's teardown. keep_alive = forever (the gaming-rig preset) still keeps the screen alive — a deliberate quit skips only the linger window, never a pinned display (corrected on both Windows and Linux).
    • Crashes are no longer silent. Panics are now teed into the web console's Logs tab (and the host log) with a backtrace, a last-resort Windows handler names the faulting module when a GPU driver/runtime crashes underneath us, and a watchdog flags a wedged display teardown — so the "it went down with nothing in the logs" class of report finally leaves evidence.
    • Lower-latency input. Pointer motion is applied the moment it arrives rather than waiting for the next input tick.
    • Steam Deck controller on Windows. A connected Steam Deck now folds to a DualSense on Windows hosts, with split-pad touch and trackpad clicks; trackpad Y is carried in screen convention and flipped at the Deck boundary.

    Clients

    • Presenter (Linux/session): switches to MAILBOX presentation for lower-latency, tear-free frames, pushes HDR10 mastering metadata through, tags HDR honestly, and orders the frame layout transition after the decode semaphore. The Linux session opts into RADV Vulkan Video decode at start.
    • Gamepad rumble accepts the v2 vibration valid-flag and bounds a stale buzz to 1.5 s, so a dropped rumble packet can't leave a controller humming.
    • Android gains a tiered stats HUD with windowed lost / skipped / FEC counters.
    • Windows surfaces the stream shortcuts on a Help screen and exits fullscreen when the stream stops.

    Core

    • The QUIC datagram send buffer is capped so audio and rumble are latest-wins under backpressure — no queue of stale audio/haptics building up behind a congested link.
    Downloads