---
title: Bazzite
description: Install the Punktfunk host on Bazzite (or any Fedora Atomic spin) as a sysext — no layering, no reboot — and stream both Gaming Mode and the desktop.
---

Bazzite already ships everything a host needs — the NVIDIA driver, NVENC, PipeWire, gamescope, KDE
Plasma — so this is the most appliance-like setup. One host streams **both** of Bazzite's faces,
Steam **Gaming Mode** and the **KDE desktop**, and follows the box when you switch, even mid-stream.
Nothing in the config picks a mode.

## 1. Install the host

The host installs as a **systemd system extension** — it overlays `/usr` from
`/var/lib/extensions/`, survives OS updates, and installs, updates and uninstalls **without a
reboot** (no `rpm-ostree` layering, which Bazzite's docs treat as a last resort). The feed is
signed; the installer refuses one it can't verify.

<Install platform="bazzite" />

That fetches the newest image — host, web console, tray, the plugin runner (started for you, because
the game-library scanners are [plugins](/docs/plugins)) and the HDR `punktfunk-gamescope` build — and
applies the udev/sysctl setup on the spot. From then on `sudo punktfunk-sysext update` (or the
[console's update button](/docs/updating)) moves you to the newest build; `status` shows where you
are. After an update restart the host: `systemctl --user restart punktfunk-web punktfunk-host`.

## 2. Let it use your controllers

On Bazzite the `input` group is managed by a recipe, so don't `usermod` it — use the helper. The
`punktfunk` group is ours (the sysext creates it) and gates the **virtual Steam Deck controller**
(paddles, trackpads, gyro) — without it that pad arrives as an ordinary Xbox 360 controller. Then
**log out and back in**:

```sh
ujust add-user-to-input-group
sudo usermod -aG punktfunk "$USER"
```

([Why it's a separate group](/docs/gamescope#nobara-and-other-autologin-display-managers).)

## 3. Start it

Bazzite hosts are usually headless, so enable the services **and** linger, from a terminal in the
desktop session — without linger the `--user` units wait for a login that never comes:

```sh
systemctl --user enable --now punktfunk-host punktfunk-web
sudo loginctl enable-linger "$USER"
```

Two one-time steps for streaming the **KDE desktop** (Gaming Mode needs neither): log out and back
into the Desktop session once so KWin re-reads the screencast grant the package installed, and seed
the input grant so the host auto-approves instead of popping a dialog nobody can answer:

```sh
bash /usr/share/punktfunk/bazzite/kde-desktop-setup.sh
```

## 4. Open the firewall

Bazzite runs **firewalld**, and a package never opens ports for you — until you allow it, no client
can reach the host. The image installed the service definitions; enable them once:

```sh
sudo firewall-cmd --reload   # load the definitions the package installed
sudo firewall-cmd --permanent --add-service=punktfunk-native --add-service=punktfunk-web
sudo firewall-cmd --reload
```

(`punktfunk-web` is only needed to reach the console from another device; Moonlight compat needs
`punktfunk-gamestream` too — [Ports & firewall](/docs/ports).)

**That's the install.** Continue with the [Quick Start from step 3](/docs/quickstart#3-open-the-web-console)
— open the console, pair a client, stream. Moonlight works great for couch gaming here, the Apple
app for Apple TV and iPad.

## When you want more

- **Gaming Mode: what the client gets.** By default the host relaunches Gaming Mode *headless* at the
  client's exact resolution (a display of its own, real HDR, the compositor's cursor), idling the
  box's own session with a user-level drop-in for the length of the stream — no privilege needed,
  and Steam's "Switch to Desktop" keeps working — and restores the box on idle. `PUNKTFUNK_GAMESCOPE_ATTACH=1` makes it attach to the box's own session instead —
  rock-solid switching, but a box with a screen serves a *mirror* of it, and loses HDR and the cursor.
  [How the host gets a gamescope](/docs/gamescope#how-the-host-gets-a-gamescope) has the whole
  model; the Bazzite template (`/usr/share/punktfunk/host.env.bazzite`) forces neither.
- **Stream lags, then freezes, with a DualSense-type client pad** — an SELinux storm, with a shipped
  fix: [Troubleshooting](/docs/troubleshooting#stream-lags-then-freezes-with-a-dualsense-pad-bazzite-selinux).
- **Channels, rollback, after a Bazzite major rebase** —
  [Updating → Bazzite sysext](/docs/updating#bazzite-sysext-channels-rollback-and-rebases).
  Removing it — [Uninstall](/docs/uninstall#bazzite--fedora-atomic-systemd-sysext).
- **Other ways in.** Plain `rpm-ostree` layering from the [RPM repo](/docs/fedora#2-install-the-host)
  (use the `bazzite` group) still works, and `packaging/bootc/` in the repo bakes an appliance image;
  the sysext is the supported default. Already layering? Install the sysext (it shadows the layer at
  once), then `sudo rpm-ostree uninstall punktfunk punktfunk-web && systemctl reboot`.
- Everything Gaming-Mode-specific — overlay, touch, HDR, the two gamescope version floors —
  [Steam / gamescope](/docs/gamescope); the desktop — [KDE](/docs/kde).
