Per the new docs workflow (docs-site = KB layer; repo docs/ keeps design notes): - Add a canonical Status & Progress tracker (status.md): milestones, per-box live state, and a dated progress log — the go-forward place to track progress. - Add setup guides: GNOME/Mutter host (gnome-box — Secure Boot MOK enroll, the libnvidia-gl EGL fix, autologin, screen-lock disable, appliance unit), headless KDE box, and Bazzite host (ujust input group, gamescope session, gotchas). - Roadmap is now canonical in docs-site (synced the skew-handshake section 12 update); removed the repo docs/roadmap.md copy and repointed README to docs-site. - Nav (meta.json) + landing cards updated; site builds (bun run build). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.4 KiB
title, description
| title | description |
|---|---|
| Bazzite / SteamOS-like Host | Run punktfunk on Bazzite as a headless Steam host — gamescope session at the client's mode, input perms, and the gotchas. |
Running punktfunk on Bazzite (Fedora Atomic / SteamOS-like) as a headless game-streaming host.
The host launches a gamescope session at the client's exact resolution + refresh, so games see
the client mode, not the box's TV. Full packaging (COPR / RPM / bootc) is in
packaging/bazzite/README.md; this page is the operational quick-reference.
Input permissions — use the ujust command
Gamepad + DualSense injection needs the user in the input group. On Bazzite you can't just
usermod -aG input (the immutable base + how the group is managed) — use the provided recipe:
ujust add-user-to-input-group
The udev rule (60-punktfunk.rules) grants access to /dev/uinput and /dev/uhid. A DualSense that
shows "detected but no input" is almost always this host-side /dev/uhid//dev/uinput
permission, not a client bug — confirm the input group + the udev rule, then re-login.
Headless Steam session at the client's mode
The host owns a gamescope-session-plus session and relaunches it when the client mode changes, so
games run at the client's resolution + refresh (--nested-refresh + a generated CVT mode). Requires
the headless-appliance prerequisites (linger + multi-user.target) and no physical gaming
session running. Configure via host.env:
PUNKTFUNK_COMPOSITOR=gamescope
PUNKTFUNK_GAMESCOPE_SESSION=steam # host owns the session at the client mode
PUNKTFUNK_INPUT_BACKEND=gamescope
Gotchas
- gamescope ≥ 3.16.22 required. Older versions deadlock capturing on PipeWire ≥ 1.6 (a loop-lock
bug), and a wedged capture link head-blocks the whole PipeWire daemon. Never
pkill -x gamescope-wlon a box where it's the live session compositor — it kills the user's session. - The hardware cursor isn't in the capture (gamescope limitation; won't-fix for now).
- HDR is blocked upstream: gamescope's capture node is 8-bit only (PipeWire HDR export unimplemented), so HDR/10-bit is deferred even though the downstream encode path is ready.
FFmpeg
Bazzite ships FFmpeg 7.x / libavcodec 61 — ffmpeg-sys-next auto-detects it and the host builds
against it (validated live). NVENC (hevc_nvenc / av1_nvenc) works through the system FFmpeg.