Skip to content

feat(msix): scaffolding for Microsoft Store / sideload packaging#45

Merged
nelsonduarte merged 1 commit into
mainfrom
feat/msix-microsoft-store
May 8, 2026
Merged

feat(msix): scaffolding for Microsoft Store / sideload packaging#45
nelsonduarte merged 1 commit into
mainfrom
feat/msix-microsoft-store

Conversation

@nelsonduarte
Copy link
Copy Markdown
Owner

Summary

Adds a msix/ directory parallel to the existing flatpak/, snap/, aur/, rpm/, and winget/ packaging folders, with everything needed to produce a PDFApps.msix for either local sideload testing or Microsoft Store submission via Partner Center.

This is scaffolding only — actual Store submission still needs (1) reserving the package name in Microsoft Partner Center to get the Publisher CN, (2) a first PyInstaller-built dist/PDFApps.exe to feed into the build, (3) sideload-tested install on a clean Windows 10/11 VM, (4) Partner Center submission with screenshots + age rating. README.md walks through all four.

Files

  • msix/AppxManifest.xml — package manifest template. __VERSION__ and __PUBLISHER__ are placeholders. Declares Identity (x64, Windows.Desktop ≥ 1809), the 8 supported UI languages, the full visual element set, windows.fileTypeAssociation for .pdf, and runFullTrust (PDFApps shells out to Tesseract / Ghostscript so it can't run in AppContainer; trade-off is no Store featured placement).
  • msix/generate_assets.py — Pillow script producing the seven required PNG sizes from icon_512.png. Idempotent.
  • msix/build.ps1 — staged build: locates makeappx.exe, reads APP_VERSION from app/constants.py, materialises the manifest, copies dist/PDFApps.exe + Assets/* into a stage folder, runs makeappx packdist/PDFApps-<version>.msix. -Publisher param switches between sideload-test cert and Store publisher CN.
  • msix/README.md — sideload workflow (self-signed cert + signtool + Add-AppxPackage) and Store submission flow.
  • msix/Assets/*.png — generated assets, committed so CI doesn't need Pillow.

App code changes

  • app/updater.py now returns True on Windows when the executable lives under WindowsApps\ — canonical MSIX location; Store handles updates.
  • app/window.py _check_for_updates_async short-circuits in MSIX context, mirroring the existing FLATPAK_ID / SNAP guards.

Test plan

  • generate_assets.py produces all 7 PNGs cleanly from icon_512.png.
  • Syntax checks on app/updater.py and app/window.py pass.
  • Run pwsh msix/build.ps1 on a Windows machine with the SDK + a built dist/PDFApps.exe — confirm dist/PDFApps-<version>.msix is produced and makeappx reports success.
  • Sign with self-signed cert, install via Add-AppxPackage, confirm PDFApps starts, file association on .pdf works, auto-update is silently skipped (no nag dialog).
  • Reserve the name on Partner Center, rebuild with the assigned Publisher CN, upload, wait for Microsoft signature + review.

🤖 Generated with Claude Code

Adds a `msix/` directory parallel to the existing `flatpak/`, `snap/`,
`aur/`, `rpm/`, and `winget/` packaging folders, with everything
needed to produce a `PDFApps.msix` for either local sideload testing
or Microsoft Store submission via Partner Center.

Files:
- AppxManifest.xml — package manifest template. __VERSION__ and
  __PUBLISHER__ are placeholders replaced by build.ps1 at pack time.
  Declares: Identity (x64, Windows.Desktop ≥ 1809), DisplayName,
  Resources for the 8 supported UI languages, full visual element
  set (Square44/71/150/310, Wide310x150, SplashScreen #0F172A),
  windows.fileTypeAssociation for .pdf, and the runFullTrust capability
  (PDFApps shells out to Tesseract / Ghostscript and writes user-chosen
  output paths — runFullTrust is required, with the trade-off that the
  app isn't eligible for Store featured placement).
- generate_assets.py — Pillow script that produces the seven required
  PNG sizes from the existing icon_512.png. Idempotent; build.ps1
  invokes it only when an Assets/*.png is missing.
- build.ps1 — staged build: locates makeappx.exe in the Windows SDK,
  reads APP_VERSION from app/constants.py, materialises the manifest,
  copies dist/PDFApps.exe + Assets/ into a stage folder, and runs
  `makeappx pack` to produce dist/PDFApps-<version>.msix. Has a
  -Publisher param for switching between sideload-test cert and Store
  publisher CN.
- README.md — documents the local sideload workflow (self-signed cert
  + signtool + Add-AppxPackage) and the Store submission flow (reserve
  name → build with Microsoft-assigned Publisher CN → upload unsigned
  to Partner Center). Also lists implications: no auto-updater inside
  MSIX, no built-in Tesseract/Gs downloader, file associations come
  from the manifest instead of registry mutations.
- Assets/*.png — generated visual assets (committed so CI doesn't need
  Pillow at MSIX-build time).

App code changes:
- app/updater.py:is_system_install() now returns True on Windows when
  the executable lives under WindowsApps\ — that's the canonical MSIX
  install location and the Store handles updates there.
- app/window.py:_check_for_updates_async also short-circuits in MSIX
  context, mirroring the existing FLATPAK_ID / SNAP guards.

This is the scaffolding only — actual Store submission needs:
1. Reserving the package name in Microsoft Partner Center (assigns
   the Publisher CN to embed in the manifest).
2. A first PyInstaller-built dist/PDFApps.exe to feed into build.ps1.
3. Sideload-tested install on a clean Windows 10/11 VM.
4. Submission via Partner Center with screenshots + age rating.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@nelsonduarte nelsonduarte merged commit 4e51ed3 into main May 8, 2026
3 checks passed
@nelsonduarte nelsonduarte deleted the feat/msix-microsoft-store branch May 8, 2026 09:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant