TASK 48 slice 2: the app packs as a Microsoft Store MSIX
The manifest the Store route needs, and a real package built from it. Packaging/Package.appxmanifest is a full-trust packagedClassicApp: EntryPoint Windows.FullTrustApplication, uap10:TrustLevel=mediumIL, uap10:RuntimeBehavior=packagedClassicApp, the rescap runFullTrust capability, and webcam + microphone DeviceCapabilities. That combination is what lets the packaged app launch the bundled ffmpeg as a child process and write to the user's profile; an appContainer package would virtualise the recordings folder instead. x64 only, en-US only (policy 10.7). Packaging/Assets/ carries the four tiles the packer requires, generated from the app's own Assets/llamacasty-logo.jpg by scripts/make-store-logos.py - listing art and app art cannot drift. scripts/package-msix.sh publishes Release win-x64 self-contained into artifacts/msix-stage (a RID-less publish would copy every RID's ONNX native), stages the manifest as AppxManifest.xml + Assets, and runs the Windows SDK's makeappx. MSIX_PFX/MSIX_PFX_PASSWORD sign a package for a local test install; the Store signs submissions. artifacts/ is gitignored. First real package: artifacts/LlamaCasty.msix, 159 MB, 509 files, 'Package creation succeeded'. Schema traps found by packing (makeappx reports one error at a time): Square310x310Logo and Wide310x150Logo are NOT uap:VisualElements attributes - they live on uap:DefaultTile. Guard: StorePackagingTests.The_package_manifest_declares_full_trust_camera_and_ microphone - identity/architecture, the full-trust application element, the three capabilities, no appContainer VALUE (not the file text: the manifest's own comment says the word), en-US only, and every referenced logo present. Full suite 438/438, 0 warnings. Cold-start smoke test after the Velopack removal: MainWindow loaded, no exceptions.
This commit is contained in:
+11
-9
@@ -305,18 +305,20 @@ steps:
|
||||
### 4.1 Files to Ship
|
||||
|
||||
```
|
||||
LlamaCasty.exe (single-file, self-contained, ~80-120MB)
|
||||
LlamaCasty.msix (full-trust x64 package, self-contained, ~159MB)
|
||||
```
|
||||
|
||||
Single-file means everything is inside the `.exe`. No DLLs, no runtime dependency.
|
||||
Built by **`scripts/package-msix.sh`** (TASK 48 item 2, shipped 2026-10-22): it publishes
|
||||
`Release -r win-x64 --self-contained` into `artifacts/msix-stage`, stages
|
||||
`Packaging/Package.appxmanifest` (as `AppxManifest.xml`) + `Packaging/Assets/`, and packs with
|
||||
the Windows SDK's `makeappx` → `artifacts/LlamaCasty.msix` (gitignored). Unsigned by default —
|
||||
**the Store signs submissions**; set `MSIX_PFX`/`MSIX_PFX_PASSWORD` to sign a package for a
|
||||
local test install. The manifest is a full-trust `packagedClassicApp` at `mediumIL` with
|
||||
`runFullTrust` + webcam + microphone (see `TASKS/task-48-distribution-msix.md` item 2).
|
||||
|
||||
**Why not an installer?**
|
||||
- Single `.exe` is simpler to distribute and update.
|
||||
- No admin rights required (installs to `%LOCALAPPDATA%`).
|
||||
- No installer framework to maintain (WiX, Inno Setup, etc.).
|
||||
- User drops it anywhere and runs it.
|
||||
|
||||
**Caveat:** Self-contained single-file means ~80-120MB due to bundled .NET runtime. For smaller size, use framework-dependent publishing (requires .NET 8 runtime on user machines) — drops to ~5-10MB.
|
||||
A single-file `.exe` is **no longer the artifact**: the Store needs a package, and the package
|
||||
carries the runtime (~80-120MB of it) plus the bundled ffmpeg (~135MB of DLLs). No installer
|
||||
framework and no admin rights — the Store handles install, update and uninstall.
|
||||
|
||||
### 4.2 Distribution via Polar — ⛔ OBSOLETE (2026-09-27)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user