audit / bun-audit (plugin-kit) (push) Successful in 17s
audit / pnpm-audit (push) Successful in 9s
audit / cargo-audit (push) Successful in 34s
audit / bun-audit (sdk) (push) Successful in 1m8s
apple / swift (push) Successful in 1m17s
audit / bun-audit (web) (push) Successful in 1m24s
audit / docs-site-audit (push) Successful in 1m24s
android / android (push) Canceled after 2m9s
apple / screenshots (push) Canceled after 0s
arch / build-publish (push) Canceled after 2m12s
audit / license-gate (push) Canceled after 1m39s
ci / rust (push) Canceled after 1m39s
ci / rust-arm64 (push) Canceled after 1m4s
ci / web (push) Canceled after 43s
ci / docs-site (push) Canceled after 43s
deb / build-publish (push) Canceled after 0s
deb / build-publish-host (push) Canceled after 0s
deb / build-publish-client-arm64 (push) Canceled after 0s
docker / builders (--build-arg FEDORA_VERSION=44, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm, -f44) (push) Canceled after 0s
docker / builders (ci/android-ci.Dockerfile, punktfunk-android-ci) (push) Canceled after 0s
docker / builders (ci/arch-ci.Dockerfile, punktfunk-arch-ci) (push) Canceled after 0s
docker / builders (ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Canceled after 0s
docker / builders (ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Canceled after 0s
docker / builders (ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Canceled after 0s
docker / builders-arm64cross (push) Canceled after 0s
docker / apps (., web/Dockerfile, punktfunk-web) (push) Canceled after 0s
docker / apps (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Canceled after 0s
docker / deploy-docs (push) Canceled after 0s
flatpak / build-publish (push) Canceled after 4s
release / apple (push) Canceled after 1m5s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Canceled after 5s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Canceled after 5s
windows-host / package (push) Canceled after 0s
windows-host / winget-source (push) Canceled after 0s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Canceled after 2m6s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Canceled after 0s
windows / build (aarch64-pc-windows-msvc) (push) Canceled after 0s
windows / build (x86_64-pc-windows-msvc) (push) Canceled after 0s
The 0.22.0 clobber proved a gap no build gate covers: a wrong program wearing the
right binary name compiles green. `cargo build -p punktfunk-client-session` happily
shipped the GTK shell's three-line Windows stub as punktfunk-session, because nothing
between commit and release ever EXECUTED the result.
Two integration tests close the class, and they run under gates that already exist
(ci.yml's workspace test on Linux, windows.yml's test step on Windows):
- contract_smoke spawns the real punktfunk-session against a refusing port and
asserts the stdout contract answers — whatever fails first on the machine
(presenter init headless, the dial elsewhere), the binary must SAY so in a
contract line. Proven non-vacuous by planting the 0.22.0 stub and watching it
fail, then pass again on the real main.rs.
- cli_smoke runs the real punktfunk over its help surface (stdout, exit 0) and an
unknown verb (stderr, exit 5) — store-free and network-free, safe on any runner.
windows.yml now gates punktfunk-cli in all four steps (build, clippy, fmt, test): the
MSIX has shipped its `punktfunk.exe` alias since bf981027, but only the release
workflow ever compiled it — a PR could break the CLI and find out on tag day.
The session README also stops selling `--pair` as the enrolment route (deprecated by
bf981027, `punktfunk pair` is the door) and says out loud what this binary is: a
deliberately dumb renderer the GTK shell, the WinUI shell and the CLI all call into
through one brain.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
67 lines
4.1 KiB
Markdown
67 lines
4.1 KiB
Markdown
# punktfunk-session
|
|
|
|
The Vulkan session binary: one stream per invocation in an SDL3 window — no UI toolkit,
|
|
no widgets, terminal stats. The power-user / gamescope stream client, and the stage-2
|
|
presenter of the Linux client re-architecture (punktfunk-planning:
|
|
`linux-client-rearchitecture.md`).
|
|
|
|
This binary is deliberately dumb: a renderer the front-ends call INTO — the GTK shell
|
|
(`punktfunk-client`), the WinUI shell, and the `punktfunk` CLI all spawn it through the
|
|
same brain (`pf_client_core::orchestrate`), which resolves policy (profiles, settings,
|
|
wake) and hands the result down, normally as a `--resolved-spec` file. It reads the
|
|
shared stores only as the compat fallback for a bare hand-launched invocation.
|
|
|
|
```
|
|
punktfunk-session --connect host[:port] [--fp HEX] [--launch id] [--fullscreen] [--stats]
|
|
punktfunk-session --browse host[:port] [--mgmt PORT] [--fullscreen]
|
|
```
|
|
|
|
`--browse` opens the console game library (the Skia coverflow over the animated aurora)
|
|
instead of connecting: A launches the focused title as a stream in the same window,
|
|
session end returns to the library, B quits (Gaming Mode returns). Paired hosts only —
|
|
pairing is the desktop client / Decky plugin's job. `PUNKTFUNK_FAKE_LIBRARY=<file.json>`
|
|
feeds canned entries with no host (portrait paths starting with `/` load from disk).
|
|
|
|
Reads the same identity / known-hosts / settings stores as the desktop client
|
|
(`punktfunk-client`), so enrolling on either side makes the other work; this binary never
|
|
connects to a host it has no pinned fingerprint for (`--fp HEX` overrides the store).
|
|
|
|
Pairing is `punktfunk pair <host>` — the CLI, which ships alongside this binary in every
|
|
package and needs no window and no toolkit either. `punktfunk-session --pair` still works
|
|
for one release (someone's provisioning script calls it today) but prints a deprecation
|
|
notice: pairing is a trust ceremony and belongs to the brain, not a renderer.
|
|
|
|
Stdout is the machine interface: `{"ready":true}` after the first presented frame,
|
|
`stats: …` once per second while the overlay tier isn't Off (always the full detailed
|
|
text, whatever the OSD shows; `--stats` forces the overlay on), one
|
|
`{"error"|"ended": …}` JSON line on the way out. Logs go to stderr. Exit codes: `0`
|
|
clean end, `2` connect failed, `3` trust rejected / pairing required, `4` presenter
|
|
init failed.
|
|
|
|
In-stream keys match the desktop client: click captures input (Ctrl+Alt+Shift+Q
|
|
releases), Ctrl+Alt+Shift+D disconnects, F11 toggles fullscreen; the controller escape
|
|
chord (L1+R1+Start+Select, hold to disconnect) works the same.
|
|
|
|
The default build carries the Skia console UI (`ui` feature): the stats OSD and capture
|
|
hint render in-window. Ctrl+Alt+Shift+S cycles the OSD tier live — Off → Compact (one
|
|
line: fps · latency · Mb/s) → Normal (mode + end-to-end percentiles) → Detailed (decoder
|
|
path + per-stage latency equation); any tier but Off also emits the stdout mirror.
|
|
`--no-default-features` is the ~5 MB power-user build — same streaming, stats on stdout
|
|
only, no Skia anywhere in the dependency tree.
|
|
|
|
Decode follows the Settings preference (auto: Vulkan Video → VAAPI → software on Linux,
|
|
Vulkan Video → D3D11VA → software on Windows): FFmpeg's Vulkan Video decoder runs on the
|
|
presenter's own device where the stack supports it (every vendor, zero copy); VAAPI
|
|
dmabufs import per-plane elsewhere (D3D11VA textures on Windows); software is the
|
|
universal fallback. 10-bit Main10 and HDR10 are advertised
|
|
(`VIDEO_CAP_10BIT|HDR`): P010 decodes through all three paths, and PQ streams present
|
|
on an HDR10/ST.2084 swapchain when the desktop offers one (KDE HDR, gamescope) or
|
|
tone-map in-shader to SDR when it doesn't (`PUNKTFUNK_TONEMAP_PEAK` tunes the rolloff,
|
|
default ≈1000 nits). The host still gates the upgrade behind its `PUNKTFUNK_10BIT`
|
|
policy.
|
|
|
|
Debug/bisect knobs: `PUNKTFUNK_DECODER=vulkan|vaapi|d3d11va|software`, `PUNKTFUNK_PRESENT_MODE=
|
|
mailbox|immediate` (default FIFO), `PUNKTFUNK_VK_DEVICE=<index>` (multi-GPU), and
|
|
`PUNKTFUNK_HW_FAULT=import` (fault every VAAPI dmabuf import — proves the three-strike
|
|
demotion to software on healthy hardware).
|