Web console - Pairing/Library/Stats refactored into self-contained subsections that each own their own queries + mutations; a shared slot-based layout (view.tsx) is filled by the live page (containers) and Storybook (pure cards + fixtures) so the layout can't drift. - All paired devices in one list on Pairing with a protocol column (punktfunk/1 + Moonlight), routing each unpair to the right endpoint; the redundant Clients page is removed. - Library: overview grid split from the add/edit form into separate files. - Login screen links out to the docs. Docs - "Console login password" section on every host page (apt/RPM/Bazzite/SteamOS/Windows) plus a new "Forgot your Password?" troubleshooting page, linked from the login screen. - Console served as HTTP/1.1 over TLS (drop the unusable HTTP/3 advertising) across the Bun entry, launchers, systemd units, and packaging. Tooling - Biome now respects .gitignore (stops linting generated code), config migrated to 2.5.1; all lint issues fixed cleanly. Also includes this branch's in-progress host, Apple client, packaging, and CI changes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8.2 KiB
title, description
| title | description |
|---|---|
| Windows Host | Run the Punktfunk streaming host on a Windows PC — a first-class, all-vendor, virtual-display host. |
Set up a Punktfunk host on a Windows 10/11 PC and stream its desktop or games to any Punktfunk or Moonlight client. A signed installer registers a Windows service that streams at the client's exact resolution and refresh via Punktfunk's own virtual display — including HDR10 (10-bit BT.2020 PQ) when your Windows desktop is in HDR mode. The virtual display is created on the fly, so you need no second monitor and no dummy HDMI plug, and capture keeps working even on the secure desktop (UAC prompts, the lock screen).
New to this? Skim Requirements first.
This page is about the Windows host — streaming from a Windows PC. To stream to a Windows PC, see the Windows client.
Requirements
-
Windows 10 or 11, x64. ARM64 is not built (no ARM64 NVIDIA driver, and the virtual-display driver is x64-only).
-
A GPU for hardware encode — the host auto-detects the vendor:
- NVIDIA → NVENC
- AMD → AMF
- Intel → QSV
No discrete GPU? The host falls back to a software H.264 encoder (higher CPU use, lower quality — fine for light desktop use).
-
No gamepad prerequisite. The virtual gamepad drivers are bundled in the installer — there is nothing else to download. (Earlier builds needed ViGEmBus; it is no longer used.)
Install
Download the signed punktfunk-host-setup-<ver>.exe from the
latest release and run it. The installer:
- drops the host into
C:\Program Files\punktfunkand registers + starts thePunktfunkHostservice, - installs the bundled virtual-display driver (
pf-vdisplay) so the host can create per-client displays, - installs the bundled virtual gamepad drivers (DualSense, DualShock 4, Xbox 360),
- registers the bundled HDR Vulkan layer so Vulkan games can enable HDR over the virtual display,
- sets up the web management console (see below).
For an unattended install, append /VERYSILENT. Upgrades and uninstall go through Add/Remove
Programs; your config and pairings are kept across upgrades. Prefer the CLI, or want the full
service/firewall details? See Running as a Service → Windows.
Packaging internals live in
packaging/windows.
Web console & pairing
The installer also sets up the web management console (status, paired devices, the PIN pairing
flow): it bundles the console plus its own runtime and runs it as the PunktfunkWeb task on
http://<this-PC>:3000, starting at boot.
Console login password
During setup you choose the console login password — it's pre-filled with a secure random default
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 that file and restart the console task. In an elevated PowerShell:
notepad "$env:ProgramData\punktfunk\web-password" # set PUNKTFUNK_UI_PASSWORD=<your-password>
schtasks /End /TN PunktfunkWeb; schtasks /Run /TN PunktfunkWeb
Forgot it? This is the recovery path linked from the console login screen — see Forgot your Password?.
The host requires PIN pairing by default (secure on a LAN). To connect the first time, open the console from any browser on the LAN, log in, go to Devices → arm pairing, and enter the PIN on your client. The host's own management API stays loopback-only behind the console.
Configure
The service reads %ProgramData%\punktfunk\host.env. The defaults work out of the box; common knobs:
PUNKTFUNK_ENCODER=auto—autopicks NVENC/AMF/QSV by GPU vendor. Force one withnvenc,amf,qsv, orsw(software).PUNKTFUNK_HOST_CMD— the service runsserve --gamestreamby default (native punktfunk/1 plus the GameStream/Moonlight-compat planes). Set it toservefor a secure native-only host with no GameStream surface (GameStream pairs over plain HTTP and uses weaker legacy encryption — trusted LAN only).
Edit the file, then restart: punktfunk-host service stop / punktfunk-host service start. See the
Configuration reference for every option.
How it works
The host installs a LocalSystem SCM service that runs from Session 0 and launches a worker into
the interactive session (CreateProcessAsUserW). That lets it capture the secure desktop (UAC
prompts, the lock screen) and keep streaming across reboots with nobody logged in — the same model
Sunshine and Apollo use. Service registration, firewall rules, and the supervisor all live in
punktfunk-host service install; the installer just lays the exe down and calls it elevated.
One core, Windows backends
Most of Punktfunk is platform-agnostic. punktfunk-core (protocol, FEC, crypto, session, transport,
the C ABI), the QUIC control plane, the GameStream wire logic, the management API, and the per-frame
pipeline orchestration are all shared with the Linux host. The Windows host is a set of
#[cfg(windows)] backends behind the same traits the Linux host uses:
| Subsystem | Linux backend | Windows backend |
|---|---|---|
| Capture | xdg ScreenCast portal → PipeWire (dmabuf) | IDD direct-push — the pf-vdisplay driver copies finished frames into a host-owned shared GPU texture ring that the host consumes in-process (no Desktop Duplication, no Windows.Graphics.Capture); FP16/10-bit when the desktop is HDR |
| Virtual display | KWin / Mutter / Sway / gamescope | pf-vdisplay signed IDD — create a WxH@Hz monitor per session, capture it, tear it down |
| Encode | NVENC (CUDA) / VAAPI (AMD·Intel) / software | NVENC (NVIDIA) · AMF (AMD) · QSV (Intel) · software H.264; HEVC Main10 / BT.2020 PQ for HDR |
| Input — mouse/keyboard | libei / wlr protocols | SendInput (Win32 VK + absolute mouse) |
| Input — gamepads | uinput Xbox 360 + UHID DualSense/DS4 | UMDF virtual pads — DualSense, DualShock 4, Xbox 360 (XUSB) + rumble |
| Audio capture | PipeWire sink-monitor | WASAPI loopback |
| Virtual mic | PipeWire Audio/Source |
WASAPI virtual mic |
The virtual display is pf-vdisplay, Punktfunk's own all-Rust Indirect Display Driver (IDD). The
host creates a shared GPU texture ring and the driver pushes finished frames straight into it — a real
virtual display at the client's exact WxH@Hz, with no physical monitor and no dummy plug, captured
in-process from Session 0 so the secure desktop streams too. There is no Desktop Duplication or
Windows.Graphics.Capture path: IDD direct-push is the only capture path. The signed driver is bundled
and staged by the installer and is required — without it the host can't create a session (there is
no monitor-capture fallback).
HDR
When your Windows desktop is in HDR mode, the host captures it as 10-bit, encodes HEVC Main10 / BT.2020 PQ, and the client auto-detects HDR from the stream. A small always-on Vulkan layer (bundled and registered by the installer) also lets Vulkan games enable HDR over the virtual display — something the NVIDIA/AMD drivers otherwise refuse on an indirect display. The layer is self-gating: it's a no-op on SDR and on real monitors. HDR is Windows-only (the Linux host is 8-bit, blocked upstream).
Notes & limits
- AMD / Intel encode is newer. The NVENC path is the most exercised; AMF (AMD) and QSV (Intel) are built and tested in CI but less battle-tested on real hardware. Software H.264 is the GPU-less fallback.
- x64-only. No ARM64 build — no ARM64 NVIDIA driver, and the virtual-display driver is x64-only.
- Newer than the Linux host. The Linux host is the most battle-tested path; the Windows host is more recent, with the virtual-mic and AMD/Intel encode backends the youngest pieces.
Trouble? See Troubleshooting and Pairing.