Make the host docs match the real distribution path and the actual CLI. Reviewed by a multi-agent pass (6 editors against one verified fact sheet + an accuracy reviewer); its findings (a wrong client-Recommends claim, a native-concurrency overstatement) folded in. - Install front door: new README "Install (host)" method-picker + docs-site/install.md (+ nav), routing each distro to its package registry; source build demoted to a fallback. - Registry-first install: ubuntu-gnome/ubuntu-kde now lead with the apt registry (not a cargo build); bazzite leads with the Gitea RPM registry (was COPR/source). Source builds moved to an appendix. - CLI accuracy: serve --native arms pairing from the web console (NOT --allow-pairing, which with --require-pairing/--max-concurrent is m3-host-only); --open disables mandatory pairing. host-cli/configuration/pairing/quickstart/troubleshooting corrected; mgmt API documented as always HTTPS+token. Native host serves one session at a time (extras queue) — not multi. - Firewall: real ports documented (native UDP 9777 + the ephemeral data port caveat + GameStream ports) for Debian + Arch (ufw + nftables), not just Bazzite. - Sync/accuracy: punktfunk-client (GTK4) presented as a shipping client (not "roadmap"), punktfunk-client-rs as the headless tool; host Recommends punktfunk-web only (not the client); COPR chroots f43/44; bootc header says Gitea registry not COPR. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.5 KiB
title, description
| title | description |
|---|---|
| Bazzite — gamescope | Set up a punktfunk host on Bazzite, streaming a Steam/gamescope session at your client's mode. |
Bazzite already ships everything a punktfunk host needs — the NVIDIA driver, NVENC, PipeWire, and gamescope. So a Bazzite host is the most "appliance-like" setup: the host launches its own gamescope session at the client's resolution and refresh, so your games run at the mode of the device you're streaming to, not the TV the box is plugged into.
This is ideal for a dedicated game-streaming box. For a general desktop, prefer Ubuntu/Fedora KDE or GNOME.
Install
The host ships as an RPM in punktfunk's Gitea RPM registry (public), so a Bazzite / Fedora
Atomic box layers and updates it with rpm-ostree. Add the repo, then layer the host plus the web
console and reboot:
# Add the repo. Our RPMs are unsigned, but Gitea GPG-signs the repo METADATA — verify that
# (repo_gpgcheck=1) and skip the per-package signature check (gpgcheck=0). The signed metadata
# carries each package's SHA256, so authenticity still holds. (Don't curl Gitea's served
# bazzite.repo verbatim — it sets gpgcheck=1, which fails on unsigned packages.)
sudo tee /etc/yum.repos.d/punktfunk.repo >/dev/null <<'REPO'
[gitea-unom-bazzite]
name=punktfunk (unom, Bazzite)
baseurl=https://git.unom.io/api/packages/unom/rpm/bazzite
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=https://git.unom.io/api/packages/unom/rpm/repository.key
REPO
# Layer the host + the web console, then reboot into the new deployment.
# (punktfunk Recommends punktfunk-web; list it explicitly so it's pulled regardless of weak-dep
# settings — the Gitea registry carries punktfunk-web, which COPR can't build.)
rpm-ostree install punktfunk punktfunk-web
systemctl reboot
rpm-ostree upgrade then tracks new builds automatically (Bazzite's auto-update timer does this
for you). For a fully baked appliance image there's also a bootc Containerfile that installs
the same RPMs from this registry — see packaging/bootc/ and packaging/rpm/README.md in the repo.
Building from source works too (Bazzite is Fedora Atomic underneath, and its FFmpeg builds the host
fine — same steps as Fedora KDE), but the registry is the supported path.
Allow controller input
Gamepad and DualSense input needs your user in the input group. On Bazzite, don't use
usermod — the base is immutable and the group is managed by a recipe. Use:
ujust add-user-to-input-group
Then log out and back in. (A controller that's "detected but does nothing" is almost always this permission, not a client problem.)
Configure
The RPM ships a gamescope-ready config you can copy as your starting point:
mkdir -p ~/.config/punktfunk
cp /usr/share/punktfunk/host.env.bazzite ~/.config/punktfunk/host.env
The key settings in ~/.config/punktfunk/host.env point the host at the gamescope backend:
PUNKTFUNK_COMPOSITOR=gamescope
PUNKTFUNK_GAMESCOPE_SESSION=steam # the host owns a Steam session at the client's mode
PUNKTFUNK_INPUT_BACKEND=gamescope
PUNKTFUNK_ZEROCOPY=1
With this, when a client connects the host starts a gamescope-session-plus (Steam) session at the
client's exact resolution and refresh, and relaunches it if the client changes mode. There should be
no physical gaming session already running on the box.
Run as an always-on host
Bazzite hosts are typically headless. Enable the host service and linger so it starts at boot — see Running as a Service. Because the host launches its own gamescope session per client, you don't need a separate desktop-session unit.
systemctl --user enable --now punktfunk-host
# Web console (pairing + status) — enable it and read the auto-generated login password,
# then open http://<host-ip>:3000:
systemctl --user enable --now punktfunk-web
journalctl --user -u punktfunk-web-init | sed -n 's/.*password generated: //p'
Good to know
- gamescope 3.16.22 or newer is required. Older versions can deadlock during capture. Bazzite's current gamescope is fine; this only bites if you've pinned an old one.
- The mouse cursor isn't included in the captured image — a gamescope limitation for now.
- HDR isn't supported yet on the gamescope path — gamescope's capture output is 8-bit. SDR streams normally.
Then connect a client — Moonlight works great for couch gaming, and the Apple app for Apple TV / iPad.