Files
punktfunk/docs-site/content/docs/bazzite.md
T
enricobuehler e586961e0b
ci / rust (push) Has been cancelled
docs(site): make docs-site the knowledge base — status tracker + setup guides
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>
2026-06-12 11:33:39 +00:00

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-wl on 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.