`punktfunk-gamescope` had never been published to the apt registry — not in any release. It was built inside the host job's Ubuntu 24.04 image, where it cannot build: our pin vendors wlroots 0.19.3, which floors `wayland-server` at 1.23.1, and noble ships 1.22.0 (it also lacks libxcb-errors-dev and has only libdisplay-info 0.1.1). Every rung of that path was a `::warning::` returning 0 and the one hard gate ran last by design, so v0.26.0 and v0.27.0 both released with the package missing while docs-site told apt users to install it. The same tags shipped it fine for Arch, Fedora 44 and Bazzite. It now builds in its own job on Debian 13 (ci/gamescope-trixie.Dockerfile), the oldest apt base the tree configures on. One package serves Debian 13 AND Ubuntu 26.04 — measured by installing and running it on both — because the build also vendors libdisplay-info via the new `--extra-fallback` option: linked against the distro copy it demands `libdisplay-info2` on trixie, which Ubuntu 26.04 does not have (it carries libdisplay-info3). The option is opt-in, so the Arch/Fedora/nix outputs are byte-for-byte unchanged. Ubuntu 24.04 gets no gamescope package and cannot — its wayland is too old to run one however built. Debian 13 is now a documented host target. That needed no packaging change at all: the host .deb's glibc-2.39 floor and bundled FFmpeg already made it installable, and it had been working for a long time while docs-site said Debian was unsupported and unverified. Verified by installing: host, web console and plugin runner install, resolve every soname and run. The desktop client stays Ubuntu-26.04-only (built there, floors at `libc6 >= 2.43`; Debian 13 has 2.41). Compositor detection now answers Cinnamon (Mint, LMDE) with the route that works instead of advice that cannot help. Muffin forked from Mutter 3.36: `org.cinnamon.Muffin.ScreenCast` has only RecordMonitor/RecordWindow, never RecordVirtual, and xdg-desktop-portal-xapp implements no ScreenCast — so no value of PUNKTFUNK_COMPOSITOR makes a Cinnamon desktop host a virtual display. The error names headless gamescope, which needs no desktop compositor. The XDG sniff moved into a pure function so those branches are testable; Cinnamon is matched before GNOME, since it is a GNOME derivative and the generic arm would otherwise hand it the Mutter backend (caught by the new test). New `smoke-install` job installs every published package from the registry in pristine ubuntu:24.04, ubuntu:26.04 and debian:trixie images, asserts each binary resolves its libraries and runs, and insists the version served is the one this run built. Nothing in deb.yml had ever installed a package it produced, which is how both of the above survived unnoticed. ⚠ Bootstrap: seed `punktfunk-gamescope-trixie:latest` into the LAN registry once (docker.yml builds it thereafter) or the new job cannot start.
14 KiB
title, description
| title | description |
|---|---|
| Install the Host | Install the Punktfunk host — on Linux from its package registry, or on Windows from a signed installer. |
On Linux, the package registries are the real distribution channel. Pick your distro, add the repo, and install with your native package manager. Each row links to the full per-distro guide (add the repo, first-run steps, the web console) — those are the source of truth, so this page doesn't duplicate them. On Windows, the host ships as a signed installer instead — see Windows.
First, read Security & Safe Use. A streaming host is remote control of the machine. It's built for trusted local networks — don't expose it to the internet, and be thoughtful about which machine you host on (especially on Windows).
Pick your distro
| Distro | Package manager | One-command happy path | Guide |
|---|---|---|---|
| Ubuntu | apt | sudo apt install punktfunk-host |
Ubuntu · packaging/debian |
| Debian 13 (incl. LMDE) | apt | sudo apt install punktfunk-host |
Debian · packaging/debian |
| Bazzite / Fedora Atomic | systemd-sysext | curl -fsSLO https://git.unom.io/unom/punktfunk/raw/branch/main/packaging/bazzite/punktfunk-sysext.sh && sudo bash punktfunk-sysext.sh install (no layering, no reboot) |
Bazzite · packaging/bazzite |
| Fedora (dnf) | dnf / rpm-ostree | sudo dnf install punktfunk |
Fedora · packaging/rpm |
| Arch | pacman | sudo pacman -Syu punktfunk-host (binary repo — always a full -Syu, never -Sy) |
Arch Linux · packaging/arch |
| SteamOS (host) | on-device script | clone the repo, then bash ~/punktfunk/scripts/steamdeck/install.sh (builds on-device) |
SteamOS (Host) |
| NixOS / Nix | nix flake | nix run git+https://git.unom.io/unom/punktfunk#punktfunk-host -- serve --gamestream |
NixOS · packaging/nix |
Each registry is public — no auth, you just trust the repo's signing key. Adding the repo is a
one-time step covered in the linked guide; after that, normal apt upgrade / dnf upgrade /
pacman -Syu (or sudo punktfunk-sysext update on Bazzite) tracks new builds. On NixOS there
is no repo to add — you add the flake as an input and enable its module, see NixOS.
Stable vs canary. The repos in the per-distro guides are the stable channel — it only moves when a
vX.Y.Zrelease is cut. For the latestmainbuild (fast, possibly broken), point at the canary channel instead (canaryapt distribution /*-canaryrpm group). See Release Channels.
Windows
Punktfunk also runs as a native host on Windows 11 22H2+ (x64), shipped as a signed installer — see Windows Host for what it includes and its limitations.
For hardware encode you need a GPU — NVIDIA (NVENC), AMD (AMF), or Intel (QSV); there's a software
fallback without one. More detail — including the CLI punktfunk-host service install path — is in
Running as a Service → Windows.
winget (recommended)
In an admin PowerShell, register the Punktfunk source once, then install:
winget source add -n punktfunk https://winget.punktfunk.unom.io -t Microsoft.Rest
winget install unom.PunktfunkHost
Later, winget upgrade unom.PunktfunkHost updates it in place. Add --interactive to get the full
wizard instead (the optional task checkboxes, the web-console password page). winget carries
stable releases only — canary builds are not published there.
Manual download
Download punktfunk-host-setup-<ver>.exe and run it elevated. The full procedure — where to get it,
everything the installer puts on the machine, its optional tasks, the console password, and the
/VERYSILENT unattended switch — lives on one page: Windows Host → Install.
This is also the path for canary builds, which winget doesn't carry — see
Release Channels for that download.
About the Unknown Publisher prompt. The installer is signed with a self-signed certificate, so Windows warns before it runs — accepting the prompt is enough, nothing else is required. The winget route is no different: it downloads and runs that same installer. If you'd rather silence it, the matching
punktfunk-host-windows_<ver>.ceris published next to the installer, and it's the same certificate for every release, so this is one-time. A self-signed certificate is its own root, so it has to go in both stores. In an admin PowerShell:Import-Certificate -FilePath .\punktfunk-host-windows_<ver>.cer ` -CertStoreLocation Cert:\LocalMachine\Root Import-Certificate -FilePath .\punktfunk-host-windows_<ver>.cer ` -CertStoreLocation Cert:\LocalMachine\TrustedPublisherThis is a different certificate from the one the bundled drivers are signed with — the installer imports that one for you.
NixOS
The repo's flake.nix is a supported install path: it builds punktfunk-host, punktfunk-client,
punktfunk-web and punktfunk-scripting, and ships a NixOS module. x86_64-linux only, and
NixOS 24.11 or newer.
You can run it straight from the flake without NixOS (on other distros, wrap it in nixGL so the GPU drivers resolve):
nix run git+https://git.unom.io/unom/punktfunk#punktfunk-host -- serve --gamestream
On NixOS, add the flake as an input, add punktfunk.nixosModules.default to your system's modules,
and enable the host:
services.punktfunk.host = {
enable = true;
users = [ "alice" ]; # added to the `input` group, for virtual gamepads
openFirewall = true;
desktopSession = true; # on a machine you log into — see below
settings = { RUST_LOG = "info"; }; # these become host.env
};
The module does declaratively what the deb/RPM scriptlets do — the systemd user service, udev rules,
kernel modules, sysctl tuning, the firewall ports and input group membership — and brings in the
web console alongside the host. Because settings writes the environment file for you, skip the
host.env step in After installing.
Set desktopSession = true on any machine somebody logs into. It ties the host to
graphical-session.target, so restarting Plasma or GNOME restarts the host with it. Without it the
host keeps running against a compositor that no longer exists — still listening, still answering,
and failing at capture on every session after that. Leave it off for the headless appliance route
(a pinned compositor or a gamescope box), which may never reach that target. Same reasoning, and
the same caveats for Sway and Hyprland, as Restart the host with your
desktop.
The host and console user services are defined but not started (set autoStart = true for an
appliance), so from your graphical session enable them:
systemctl --user enable --now punktfunk-host punktfunk-web
The plugin runner needs no such step — like the deb and RPM, the module starts it for you, because
the game-library scanners ship as plugins. Opt out with
services.punktfunk.scripting.autoStart = false;.
The full option reference (client, console and scripting options, GPU driver notes, headless
appliance setup) is in
packaging/nix. To
update, run nix flake update punktfunk in your flake directory, then sudo nixos-rebuild switch.
What the packages are
-
punktfunk-host— the streaming host. Install this on your Linux gaming machine. -
punktfunk-web— the browser management console (pairing + status). Recommended alongside the host. On apt and RPM the host package recommends it, so your package manager pulls it in by default, and the Bazzite sysext image already contains it. On Arch it's an optional dependency, so name it yourself:sudo pacman -Syu punktfunk-web. -
punktfunk-client— the GTK4 desktop client, for streaming to a Linux box (shipped via apt / RPM / Arch, and as a Flatpak). On a Steam Deck take the Flatpak instead — SteamOS's/usris read-only, so the native package isn't the path there:flatpak install --user https://flatpak.unom.io/io.unom.Punktfunk.flatpakrefFor Gaming Mode, add the Decky plugin on top of it. Full client instructions for every device: Install a Client.
-
punktfunk-scripting— the plugin/script runner, behind plugins and automation. The game-library scanners ship as plugins, so a host without the runner can come up with an empty library — which is why apt, dnf, the Bazzite sysext and the NixOS module all start it for you. On Arch and source installs it is not started, so enable it yourself:systemctl --user enable --now punktfunk-scriptingTo opt out where it is on:
systemctl --user mask punktfunk-scripting(mask, notdisable— a plain disable cannot remove a symlink that lives in/etcor/usr), or on NixOSservices.punktfunk.scripting.autoStart = false;.
After installing
These three steps are for the Linux packages. On Windows the installer does the equivalent for you; on NixOS the module does steps 1 and 2, and NixOS above has the units to enable.
-
Add yourself to the
inputgroup — virtual gamepads and pen input both need/dev/uinput— then re-login. The exact command differs per distro — see your guide (usermod -aG input "$USER", orujust add-user-to-input-groupon Bazzite).Also join
punktfunk—sudo usermod -aG punktfunk "$USER", then log out and back in — if either of these is true: you want the virtual Steam Deck controller (paddles, trackpads, gyro), or this box autologins into Steam Gaming Mode and you want the host to take that session over at your client's resolution (gamescope). Your package created that group at install time and left it empty. It gates the usbip nodes the pad attaches through and the helper that stops the display manager for a takeover, and it is separate frominputon purpose, because writing those nodes can present arbitrary emulated USB hardware — so join it only on a machine you trust. On a plain desktop host that streams no Gaming Mode, skipping it costs you nothing but that one pad type. -
Put your
host.envin place, then start the host. Every Linux package ships a systemd user unit, so you don't run the host by hand — but that unit reads~/.config/punktfunk/host.envand won't start until the file exists. Each package ships a template to copy; your distro and desktop guides say which one to pick (on Bazzite it'shost.env.bazzite):mkdir -p ~/.config/punktfunk # /usr/share/punktfunk/ on Fedora/Arch/Bazzite, /usr/share/punktfunk-host/ on Ubuntu cp /usr/share/punktfunk/host.env.example ~/.config/punktfunk/host.env systemctl --user enable --now punktfunk-hostThe shipped unit runs
serve --gamestream— the nativepunktfunk/1plane plus the GameStream/Moonlight-compatible planes, so stock Moonlight clients work out of the box. Those extra planes are only appropriate on a trusted LAN. To run native-only, drop the flag with a drop-in (systemctl --user edit punktfunk-host):[Service] ExecStart= ExecStart=/usr/bin/punktfunk-host serveThe empty
ExecStart=is required — without it systemd adds a second command instead of replacing the first — and the binary path has to match your install (systemctl --user cat punktfunk-hostshows it; the distro packages use/usr/bin). Save the drop-in, thensystemctl --user restart punktfunk-host. For what each mode starts, see Host CLI →serve. -
Enable the web console:
systemctl --user enable --now punktfunk-webThen open
https://<host-ip>:47992. Reading its login password and arming PIN pairing are covered in The Web Console.
Configure your desktop
How the virtual display and input work depends on your desktop — see KDE, GNOME, Steam / gamescope, Hyprland, or Sway for the compositor-specific setup.
From there, follow the Quick Start to pair your first client. To run the host automatically at boot, see Running as a Service. If something doesn't come up, Troubleshooting starts from the symptom.
Updating and removing
The web console's Host → Updates card tells you when a newer host is out and shows the exact command for the way you installed — the full list, plus one-click updating and how to turn the check off, is on Updating the Host.
To take it back off, see Uninstall — it covers every install method and what is
deliberately left behind (your ~/.config/punktfunk — identity certificate, paired devices, console
password — survives package removal).
Building from source
If no package exists for your platform, you can build from source — see the repository README. Source builds are a fallback; the registries are the supported path.