Azure Artifact Signing chains to a publicly trusted root, so neither the host installer nor the client MSIX ships a .cer any more and users import nothing. Four docs pages still walked through importing one.
These instructions don't merely go stale — they still work. The pre-Azure .cer files are still sitting in the package registry, so the URLs the docs name return 200, not 404, and following them plants the retired self-signed CN=unom certificate (valid to 2036) into machine Root and TrustedPublisher for no reason at all.
Verified on glass first
Against the 0.29 canary on the Intel iGPU box, before any of this was written:
host setup.exe and the client MSIX both verify Valid, subject = the Azure profile DN, chain unom → Microsoft ID Verified CS EOC CA 04 → PCA 2021 → Microsoft Identity Verification Root CA 2020, and that root is already in the machine store — so there is genuinely nothing to import
both are timestamped, which is what keeps them valid past the 3.00-day leaf
host installer: clean install, 0.28.1 → 0.29 upgrade, and uninstall all exit 0; the MSIX installs with nothing imported
What changed
install.md, install-client.md, windows-host.md, uninstall.md — the import steps are gone. Each page now explains how to remove a previously imported certificate and names its thumbprint (CD1EFDEE…) so the right one goes.
The driver certificate story is deliberately untouched: it is still self-signed, still planted by the installer into Root + TrustedPublisher, and still documented that way. Conflating the two was the easy mistake here.
Also corrected, all of it found during that testing:
MSIX identity changed along with the publisher, so an install from 0.28.1 or earlier needs an uninstall rather than an upgrade — and because a packaged app's settings live inside the package, the client's identity and paired hosts go with it, so it pairs again once. (Confirmed in pf-client-core/src/trust.rs: %APPDATA%\punktfunk, which MSIX redirects into the package container.)
A silent upgrade reuses the task selection the previous install recorded, not the wizard defaults — UsePreviousTasks defaults to yes and the .iss never sets it. Anything once declined stays declined: on a 0.20 box that meant driver install --gamepad never ran, the gamepad drivers stayed at the old protocol version, and the host logged a driver_proto=2 host_proto=3 mismatch with the virtual pad dead. Now documented, with the /MERGETASKS=… line that forces the full set.
installaudiocable was still listed as a task name — retired in 4a621de6.
Add-AppxPackage from a non-interactive session can fail 0x80070005; the real error is 0x80073D02 PACKAGES_IN_USE, because installing ours pulls a Microsoft.WindowsAppRuntime.2 update while it is in use.
packaging/windows/README.md and clients/windows/packaging/README.md no longer claim a .cer is published, and the client README's canary version formula was still 0.3.<run_number>.0.
windows-client.yml's header comment described only the old self-signed scheme; it now describes all three signing modes, Azure first.
Checks
bun run build (fumadocs/MDX) and bun run lint (tsc --noEmit) both green in docs-site; the edited workflow still parses as YAML.
Deliberately not in this PR
The stale .cer files are still live in the registry. Deleting them from canary/ and latest/ for both punktfunk-host-windows and punktfunk-client-windows would make any old copy of the instructions fail loudly instead of quietly doing the wrong thing. That changes published artifacts, so it wants a separate decision.
The release notes still need the uninstall-not-upgrade line — there is no 0.29 notes file yet.
Azure Artifact Signing chains to a publicly trusted root, so neither the host installer nor the client MSIX ships a `.cer` any more and users import nothing. Four docs pages still walked through importing one.
These instructions don't merely go stale — they still *work*. The pre-Azure `.cer` files are still sitting in the package registry, so the URLs the docs name return **200, not 404**, and following them plants the retired self-signed `CN=unom` certificate (valid to 2036) into machine `Root` and `TrustedPublisher` for no reason at all.
## Verified on glass first
Against the 0.29 canary on the Intel iGPU box, before any of this was written:
- host `setup.exe` and the client MSIX both verify **Valid**, subject = the Azure profile DN, chain `unom → Microsoft ID Verified CS EOC CA 04 → PCA 2021 → Microsoft Identity Verification Root CA 2020`, and that root is already in the machine store — so there is genuinely nothing to import
- **both are timestamped**, which is what keeps them valid past the 3.00-day leaf
- host installer: clean install, `0.28.1 → 0.29` upgrade, and uninstall all exit 0; the MSIX installs with nothing imported
## What changed
`install.md`, `install-client.md`, `windows-host.md`, `uninstall.md` — the import steps are gone. Each page now explains how to *remove* a previously imported certificate and names its thumbprint (`CD1EFDEE…`) so the right one goes.
The **driver** certificate story is deliberately untouched: it is still self-signed, still planted by the installer into `Root` + `TrustedPublisher`, and still documented that way. Conflating the two was the easy mistake here.
Also corrected, all of it found during that testing:
- **MSIX identity changed along with the publisher**, so an install from 0.28.1 or earlier needs an uninstall rather than an upgrade — and because a packaged app's settings live inside the package, the client's identity and paired hosts go with it, so it pairs again once. (Confirmed in `pf-client-core/src/trust.rs`: `%APPDATA%\punktfunk`, which MSIX redirects into the package container.)
- **A silent upgrade reuses the task selection the previous install recorded**, not the wizard defaults — `UsePreviousTasks` defaults to yes and the `.iss` never sets it. Anything once declined stays declined: on a 0.20 box that meant `driver install --gamepad` never ran, the gamepad drivers stayed at the old protocol version, and the host logged a `driver_proto=2 host_proto=3` mismatch with the virtual pad dead. Now documented, with the `/MERGETASKS=…` line that forces the full set.
- `installaudiocable` was still listed as a task name — retired in 4a621de6.
- `Add-AppxPackage` from a non-interactive session can fail `0x80070005`; the real error is `0x80073D02 PACKAGES_IN_USE`, because installing ours pulls a `Microsoft.WindowsAppRuntime.2` update while it is in use.
- `packaging/windows/README.md` and `clients/windows/packaging/README.md` no longer claim a `.cer` is published, and the client README's canary version formula was still `0.3.<run_number>.0`.
- `windows-client.yml`'s header comment described only the old self-signed scheme; it now describes all three signing modes, Azure first.
## Checks
`bun run build` (fumadocs/MDX) and `bun run lint` (`tsc --noEmit`) both green in `docs-site`; the edited workflow still parses as YAML.
## Deliberately not in this PR
- **The stale `.cer` files are still live in the registry.** Deleting them from `canary/` and `latest/` for both `punktfunk-host-windows` and `punktfunk-client-windows` would make any old copy of the instructions fail loudly instead of quietly doing the wrong thing. That changes published artifacts, so it wants a separate decision.
- The release notes still need the uninstall-not-upgrade line — there is no 0.29 notes file yet.
Azure Artifact Signing chains to a public root, so neither the host installer nor the client MSIX ships a .cer any more and users import nothing. install.md, install-client.md and windows-host.md still walked through importing one — and because the pre-Azure files are still sitting in the package registry those URLs return 200 rather than 404, so following the docs didn't fail loudly, it quietly planted a retired self-signed cert in machine Root and TrustedPublisher.
Verified on glass against the 0.29 canary while checking the release: both artifacts verify Valid, timestamped, and publicly trusted, and the MSIX installs with nothing imported.
Also corrected while here: the MSIX publisher change makes a different package identity, so installs from 0.28.1 or earlier need an uninstall rather than an upgrade (and a packaged app's settings go with it, so the client pairs again); a silent UPGRADE reuses the task selection the previous install recorded instead of the wizard defaults, so a once-declined installgamepad silently keeps stale gamepad drivers; installaudiocable stopped being a task name in 4a621de6; and Add-AppxPackage from a non-interactive session can fail 0x80070005 when the Windows App Runtime it depends on is in use.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Azure Artifact Signing chains to a publicly trusted root, so neither the host installer nor the client MSIX ships a
.cerany more and users import nothing. Four docs pages still walked through importing one.These instructions don't merely go stale — they still work. The pre-Azure
.cerfiles are still sitting in the package registry, so the URLs the docs name return 200, not 404, and following them plants the retired self-signedCN=unomcertificate (valid to 2036) into machineRootandTrustedPublisherfor no reason at all.Verified on glass first
Against the 0.29 canary on the Intel iGPU box, before any of this was written:
setup.exeand the client MSIX both verify Valid, subject = the Azure profile DN, chainunom → Microsoft ID Verified CS EOC CA 04 → PCA 2021 → Microsoft Identity Verification Root CA 2020, and that root is already in the machine store — so there is genuinely nothing to import0.28.1 → 0.29upgrade, and uninstall all exit 0; the MSIX installs with nothing importedWhat changed
install.md,install-client.md,windows-host.md,uninstall.md— the import steps are gone. Each page now explains how to remove a previously imported certificate and names its thumbprint (CD1EFDEE…) so the right one goes.The driver certificate story is deliberately untouched: it is still self-signed, still planted by the installer into
Root+TrustedPublisher, and still documented that way. Conflating the two was the easy mistake here.Also corrected, all of it found during that testing:
pf-client-core/src/trust.rs:%APPDATA%\punktfunk, which MSIX redirects into the package container.)UsePreviousTasksdefaults to yes and the.issnever sets it. Anything once declined stays declined: on a 0.20 box that meantdriver install --gamepadnever ran, the gamepad drivers stayed at the old protocol version, and the host logged adriver_proto=2 host_proto=3mismatch with the virtual pad dead. Now documented, with the/MERGETASKS=…line that forces the full set.installaudiocablewas still listed as a task name — retired in4a621de6.Add-AppxPackagefrom a non-interactive session can fail0x80070005; the real error is0x80073D02 PACKAGES_IN_USE, because installing ours pulls aMicrosoft.WindowsAppRuntime.2update while it is in use.packaging/windows/README.mdandclients/windows/packaging/README.mdno longer claim a.ceris published, and the client README's canary version formula was still0.3.<run_number>.0.windows-client.yml's header comment described only the old self-signed scheme; it now describes all three signing modes, Azure first.Checks
bun run build(fumadocs/MDX) andbun run lint(tsc --noEmit) both green indocs-site; the edited workflow still parses as YAML.Deliberately not in this PR
.cerfiles are still live in the registry. Deleting them fromcanary/andlatest/for bothpunktfunk-host-windowsandpunktfunk-client-windowswould make any old copy of the instructions fail loudly instead of quietly doing the wrong thing. That changes published artifacts, so it wants a separate decision.