Files
punktfunk/scripts/windows
enricobuehlerandClaude Fable 5 47eb8c9f6f
windows-host / package (push) Failing after 26s
windows-host / canary-manifest (push) Skipped
windows-host / winget-source (push) Skipped
ci / web (push) Successful in 1m7s
apple / swift (push) Successful in 1m28s
ci / rust-arm64 (push) Successful in 1m57s
ci / docs-site (push) Successful in 2m31s
docker / builders (--build-arg FEDORA_VERSION=44, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm, -f44) (push) Successful in 6s
docker / builders (ci/android-ci.Dockerfile, punktfunk-android-ci) (push) Successful in 7s
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 6s
docker / builders (ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 7s
docker / builders (ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 6s
deb / build-publish-client-arm64 (push) Successful in 2m22s
docker / apps (., web/Dockerfile, punktfunk-web) (push) Successful in 48s
deb / build-publish-host (push) Successful in 4m38s
docker / apps (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 1m26s
deb / build-publish (push) Successful in 5m45s
docker / builders-arm64cross (push) Successful in 13s
docker / deploy-docs (push) Successful in 31s
android / android (push) Successful in 7m33s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 6m55s
arch / build-publish (push) Successful in 8m58s
ci / rust (push) Successful in 7m17s
flatpak / build-publish (push) Successful in 7m11s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 4m2s
windows / build (aarch64-pc-windows-msvc) (push) Successful in 4m39s
release / apple (push) Successful in 16m28s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 17m39s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 17m59s
windows / build (x86_64-pc-windows-msvc) (push) Successful in 8m53s
apple / screenshots (push) Canceled after 16m31s
fix(windows): a web-console deploy that half-succeeded stops reporting success
Found by investigating a console that had been serving errors on .173 for
hours while every health check said HTTP 200.

Nitro's `entry.mjs` imports its sibling chunks by CONTENT HASH, so a
`.output` that mixes two builds is not degraded — it is dead: bun answers
every page with a `ResolveMessage` JSON body ("Cannot find module
../_/router-<hash>.mjs") under a 200 status. Two defects here let exactly
that ship and then hid it:

* The pre-copy `Remove-Item` used `-ErrorAction SilentlyContinue`, so a
  removal blocked by a still-running bun was swallowed and `Copy-Item`
  merged the new build into the old tree. (Reproduced live: an older
  task-based copy of this script, run against the now supervised-child
  host, tried `schtasks /end` for a task that no longer exists, never
  stopped the service, and so could never unlock the files.) The removal
  is now verified and refuses to copy over a tree it could not clear.
* The success probe read only the status code, so it reported a healthy
  console for a server that serves nothing but an error. It now checks
  that `/login` actually returns HTML, and says so loudly when the body
  is a module-resolution error instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 22:40:26 +02:00
..

Windows host build/deploy scripts

Helper scripts for the Windows host box (the RTX .173 lab box, repo at C:\Users\Public\punktfunk-native). Run them from the repo root in an elevated PowerShell.

One-time: persist the build environment

powershell -ExecutionPolicy Bypass -File scripts\windows\setup-build-env.ps1

Persists (Machine scope) the vars the host build needs (NVENC itself needs none — its entry points are runtime-loaded from the driver's nvEncodeAPI64.dll):

var value why
LIBCLANG_PATH C:\Program Files\LLVM\bin bindgen (libclang.dll)
CMAKE_POLICY_VERSION_MINIMUM 3.5 audiopus_sys / cmake crates

FFMPEG_DIR is not set — the --features nvenc build the RTX box uses does not link libavcodec (that is only the amf-qsv feature). The VS C++ toolchain is loaded per-build via vcvars64.bat (auto-discovered with vswhere).

Rebuild + redeploy the host service

powershell -ExecutionPolicy Bypass -File scripts\windows\deploy-host.ps1

Stops PunktfunkHost, backs up the current binary (punktfunk-host.exe.bak), builds --release -p punktfunk-host --features nvenc from the current source, then restarts the service on the new binary — with automatic rollback if the build fails or the new binary won't start. The service is down only for the build duration.

Web management console

On an installed host (the setup.exe) the console is set up automatically — no manual steps. The installer bundles the built (self-contained, no-node_modules) .output server + a portable bun; the PunktfunkHost service supervises the console as its own child (bun {app}\web\.output\server\index.mjs on :47992, session 0, restarted on any exit, stdout in %ProgramData%\punktfunk\logs\web.log), starting it as soon as the host has written its mgmt token

  • identity cert. punktfunk-host.exe web setup provisions the rest: it opens inbound TCP 47992 and writes the login password to %ProgramData%\punktfunk\web-password (ACL'd to Administrators + SYSTEM). The mgmt bearer token it proxies with is the host's own %ProgramData%\punktfunk\mgmt-token. Browse https://<host-ip>:47992 and log in with the password the installer shows on its final page. To change it, edit web-password and restart the service (punktfunk-host service restart) — or just kill the console's bun.exe; the supervisor respawns it with the new value.

Rebuild + restart the console (dev box)

powershell -ExecutionPolicy Bypass -File scripts\windows\build-web.ps1

bun install && bun run build (Nitro noExternals -> a self-contained .output, no node_modules/.npmrc), then swaps the fresh .output into {app}\web around a service stop/start (the service's kill-on-close job is what unlocks the console's bun) and checks :47992/login. Use this to iterate on the console against an installed host.

Plugin/script runner

powershell -ExecutionPolicy Bypass -File scripts\windows\build-scripting.ps1
powershell -ExecutionPolicy Bypass -File scripts\windows\build-scripting.ps1 -EnableTask

bun install && bun build src/runner-cli.ts --target=bun in sdk\ -> one self-contained runner-cli.js (effect + the SDK inlined; the operator's plugin import() stays a runtime import, gated on the same attempt= check CI and the .deb builder use), then lays it out as <exe-dir>\scripting\runner-cli.js + scripting-run.cmd with the bun runtime at <exe-dir>\bun\bun.exe.

That layout is load-bearing. punktfunk-host plugins add/remove/list forwards package ops to the runner, and on Windows it resolves the runner relative to the running exe (crates\punktfunk-host\src\plugins.rs). Since deploy-host.ps1 runs the service out of target\release, a bundle sitting only in the installed {app} leaves the freshly built exe reporting "the plugin runner isn't installed". The script deploys next to every host exe it finds - the built one and whatever the PunktfunkHost service actually runs.

The PunktfunkScripting task is registered disabled (opt-in) by the installer, so the script stages the bundle but does not silently enable it. Pass -EnableTask on a box you are validating plugins on (equivalent to punktfunk-host plugins enable).

Rebuild + redeploy everything

powershell -ExecutionPolicy Bypass -File scripts\windows\deploy-all.ps1
powershell -ExecutionPolicy Bypass -File scripts\windows\deploy-all.ps1 -EnableScriptingTask

Thin wrapper: runs deploy-host.ps1, build-web.ps1 then build-scripting.ps1 in sequence — the web console and plugin runner are always included, so the host binary and the runner bundle never drift apart. If the host build/start fails, deploy-host.ps1 rolls itself back and throws, which stops this script before the later steps run.

Typical flow after pulling new code

git pull
powershell -ExecutionPolicy Bypass -File scripts\windows\deploy-all.ps1