Files
punktfunk/scripts/windows/host.env.example
T
enricobuehlerandClaude Opus 5 020306b5ac fix(packaging,host): a fresh Linux install can start, and the comments stop lying
Fallout from the documentation sweep: verifying doc claims against the code
turned up defects in the code and the shipped templates. Mostly comments that
describe behaviour we no longer have — which is how the docs went wrong in the
first place, since someone reads the comment and writes the page.

The one that mattered: a fresh deb/RPM/Arch install could not start the host at
all. The unit's `EnvironmentFile=` had no `-`, making host.env mandatory, and no
package creates it — all three ship only the templates under /usr/share and the
postinst merely prints the copy command. So `systemctl --user enable --now
punktfunk-host` died on "Failed to load environment files". Every field in
HostConfig::from_env resolves through unwrap_or/filter/None, so absent means all
defaults, exactly like a hand-run `serve`; the Nix module already wrote it as
`-${environmentFile}`. The Deck installer's own generated unit gets the same
prefix for the case where an operator later removes the file.

Shipped templates: PUNKTFUNK_SECURE_DDA is read by nothing (DDA/WGC are gone;
IDD-push is the sole Windows capture path and the secure desktop is
unconditional), so it stops being written into a fresh host.env;
PUNKTFUNK_INPUT_BACKEND offered a `uinput` value that does not exist and omitted
`kwin`, which is what a KDE session actually resolves to; PUNKTFUNK_RENDER_ADAPTER
no longer claims to pick a "Desktop-Duplication" GPU.

Comments corrected rather than deleted, since each explains a real why:
PUNKTFUNK_10BIT is default-on with explicit-off grammar, not an operator opt-in;
GNOME reaches EIS through Mutter's direct RemoteDesktop API, so it needs no portal
approval and is headless-capable; and the host does not run in session 0 — the
service is the session-0 supervisor and the host runs as SYSTEM in the interactive
console session, which is why game_term has to bind the input desktop at all.

packaging/bazzite/update-punktfunk.sh is now installed to /usr/share/punktfunk/,
so the command the docs promised exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 18:46:38 +02:00

65 lines
3.7 KiB
Bash

# punktfunk host configuration (Windows) — read by the `PunktfunkHost` service.
#
# `punktfunk-host service install` writes a default copy of this to
# %ProgramData%\punktfunk\host.env
# Edit that file (not this one) and restart the service to apply:
# punktfunk-host service stop
# punktfunk-host service start
#
# Format: KEY=VALUE per line; '#' starts a comment. The service loads these into its environment
# and passes PUNKTFUNK_* and RUST_LOG through to the host it launches into the active session.
# Hardware encode backend. `auto` (default) detects the GPU vendor: NVIDIA->nvenc (direct SDK),
# AMD->amf, Intel->qsv (both libavcodec). Force one with: nvenc | amf | qsv | sw (software H.264).
# nvenc needs the `--features nvenc` build; amf/qsv need the `--features amf-qsv` build (FFmpeg DLLs
# ship in the installer). The published installer is built with all three.
PUNKTFUNK_ENCODER=auto
# Video source: `virtual` creates a per-client virtual display at the client's exact resolution +
# refresh — the flagship mode. Requires the bundled pf-vdisplay indirect display driver installed.
PUNKTFUNK_VIDEO_SOURCE=virtual
# Virtual-display backend: the all-Rust pf-vdisplay IddCx driver the installer bundles is the only
# backend now (the legacy SudoVDA backend was removed). This is informational; leave it as `pf`.
PUNKTFUNK_VDISPLAY=pf
# Capture is IDD-push: straight from the pf-vdisplay driver's shared ring — zero-copy, and it always
# includes the secure desktop (UAC / lock / login), so the stream survives those transitions. It is
# the SOLE capture path (DDA/WGC were removed; the former PUNKTFUNK_IDD_PUSH and PUNKTFUNK_SECURE_DDA
# knobs are gone — secure-desktop capture has no setting, and a stale line is ignored).
# The name this host shows up under in Moonlight and the Punktfunk clients. Defaults to the
# machine's computer name; set it to give the box a friendly name without renaming Windows.
#PUNKTFUNK_HOST_NAME=Living Room
# Log level (info | debug | trace). Logs land in %ProgramData%\punktfunk\logs\.
RUST_LOG=info
# The host subcommand the service launches. The native punktfunk/1 host is ALWAYS on; `--gamestream`
# adds the GameStream/Moonlight-compat planes, which pair over plain HTTP and reuse legacy GCM
# nonces (security-review #5/#9) — so `serve` alone is the SECURE native-only host.
#
# A Windows install writes this line explicitly from the installer's "Enable GameStream (Moonlight)
# compatibility" task, which is OPT-IN (unchecked) — so a default install lands `serve`. Only if
# this line is absent altogether does the service fall back to its built-in `serve --gamestream`.
# Change it later with `punktfunk-host service install --gamestream=on|off` + a service restart; a
# custom value you write here by hand is never overwritten by a reinstall/upgrade.
#PUNKTFUNK_HOST_CMD=serve --gamestream
# Multi-GPU boxes only: force the render GPU by adapter Description substring. One pick drives the
# whole pipeline — pf-vdisplay's IddCx render adapter, the IDD-push capture ring, and the encoder
# (NVENC/AMF/QSV) that reads it. A manual GPU preference in the web console outranks this; with
# neither set the host auto-picks the adapter with the most dedicated VRAM. Leave unset on
# single-GPU machines.
#PUNKTFUNK_RENDER_ADAPTER=4090
# Keep a per-client virtual display alive briefly after disconnect so a quick reconnect reuses it
# (no display connect/disconnect chime). Default 10000 ms.
#PUNKTFUNK_MONITOR_LINGER_MS=10000
# Run the virtual display at a MULTIPLE of the session's frame rate, without sending a single extra
# frame — halves the worst-case wait for a freshly composited frame at 2. Costs the extra
# composites, so it's opt-in; 1 (default) is off, 4 is the ceiling.
#PUNKTFUNK_VDISPLAY_HZ_MULT=2