feat(msix): scaffolding for Microsoft Store / sideload packaging#45
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a
msix/directory parallel to the existingflatpak/,snap/,aur/,rpm/, andwinget/packaging folders, with everything needed to produce aPDFApps.msixfor 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.exeto 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
__VERSION__and__PUBLISHER__are placeholders. Declares Identity (x64, Windows.Desktop ≥ 1809), the 8 supported UI languages, the full visual element set,windows.fileTypeAssociationfor.pdf, andrunFullTrust(PDFApps shells out to Tesseract / Ghostscript so it can't run in AppContainer; trade-off is no Store featured placement).icon_512.png. Idempotent.makeappx.exe, readsAPP_VERSIONfromapp/constants.py, materialises the manifest, copiesdist/PDFApps.exe+Assets/*into a stage folder, runsmakeappx pack→dist/PDFApps-<version>.msix.-Publisherparam switches between sideload-test cert and Store publisher CN.msix/Assets/*.png— generated assets, committed so CI doesn't need Pillow.App code changes
WindowsApps\— canonical MSIX location; Store handles updates._check_for_updates_asyncshort-circuits in MSIX context, mirroring the existingFLATPAK_ID/SNAPguards.Test plan
generate_assets.pyproduces all 7 PNGs cleanly fromicon_512.png.app/updater.pyandapp/window.pypass.pwsh msix/build.ps1on a Windows machine with the SDK + a builtdist/PDFApps.exe— confirmdist/PDFApps-<version>.msixis produced andmakeappxreports success.Add-AppxPackage, confirm PDFApps starts, file association on.pdfworks, auto-update is silently skipped (no nag dialog).🤖 Generated with Claude Code