npx skills add ...
npx skills add microsoft/winappcli --skill winapp-package
Package a Windows app as an MSIX installer for distribution or testing. Use when creating a Windows installer, packaging an Electron/Flutter/.NET/Rust/C++/Tauri app for Windows, building an MSIX, distributing a desktop app, packaging a console app or CLI tool, or adding MSIX packaging to a build script or CI/CD pipeline.
npx skills add microsoft/winappcli --skill winapp-package
Use this skill when:
Before packaging, you need:
bin/Release/, dist/, build/)Package.appxmanifest — from winapp init or winapp manifest generatedevcert.pfx from winapp cert generate for signingPackage.appxmanifest — looks in input folder, then current directory (or uses --manifest)manifest.json, config files) is automatically copied from the manifest directory or input folder if missing from stagingresources.pri — Package Resource Index for UWP-style resource lookup (skip with --skip-pri)makeappx pack — creates the .msix package file--cert provided) — calls signtool with your certificateOutput: a .msix file that can be installed on Windows via double-click or Add-AppxPackage.
dotnet build, cmake --build, npm run make, etc.)winapp package <build-output> --cert ./devcert.pfxwinapp cert install ./devcert.pfx (admin).msix or Add-AppxPackage ./myapp.msixFor sparse packages with AllowExternalContent, you may need a code integrity catalog:
Create an MSIX bundle from multiple per-architecture build outputs:
How it works: When multiple input folders are passed, winapp package:
.msix.msixbundle using makeappx bundleManifest resolution: Each slice needs a manifest. Resolution order:
--manifest <path> uses one manifest for all slices (architecture auto-stamped per folder)Package.appxmanifest if present in the input folderPackage.appxmanifest in the current working directoryThe ProcessorArchitecture is always force-set to the detected architecture per-slice. All other Identity fields must be consistent across slices.
Output: <Name>_<Version>_<arch1>_<arch2>.msixbundle (architectures sorted alphabetically).
Store submission: An unsigned bundle is valid for Store upload — Partner Center signs it with your reserved identity certificate. For sideloading, pass --cert or --generate-cert.
This hashes executables in the specified directories so Windows trusts them when running with sparse package identity.
Use the microsoft/setup-winapp action to install winapp on GitHub-hosted runners:
Tips for CI/CD pipelines:
--quiet (or -q) to suppress progress output--if-exists skip with winapp cert generate to avoid regenerating existing certificates--use-defaults (or --no-prompt) with winapp init to avoid interactive promptspackage command aliases to pack — both work identicallyPackage.appxmanifest Publisher must match the certificate publisher — use winapp cert generate --manifest to ensure they match--skip-pri if your app doesn't use Windows resource loading (e.g., most Electron/Rust/C++ apps without UWP resources)winapp-frameworks skill--executable flag overrides the entry point in the manifest — useful when your exe name differs from what's in Package.appxmanifest--timestamp when signing with winapp signTo grant identity to an app distributed by an existing installer (not as MSIX), build an identity-only sparse package: pass a sparse appxmanifest.xml (one declaring <uap10:AllowExternalContent>true</uap10:AllowExternalContent> under <Properties>) to winapp pack instead of a folder.
The .msix contains only the manifest — binaries and assets are resolved from the external content location at runtime via Add-AppxPackage -ExternalLocation. If you pack a folder whose manifest declares AllowExternalContent, winapp pack warns about any assets/binaries found. See the Sparse Packaging Guide.
winapp-manifest to generate Package.appxmanifestwinapp-signing for certificate generation and managementwinapp-troubleshoot for a command selection flowchart and error solutions| Error | Cause | Solution |
|---|---|---|
| "Package.appxmanifest not found" | No manifest in input folder or current dir | Run winapp init or winapp manifest generate first |
| "Publisher mismatch" | Cert publisher ≠ manifest publisher | Regenerate cert with winapp cert generate --manifest, or edit manifest |
| "Package installation failed" | Cert not trusted or stale package | Run winapp cert install ./devcert.pfx (admin), then Get-AppxPackage <name> | Remove-AppxPackage |
| "makeappx not found" | Build tools not downloaded | Run winapp update or winapp tool makeappx --help to trigger download |
Run winapp <command> --help for current command options, or winapp --cli-schema for the complete machine-readable command schema.
# Sign with existing certificate
winapp package ./bin/Release --cert ./devcert.pfx
# Custom certificate password
winapp package ./bin/Release --cert ./devcert.pfx --cert-password MyP@ssw0rd# Auto-generate cert, sign, and package
winapp package ./bin/Release --generate-cert
# Also install the cert to trust it on this machine (requires admin)
winapp package ./bin/Release --generate-cert --install-cert# Bundle Windows App SDK runtime so users don't need it installed (must have winappsdk reference in the winapp.yaml or *.csproj)
winapp package ./bin/Release --cert ./devcert.pfx --self-contained# Specify output file
winapp package ./dist --output ./releases/myapp-v1.0.msix --cert ./devcert.pfx
# Custom package name
winapp package ./dist --name "MyApp_1.0.0_x64" --cert ./devcert.pfx# Trust the dev certificate first (one-time, requires admin)
winapp cert install ./devcert.pfx
# Install the MSIX
Add-AppxPackage ./myapp.msix
# Uninstall if needed
Get-AppxPackage *myapp* | Remove-AppxPackage# Generate CodeIntegrityExternal.cat for external executables
winapp create-external-catalog "./bin/Release"
# Include subdirectories and specify output path
winapp create-external-catalog "./bin/Release" --recursive --output ./catalog/CodeIntegrityExternal.cat# Create unsigned bundle for Store submission (x64 + arm64)
winapp package ./publish/x64 ./publish/arm64
# Create signed bundle for sideloading
winapp package ./publish/x64 ./publish/arm64 --cert ./devcert.pfx
# Self-contained bundle with Windows App SDK runtime per arch
winapp package ./publish/x64 ./publish/arm64 --self-contained --generate-cert- uses: microsoft/setup-winapp@v1
- name: Package
run: winapp package ./dist --cert ${{ secrets.CERT_PATH }} --cert-password ${{ secrets.CERT_PASSWORD }} --quiet# 1. Generate the sparse manifest for your exe (skips SDK install)
winapp init --exe ./bin/Release/MyApp.exe --sparse --use-defaults
# 2. Build & sign the identity-only .msix (just the manifest)
winapp pack ./sparse/appxmanifest.xml --cert ./devcert.pfx
# 3. Embed identity into the exe, then register in your installer
winapp embed-identity ./bin/Release/MyApp.exe