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.