From d0faebf582a9da463e41c1f9036afbe00730c378 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Thu, 9 Jul 2026 23:02:37 +0200 Subject: [PATCH] chore(release): bump workspace version to 0.9.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Release 0.9.0 — the Windows client grows up, bitrate goes adaptive, and the console shell arrives. The headline: Windows now runs the same Vulkan session client as Linux (session-always), with a single-window handoff from the shell, a shared settings store, a game library page, and D3D11VA hardware decode slotted into the chain (vulkan → d3d11va → software) — plus polish like hiding the local cursor while captured and a Shortcuts help screen. Alongside it, adaptive bitrate lands end to end: set to Automatic, the client's controller re-targets the host encoder mid-stream (rebuild-in-place, the fresh encoder opens on an IDR) instead of riding a fixed rate into congestion. And the console UI grows into a full gamepad shell — host list, PIN pairing, settings, on-screen keyboard, screen transitions. Apple clients gain AV1 decode (hardware-gated advertisement), user-configurable VRR, Game Mode across platforms, cross-client shortcuts, an opt-in V-Sync, and a presenter rework; a stream error now returns to windowed like a disconnect does. Codec selection is real everywhere: clients advertise what their GPU actually decodes and the host picks accordingly — and AV1 encode on Windows NVENC actually opens now: the init stamped HEVC HIGH tier and (on 10-bit sessions) the HEVC Main10 profile GUID onto the AV1 config, so every AV1 session died at the encoder with INVALID_PARAM. AV1 now rides its preset defaults where they are the only accepted values (Main tier, autoselect level — 0 means Level 2.0 on AV1, not autoselect), sets its bit depths on its own config, and a rejected split-encode mode falls back cleanly from AUTO too. Verified live: 10-bit AV1 macOS → RTX 4090. Android's stats HUD headline becomes true capture→displayed via OnFrameRendered, custom resolutions land in both Android UIs (typed W×H in touch settings, kept selectable on the pad — the Apple pattern), and the 3-finger stats tap actually fires now (the two-finger scroll centroid read the third finger's landing as a scroll notch and disqualified the tap). The console shell gates input the instant A starts a Wake-on-LAN connect — the "Waking…" card shows immediately instead of the cursor drifting ungated until the stream abruptly appeared. The web console gets a favicon, Punktfunk-cased branding, a save toast for the auto-saved display policy, and a stop-session button that only goes red when there is a session to stop. Reliability work on the host closes out a long field investigation into periodic virtual-display stutter: the IDD capture path no longer runs CCD display queries on the capture thread (a dedicated poller samples them, measures them, and warns when something is holding the Windows display-config lock), transient descriptor blips can no longer tear the ring down (last- known-good + a two-strikes debounce), and a metronomic keyframe-recovery cycle now names itself in the host log instead of hiding in "nothing in the logs". The GPU inventory filters out IddCx ghost adapters — every host used to list its render GPU twice (pf-vdisplay's adapter mirrors the GPU's whole DXGI identity), with the picker offering a dead twin. Also: per-client display scaling on GNOME hosts (Mutter virtual monitors), the shared-VkQueue race + swapchain recreate-in-use fix behind the intermittent device-lost stream killer, per-family MTU shard sizing (1388 over IPv6 — the v6 blackhole gate), mDNS discovery pinned to IPv4 on every client, reachability-probed presence with shareable Decky host management, --no-mdns/--pairing-pin for headless testing, and an offline-flatpak build fix. The [workspace.package] version (inherited by every crate via version.workspace) is the release being cut; the 14 workspace entries in Cargo.lock and the api/openapi.json info.version are refreshed to match (CI builds --locked). Canary derives from the tag as minor+1 of the latest stable (scripts/ci/pf-version.sh), so cutting 0.9.0 advances canary to 0.10.0. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 28 ++++++++++++++-------------- Cargo.toml | 2 +- api/openapi.json | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 020e935f..b1ac5b00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2154,7 +2154,7 @@ dependencies = [ [[package]] name = "latency-probe" -version = "0.8.4" +version = "0.9.0" [[package]] name = "lazy_static" @@ -2286,7 +2286,7 @@ checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "loss-harness" -version = "0.8.4" +version = "0.9.0" dependencies = [ "punktfunk-core", ] @@ -2765,7 +2765,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pf-client-core" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "async-channel", @@ -2787,7 +2787,7 @@ dependencies = [ [[package]] name = "pf-console-ui" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "ash", @@ -2808,7 +2808,7 @@ dependencies = [ [[package]] name = "pf-ffvk" -version = "0.8.4" +version = "0.9.0" dependencies = [ "ash", "bindgen", @@ -2817,7 +2817,7 @@ dependencies = [ [[package]] name = "pf-presenter" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "ash", @@ -3001,7 +3001,7 @@ dependencies = [ [[package]] name = "punktfunk-client-android" -version = "0.8.4" +version = "0.9.0" dependencies = [ "android_logger", "jni", @@ -3017,7 +3017,7 @@ dependencies = [ [[package]] name = "punktfunk-client-linux" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "async-channel", @@ -3033,7 +3033,7 @@ dependencies = [ [[package]] name = "punktfunk-client-session" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "pf-client-core", @@ -3048,7 +3048,7 @@ dependencies = [ [[package]] name = "punktfunk-client-windows" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "async-channel", @@ -3072,7 +3072,7 @@ dependencies = [ [[package]] name = "punktfunk-core" -version = "0.8.4" +version = "0.9.0" dependencies = [ "aes-gcm", "bytes", @@ -3103,7 +3103,7 @@ dependencies = [ [[package]] name = "punktfunk-host" -version = "0.8.4" +version = "0.9.0" dependencies = [ "aes", "aes-gcm", @@ -3175,7 +3175,7 @@ dependencies = [ [[package]] name = "punktfunk-probe" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "mdns-sd", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "punktfunk-tray" -version = "0.8.4" +version = "0.9.0" dependencies = [ "anyhow", "ksni", diff --git a/Cargo.toml b/Cargo.toml index f3f8042d..aa896c26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ exclude = [ ndk = { path = "clients/android/native/vendor/ndk" } [workspace.package] -version = "0.8.4" +version = "0.9.0" edition = "2021" rust-version = "1.82" license = "MIT OR Apache-2.0" diff --git a/api/openapi.json b/api/openapi.json index f0dc69da..061c3998 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -10,7 +10,7 @@ "name": "MIT OR Apache-2.0", "identifier": "MIT OR Apache-2.0" }, - "version": "0.8.4" + "version": "0.9.0" }, "paths": { "/api/v1/clients": {