windows-host / package (push) Failing after 22s
windows-host / canary-manifest (push) Skipped
windows-host / winget-source (push) Skipped
ci / docs-site (push) Successful in 1m47s
ci / web (push) Successful in 1m53s
ci / rust-arm64 (push) Successful in 1m58s
docker / builders (--build-arg FEDORA_VERSION=44, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm, -f44) (push) Successful in 11s
docker / builders (ci/android-ci.Dockerfile, punktfunk-android-ci) (push) Successful in 9s
docker / builders (ci/arch-ci.Dockerfile, punktfunk-arch-ci) (push) Successful in 7s
docker / builders (ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 7s
docker / builders (ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 8s
docker / builders (ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 6s
docker / apps (., web/Dockerfile, punktfunk-web) (push) Successful in 58s
apple / swift (push) Successful in 4m45s
deb / build-publish-client-arm64 (push) Successful in 3m28s
docker / apps (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m27s
deb / build-publish (push) Successful in 5m26s
docker / builders-arm64cross (push) Successful in 6s
android / android (push) Successful in 6m22s
docker / deploy-docs (push) Successful in 38s
ci / rust (push) Successful in 7m10s
deb / build-publish-host (push) Successful in 5m27s
arch / build-publish (push) Successful in 8m42s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 16m58s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 17m16s
apple / screenshots (push) Successful in 20m19s
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>
119 lines
6.1 KiB
Markdown
119 lines
6.1 KiB
Markdown
---
|
|
title: The Web Console
|
|
description: 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](/docs/security) 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-host`
|
|
and on Fedora/Bazzite it's `punktfunk`; either way it *recommends* `punktfunk-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:
|
|
|
|
```sh
|
|
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](/docs/arch)), then enable it exactly as above. Take it as a full `-Syu`, never a bare
|
|
`pacman -S`, so you don't end up on a partial upgrade:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```powershell
|
|
notepad "$env:ProgramData\punktfunk\web-password" # set PUNKTFUNK_UI_PASSWORD=<your-password>
|
|
punktfunk-host service restart
|
|
```
|
|
|
|
Forgot it? See [Forgot your Password?](/docs/forgot-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](/docs/clients) 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](/docs/pairing) 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](/docs/updating)), 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](/docs/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](/docs/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](/docs/moonlight) 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](/docs/plugins).
|
|
- **Settings** — the console's language, and **Sign out**.
|