Three silent console outages in one week (0x1 / 0xFFFFFFFF / 0x41306), each a different proximate cause of the same structural defect: the console's lifecycle was owned by Task Scheduler — one best-effort start per boot/logon/install, no retry on a plain non-zero exit, no watchdog — while the product already shipped a real supervisor. The service now supervises the console as a second child slot: plain session-0 spawn (suspended → own no-breakaway kill-on-close job → resume), started only once the host has written mgmt-token + cert.pem + key.pem (the cert race dies by construction), secrets read from their files at every respawn, bun's stdout finally captured in logs\web.log, doubling backoff 0.5s→60s that never gives up. Session switches never touch it; a service stop takes it down via the job. The PunktfunkWeb task is retired: web setup slims to password + legacy task delete + firewall, the 127-line web-run.cmd batch supervisor is deleted, an [InstallDelete] entry reaps the stale copy, and service install now sets SCM crash-recovery actions (restart 1s/5s/60s) since the console rides on the service process. StopBunRuntimes stays for the scripting runner + the one migrating upgrade. Design: punktfunk-planning design/windows-web-console-lifecycle.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6.1 KiB
title, description
| title | description |
|---|---|
| The Web Console | Enable the Punktfunk browser console, read or change its login password, arm PIN pairing, and what every page in it does. |
The web console is the browser UI for a Punktfunk host — live status, pairing, display policy, the
game library, logs, plugins and host updates. It ships as the punktfunk-web systemd user unit
on Linux and runs under the Punktfunk Host service on Windows, and serves on https://<host-ip>:47992
(HTTPS with the host's own self-signed identity cert — your browser warns once; trust it and
continue). It's the surface you expose on the LAN to administer the host; the host's own management
API (47990) keeps every admin action loopback-only and off-loopback serves only read-only status +
game-library browsing to paired clients.
New here? Read Security & Safe Use first — a streaming host is remote control of the machine, so keep it on a trusted LAN or VPN and require pairing.
Enable the console
-
Linux packages (apt / RPM / Bazzite): on Ubuntu the host package is
punktfunk-hostand on Fedora/Bazzite it'spunktfunk; either way it recommendspunktfunk-web, so your package manager pulls the console in with the host (the Bazzite sysext image already contains it). Enable and start it as your desktop user, then open the URL:systemctl --user enable --now punktfunk-web # then browse to https://<host-ip>:47992 -
Arch / CachyOS (pacman): the console is an optional package here, and pacman never installs optional dependencies — so install it yourself from the same repo the host came from (see Arch Linux), then enable it exactly as above. Take it as a full
-Syu, never a barepacman -S, so you don't end up on a partial upgrade:sudo pacman -Syu punktfunk-web systemctl --user enable --now punktfunk-web -
Windows host: the installer sets up the console and its runtime; the Punktfunk Host service runs it and automatically brings it back if it ever stops. There is nothing to enable — open
https://<this-PC>:47992. -
SteamOS host: the install script builds and starts the console as a user service for you. It prints the URL when it finishes.
Login password
The console is password-protected. Where that password lives and how you change it depends on the host platform.
Linux packages (apt / RPM / Bazzite). On first start punktfunk-web-init generates a random
password and saves it to ~/.config/punktfunk/web-password (as PUNKTFUNK_UI_PASSWORD=…). Read it
back from the init service's journal or straight from the file:
journalctl --user -u punktfunk-web-init | sed -n 's/.*password generated: //p'
sed -n 's/^PUNKTFUNK_UI_PASSWORD=//p' ~/.config/punktfunk/web-password
To set your own, edit that file (PUNKTFUNK_UI_PASSWORD=<your-password>) and restart the console:
systemctl --user restart punktfunk-web.
SteamOS host. Same idea, but the install script writes the generated password to
~/.config/punktfunk/web.env and prints it at the end of the install run:
sed -n 's/^PUNKTFUNK_UI_PASSWORD=//p' ~/.config/punktfunk/web.env
Edit that file and systemctl --user restart punktfunk-web to change it.
Windows host. You choose the password during install — a secure random default is pre-filled and
shown again on the installer's final page. It's stored in %ProgramData%\punktfunk\web-password (as
PUNKTFUNK_UI_PASSWORD=…), readable only by Administrators and SYSTEM. To change it, edit the file
and restart the Punktfunk Host service (which runs the console) in an elevated PowerShell:
notepad "$env:ProgramData\punktfunk\web-password" # set PUNKTFUNK_UI_PASSWORD=<your-password>
punktfunk-host service restart
Forgot it? See Forgot your Password?.
Arm pairing
The host requires PIN pairing by default (secure on a LAN). To connect the first time, open the console, log in, then open Pairing in the sidebar and click Pair a device. The host shows a one-time 4-digit PIN — enter it on your client to pair. If the device already tried to connect it appears under Waiting for approval instead; approving it pairs it immediately, no PIN needed. See Pairing & Trust for the full trust model and how to approve or remove devices later.
What's in it
Nine destinations in the sidebar (a More tab on a phone holds the last five):
- Dashboard — live status: whether video and audio are streaming, the active sessions with their codec, resolution, frame rate and bitrate, which games are running, and how many clients are paired. Buttons here stop a session or ask the encoder for a fresh keyframe.
- Host — this host's identity (hostname, OS, local IP, version, unique id), the codecs it advertises, its ports, the Updates card (see Updating the Host), the GPUs card — Automatic, or prefer one GPU for capture and encode, applied to the next session — and the compositor backends it found.
- Virtual displays — the policy for the display each session gets, and the Streamed screen picker. See Virtual displays.
- Library — the games every client sees: turn a launcher source on or off, add or edit a custom title with its own art and launch command. See Your game library.
- Performance — arm a capture, run a session, stop it, and read the recording back as per-stage latency, throughput and health graphs.
- Logs — the host's recent log stream: follow it live, filter by level, search it, and download or share it for a bug report.
- Pairing — arm a PIN, approve or deny devices waiting for approval, and unpair a device. A second PIN box for Moonlight/GameStream clients appears only when this host runs the GameStream plane.
- Plugins — the plugin store's Browse, Installed and Sources tabs plus the plugin runner switch; an installed plugin with a UI gets its own entry below. See Plugins.
- Settings — the console's language, and Sign out.