Skip to content

MSIX Bundle ​

The Windows assets on the Releases page include a .msixbundle package in addition to the setup .exe. MSIX is Microsoft's current application deployment format, intended to replace .msi/.exe installers. A bundle contains builds for x86, x64 and arm64; Windows selects the matching architecture at install time.

Requirements ​

  • Windows 10 (1809+) or Windows Server 2025+
  • Optional: App Installer for double-click installation

Installation ​

Download the latest vfox_<version>_windows.msixbundle from the Releases page and install it by double-click, or from PowerShell:

powershell
Add-AppxPackage -Path .\vfox_<version>_windows.msixbundle

The package registers an app execution alias for vfox.exe, so the vfox command is available on PATH after installation without further configuration.

⚠️ Release bundles are currently unsigned

Windows refuses to install unsigned packages. Re-sign the bundle with your own certificate before installing (see below).

Signing an unsigned bundle ​

Windows must trust the signing certificate on the target machine. Keep the package publisher unchanged across upgrades, and reuse a long-lived certificate to avoid importing a new certificate for each release. Trusting that certificate is a one-time operation; each unsigned bundle you download must still be signed before installation. Include a trusted timestamp so the signed bundle remains installable after the signing certificate expires.

First create a self-signed code-signing certificate whose subject matches the package publisher (CN=VersionFox) and import it into the trusted store. Importing into Cert:\LocalMachine\TrustedPeople requires an elevated (administrator) PowerShell session:

powershell
$cert = New-SelfSignedCertificate -Type Custom -Subject "CN=VersionFox" `
    -KeyUsage DigitalSignature -CertStoreLocation "Cert:\CurrentUser\My" `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
$password = ConvertTo-SecureString -String "pick-a-password" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath vfox.pfx -Password $password | Out-Null
Import-PfxCertificate -FilePath vfox.pfx -CertStoreLocation Cert:\LocalMachine\TrustedPeople -Password $password

Then sign the bundle and install it (signtool comes with the Windows SDK):

powershell
signtool sign /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 /f vfox.pfx /p pick-a-password .\vfox_<version>_windows.msixbundle
Add-AppxPackage -Path .\vfox_<version>_windows.msixbundle

Uninstallation ​

powershell
Get-AppxPackage *vfox* | Remove-AppxPackage

Alternatively open Settings > Apps > Installed apps, select vfox and click Uninstall. Uninstalling removes the execution alias together with the package; the ~/.vfox data directory is kept.

Notes for maintainers ​

Release bundles are built by the compile-msix workflow on every release. Signing is optional; two options:

  • Self-signed certificate (no external account needed). Generate one PFX and keep it stable across releases, then configure the repository secrets MSIX_PFX_BASE64 (Base64-encoded certificate) and MSIX_PFX_PASSWORD; the subject must match the manifest publisher (CN=VersionFox). Releases are signed automatically from then on. Publish the public .cer file alongside the releases so users only need to import it once. Keep the publisher identity stable when renewing the certificate, and distribute the new public certificate if it also needs to be trusted.
  • Publicly trusted certificate. Packages signed by a CA-issued code-signing certificate or through Azure Trusted Signing install without any user-side trust configuration. Obtaining one involves identity verification, and OV/EV certificates mandate hardware-protected private keys, which cannot be placed in CI secrets.

Signed builds use an RFC 3161 timestamp from http://timestamp.digicert.com; set MSIX_TIMESTAMP_URL to use another timestamp service. The build fails if signing or timestamping fails. Both the architecture packages and the outer bundle use the source release version.

All packaging files reside in the packaging/msix/ directory:

FilePurpose
AppxManifest.xmlManifest template; @@VERSION@@, @@ARCHITECTURE@@ and @@PUBLISHER@@ are substituted at build time.
gen-assets.ps1Generates the tile icons from the repository logo (logo.png) via System.Drawing: transparent margins are cropped and the artwork is scaled onto a transparent canvas. PNG is required by AppX deployment (SVG is rejected), so these binaries are generated at build time instead of being committed.
make-msix.ps1Builds vfox from source with Go, renders the manifest for each architecture, packs them with MakeAppx.exe, combines the packages into a .msixbundle and optionally signs it with SignTool.exe.

Local packaging requires Windows, the Windows SDK (provides MakeAppx.exe / SignTool.exe) and Go. The script takes no parameters: it reads the version from internal/version.go, so a locally built bundle always matches the source tree:

powershell
./packaging/msix/make-msix.ps1

Artifacts are written to packaging/msix/Output/; assets/, staging/ and build/ are scratch directories and gitignored. Only stable versions without prerelease or build metadata are supported; they are normalized to four-part versions (1.2.3 → 1.2.3.0).

Released under the Apache 2.0 License.