Files
enricobuehler 30d0d36efe
apple / swift (push) Successful in 1m4s
apple / screenshots (push) Successful in 5m26s
android / android (push) Successful in 3m27s
ci / web (push) Successful in 1m7s
ci / docs-site (push) Successful in 1m16s
ci / rust (push) Successful in 4m21s
deb / build-publish (push) Successful in 2m31s
decky / build-publish (push) Successful in 20s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 8s
ci / bench (push) Successful in 4m46s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 11s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 10s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 5s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m0s
flatpak / build-publish (push) Successful in 4m55s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 9m38s
docker / deploy-docs (push) Successful in 6s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 8m25s
feat(decky): self-update without the store + Gaming-Mode launch polish, and ship the Steam Deck docs
Plugin self-update (no Decky store): CI publishes a per-channel manifest.json
({version, immutable per-version artifact, sha256}) beside the zip and bakes
update.json {channel, manifest} into the plugin. main.py `check_update` reads the
installed version from package.json (the value Decky reports — not plugin.json),
fetches the channel manifest, and the frontend shows an "Update to vX" button that
drives Decky Loader's own install RPC (root downloads + SHA-256-verifies + hot-reloads).
CI now stamps a plain-numeric semver (0.3.<run> canary / X.Y.Z stable) into
package.json — a -ciN suffix would mis-order under compare-versions.

Linux client: `--fullscreen` (plus SteamDeck/gamescope env fallback) enters GTK
fullscreen on stream start so Gaming-Mode chrome is hidden; native-mode resolution
falls back to the display's first monitor when the window isn't mapped yet (was
dropping to the 1080p floor — wrong on the Deck's 1280×800); add a confirmed
"Remove saved host" action (KnownHosts::remove_by_fp).

Docs: new docs/steam-deck.md (Decky install/pair/stream/self-update/troubleshooting),
wired into meta.json nav, and cross-linked from clients/install-client/channels. This
is the page docs.punktfunk.unom.io/docs/steam-deck — the website's download link
pointed at it before it existed; committing it makes that link resolve.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:03:44 +00:00

5.1 KiB

title, description
title description
Steam Deck (Decky) Install the punktfunk Decky plugin to discover, pair, and stream from the Steam Deck's Gaming Mode — no drop to Desktop.

The Decky plugin adds a punktfunk panel to the Steam Deck's Quick Access Menu (the button), so you can find a host, pair, and start streaming without leaving Gaming Mode. It's the couch-friendly front end for the Steam Deck — built from real Steam UI, gamepad-navigable end to end.

Under the hood the plugin doesn't decode video itself: it discovers hosts, runs the PIN pairing, and launches the regular Linux client (the io.unom.Punktfunk Flatpak) the way gamescope needs so it fullscreens correctly. So the Deck has two ways to stream, and they share one client + one paired identity:

  • Gaming Mode → the Decky plugin (this page).
  • Desktop Mode → run the Flatpak directly, like any Linux app.

Before you start

You need three things on the Deck:

  1. Decky Loader — the plugin loader. Install it from decky.xyz if you haven't already.

  2. The punktfunk client Flatpak — the plugin launches it, so install it once in Desktop Mode:

    flatpak install --user https://flatpak.unom.io/io.unom.Punktfunk.flatpakref
    

    (Full options: Install a Client → Steam Deck. Without it, the panel's Stream button reports client-not-found.)

  3. A punktfunk host running on your LAN — see Install the Host. The Deck finds it automatically over mDNS, so nothing to configure here.

Install the plugin

The plugin is published as a ready-to-install zip on every build. You don't need the Decky CLI or a developer toolchain — just paste a URL into Decky:

  1. On the Deck, open the Quick Access Menu () → the plug icon (Decky) → the gear (Settings) → enable Developer Mode.

  2. Open the new Developer tab and choose Install Plugin from URL.

  3. Paste the stable link and confirm:

    https://git.unom.io/api/packages/unom/generic/punktfunk-decky/latest/punktfunk.zip
    

The punktfunk panel appears in the Quick Access Menu right away — no Deck restart needed.

Channels. The link above is the stable channel (moves on vX.Y.Z releases). For the latest main build use the canary zip — …/generic/punktfunk-decky/canary/punktfunk.zip — or pin an exact version with …/punktfunk-decky/<version>/punktfunk.zip. See Release Channels.

Use it

Open the punktfunk panel from the Quick Access Menu, or Open punktfunk for the full-screen page (host list + stream settings).

  • Discover — hosts on your network appear automatically (mDNS). Tap Refresh to rescan. A lock icon means the host requires pairing.
  • Pair — for a locked host, arm pairing on the host (its console or web console shows a 4-digit PIN), then enter that PIN on the Deck's keypad. Pairing persists, so the next connection is silent.
  • Stream — pick a host and the stream launches fullscreen in Gaming Mode (as a hidden Steam shortcut, so gamescope focuses it).
  • Settings — resolution, refresh, bitrate, gamepad type, and mic, written to the client the plugin launches. Leave Resolution / Refresh on Native to get the Deck's own mode.

To leave a stream: the in-client controller chord L1 + R1 + Start + Select, or close the "game" from the Steam overlay. Exiting the client ends the Steam game and drops you back to Gaming Mode.

Updating

The plugin checks for updates itself — no Decky store needed. When a newer build is available it shows an Update to vX button (in the Quick Access Menu panel and on the full page). Tap it, confirm Decky's prompt, and the plugin downloads, verifies, replaces itself, and reloads — without leaving Gaming Mode.

The check follows the channel you installed from: a plugin installed from the stable link tracks stable releases; one installed from the canary link tracks main builds.

If the Update button never appears (an older Decky Loader, or no network), update manually: Decky → DeveloperInstall Plugin from URL, and paste the same channel link again. Decky replaces the installed copy in place.

Troubleshooting

Symptom Fix
Stream shows client-not-found Install the client Flatpak in Desktop Mode (see Before you start).
No hosts listed Make sure the host is running and on the same LAN; the Deck needs avahi (shipped on SteamOS). Tap Refresh.
Pairing fails / "not armed" The PIN is shown only after you arm pairing on the host. Arm it, then enter the PIN within the window.
Stream launches but doesn't focus Start it from the panel (not by launching the Flatpak by hand) so Steam/gamescope focuses it.

The plugin source lives in clients/decky.