MSIX packaging tool for Tauri apps - Windows Store ready bundles
npm install @choochmeque/tauri-windows-bundle


MSIX packaging tool for Tauri apps - create Windows Store ready bundles with multiarch support.
- MSIX Packaging - Create Store-ready MSIX packages
- Multiarch Support - Build for x64 and arm64 in one bundle
- tauri.conf.json Integration - Automatically reads app name, version, icons, and resources
- Code Signing - Support for PFX certificates and Windows certificate store
- Windows Extensions - Share Target, File Associations, Protocol Handlers, Startup Task, Context Menus, Background Tasks, App Execution Alias, App Services, Toast Activation, Autoplay, Print Task Settings, Thumbnail/Preview Handlers
- Rust with Windows targets
- msixbundle-cli (auto-installed on first build)
- Windows SDK (for signing)
``bash`Install Rust targets for multiarch builds
rustup target add x86_64-pc-windows-msvc
rustup target add aarch64-pc-windows-msvc
`bashOne-time setup (use @latest to ensure newest version)
npx @choochmeque/tauri-windows-bundle@latest init
> Tip: Use
@latest with npx to bypass cached versions: npx @choochmeque/tauri-windows-bundle@latest --versionUsage
$3
`bash
npx @choochmeque/tauri-windows-bundle init
`This creates:
-
src-tauri/gen/windows/bundle.config.json - MSIX-specific configuration
- src-tauri/gen/windows/AppxManifest.xml.template - Manifest template
- src-tauri/gen/windows/Assets/ - Icons (copied from src-tauri/icons/ or placeholders)
- Adds @choochmeque/tauri-windows-bundle as devDependency
- Adds tauri:windows:build script to package.jsonNote: If Tauri icons exist in
src-tauri/icons/, they are automatically copied. The wide tile (310x150) is generated by centering the square icon.$3
Edit
src-tauri/gen/windows/bundle.config.json:`json
{
"publisher": "CN=YourCompany",
"publisherDisplayName": "Your Company Name",
"capabilities": {
"general": ["internetClient"]
},
"signing": {
"pfx": null,
"pfxPassword": null
}
}
`publisher and publisherDisplayName are optional in bundle.config.json. If omitted, publisher falls back to bundle.publisher from tauri.conf.json or tauri.windows.conf.json. If publisherDisplayName is omitted, it defaults to the resolved publisher value.Capabilities are validated at build time. Three types are supported:
`json
{
"capabilities": {
"general": ["internetClient", "internetClientServer", "privateNetworkClientServer"],
"device": ["webcam", "microphone", "location", "bluetooth"],
"restricted": ["broadFileSystemAccess", "allowElevation"]
}
}
`-
general - Standard capabilities ()
- device - Device access ()
- restricted - Requires Store approval ()Note:
runFullTrust is always auto-added (required for Tauri apps).Auto-read from tauri.conf.json / tauri.windows.conf.json:
-
displayName ← productName
- version ← version (auto-converted to 4-part: 1.0.0 → 1.0.0.0)
- description ← bundle.shortDescription
- publisher ← bundle.publisher (fallback when not in bundle.config.json)
- icons ← bundle.icon
- resources ← bundle.resources
- signing ← bundle.windows.certificateThumbprintPlatform-specific config: Values in
tauri.windows.conf.json override tauri.conf.json using JSON Merge Patch (RFC 7396). This lets you define Windows-specific settings like identifier, productName, or bundle.publisher separately.$3
`bash
Build x64 only (default, uses cargo, release mode)
pnpm tauri:windows:buildBuild multiarch bundle (x64 + arm64)
pnpm tauri:windows:build --arch x64,arm64Debug build (release is default)
pnpm tauri:windows:build --debugUse different build runner (pnpm, npm, yarn, bun, etc.)
pnpm tauri:windows:build --runner pnpm
pnpm tauri:windows:build --runner npm
`$3
`
target/msix/
├── MyApp_x64.msix
├── MyApp_arm64.msix # if --arch x64,arm64
└── MyApp.msixbundle # combined bundle
`CLI Reference
`bash
npx @choochmeque/tauri-windows-bundle init [options]
-p, --path Path to Tauri projectnpx @choochmeque/tauri-windows-bundle build [options]
--arch Architectures (comma-separated: x64,arm64) [default: x64]
--debug Build in debug mode (release is default)
--min-windows Minimum Windows version [default: 10.0.17763.0]
--runner Build runner (cargo, pnpm, npm, yarn, bun) [default: cargo]
--verbose Show full build output instead of spinner
npx @choochmeque/tauri-windows-bundle extension list
-p, --path Path to Tauri project
npx @choochmeque/tauri-windows-bundle extension add
Extension type (see below)
-p, --path Path to Tauri project
npx @choochmeque/tauri-windows-bundle extension remove [name]
Extension type (see below)
[name] Extension identifier (required for most types)
-p, --path Path to Tauri project
Extension types:
file-association Associate file types with your app
protocol Register URL protocol handlers (myapp://)
share-target Receive shared content from other apps
startup-task Run app on Windows login
context-menu Add right-click menu items in Explorer
background-task Run tasks when app is not in foreground
app-execution-alias Run app from command line (e.g., myapp)
app-service Allow other apps to call into your app
toast-activation Handle toast notification clicks
autoplay Launch when media/device is inserted
print-task-settings Custom print settings UI
thumbnail-handler Custom file thumbnails in Explorer
preview-handler Custom file previews in Explorer
`Windows Extensions
$3
`bash
npx @choochmeque/tauri-windows-bundle extension add file-association
Prompts for: name, extensions, description
`$3
`bash
npx @choochmeque/tauri-windows-bundle extension add protocol
Prompts for: protocol name, display name
`$3
`bash
Enable
npx @choochmeque/tauri-windows-bundle extension add share-targetDisable
npx @choochmeque/tauri-windows-bundle extension remove share-target
`$3
Run your app automatically when Windows starts.
`bash
Enable
npx @choochmeque/tauri-windows-bundle extension add startup-taskDisable
npx @choochmeque/tauri-windows-bundle extension remove startup-task
`$3
Add right-click menu items in Windows Explorer.
`bash
npx @choochmeque/tauri-windows-bundle extension add context-menu
Prompts for: menu name, file types, display name
`$3
Run tasks when app is not in foreground.
`bash
npx @choochmeque/tauri-windows-bundle extension add background-task
Prompts for: task name, type (timer/systemEvent/pushNotification)
`$3
`bash
npx @choochmeque/tauri-windows-bundle extension list
`$3
Run your app from command line (e.g.,
myapp instead of full path).`bash
npx @choochmeque/tauri-windows-bundle extension add app-execution-alias
Prompts for: alias name
`$3
Allow other apps to call into your app.
`bash
npx @choochmeque/tauri-windows-bundle extension add app-service
Prompts for: service name
`$3
Handle toast notification clicks and actions.
`bash
Enable
npx @choochmeque/tauri-windows-bundle extension add toast-activationDisable
npx @choochmeque/tauri-windows-bundle extension remove toast-activation
`$3
Launch your app when media or devices are inserted.
`bash
npx @choochmeque/tauri-windows-bundle extension add autoplay
Prompts for: verb, action display name, event type (content/device)
`$3
Add custom print settings UI.
`bash
Enable
npx @choochmeque/tauri-windows-bundle extension add print-task-settingsDisable
npx @choochmeque/tauri-windows-bundle extension remove print-task-settings
`$3
Provide custom thumbnails for your file types in Explorer.
`bash
npx @choochmeque/tauri-windows-bundle extension add thumbnail-handler
Prompts for: CLSID, file types
`$3
Provide custom file previews in Explorer.
`bash
npx @choochmeque/tauri-windows-bundle extension add preview-handler
Prompts for: CLSID, file types
`$3
`bash
npx @choochmeque/tauri-windows-bundle extension list
`$3
`bash
npx @choochmeque/tauri-windows-bundle extension remove file-association myfiles
npx @choochmeque/tauri-windows-bundle extension remove protocol myapp
npx @choochmeque/tauri-windows-bundle extension remove context-menu open-with-myapp
npx @choochmeque/tauri-windows-bundle extension remove background-task sync-task
npx @choochmeque/tauri-windows-bundle extension remove app-execution-alias myapp
npx @choochmeque/tauri-windows-bundle extension remove app-service com.myapp.service
npx @choochmeque/tauri-windows-bundle extension remove autoplay open
`Code Signing
$3
`json
{
"signing": {
"pfx": "path/to/certificate.pfx",
"pfxPassword": null
}
}
`Set password via environment variable:
`bash
export MSIX_PFX_PASSWORD=your-password
`$3
Use thumbprint from
tauri.conf.json:
`json
{
"bundle": {
"windows": {
"certificateThumbprint": "ABC123..."
}
}
}
`GitHub Actions
Example workflow for automated MSIX builds.
> Note: Run
npx @choochmeque/tauri-windows-bundle@latest init locally first to generate the required configuration files, then commit them to your repository.`yaml
name: Build Windows MSIXon:
push:
tags:
- 'v*'
workflow_dispatch:
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
- name: Setup Rust
uses: dtolnay/rust-action@stable
with:
targets: x86_64-pc-windows-msvc, aarch64-pc-windows-msvc
- name: Install dependencies
run: pnpm install
- name: Build MSIX bundle
run: pnpm tauri:windows:build --arch x64,arm64 --runner pnpm
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: msix-bundle
path: src-tauri/target/msix/*.msixbundle
`Output will be in
src-tauri/target/msix/YourApp.msixbundle`.