Skip to content

Package the app as MSIX for the Microsoft Store - #14

Open
cookingwithsimon wants to merge 5 commits into
mainfrom
claude/project-thread-a6v1az
Open

cookingwithsimon wants to merge 5 commits into
mainfrom
claude/project-thread-a6v1az

Conversation

@cookingwithsimon

Copy link
Copy Markdown
Owner

Requested by Simon · project thread

Stacked on #13 (the in-app updater): merge #13 first and this diff shrinks to the Store changes.

What changes for the user

Before: the only way to get ProDHCPServer was the unsigned exe from GitHub, with SmartScreen's "Windows protected your PC" warning.

After:

  • The app can be published in the Microsoft Store as an MSIX package, which Microsoft signs, so no certificate of our own is needed.
  • A Store copy hides the GitHub update check and Install button. Settings > Updates says the Store installs its updates.
  • The GitHub exe works exactly as before.

Important: Microsoft only lists apps that need administrator rights after approving the allowElevation capability "under strict criteria". docs/microsoft-store.md has the email to send them first, and every step only Simon can do (free account, reserve the name, three repo variables, the submission and listing text).

How

  • packaging/msix/AppxManifest.xml: full-trust desktop app, runFullTrust + allowElevation, Windows 10 1809+. Tile images are app.ico resized.
  • tools/build-msix.ps1: lays out the single-file exe + manifest and runs MakeAppx. -TestSign signs a copy with a throwaway self-signed certificate and exports the .cer.
  • Build and test: builds the test-signed MSIX (placeholder identity), and tools/msix-smoke-test.ps1 installs it on the runner, starts it with settings open, screenshots msix-settings.png and uninstalls. Artifact: ProDHCPServer-msix-test.
  • Release: when the STORE_IDENTITY_NAME, STORE_PUBLISHER and STORE_PUBLISHER_DISPLAY_NAME repository variables are set, builds the unsigned Store package into the run artifact (not the GitHub release page).
  • Windows/AppPackage.cs: IsPackaged via GetCurrentPackageFullName, falling back to "runs from \WindowsApps\" for the elevated restart, which may start without package identity. UpdateViewModel takes it and turns the checker off.
  • PRIVACY.md: the Store requires a privacy policy for desktop apps.

Testing

  • Core tests pass (229), build has no warnings
  • Windows CI run is green (integration tests, publish, smoke tests, MSIX install on the runner)
  • Hardware checklist added: docs/hardware-test-msix.md (admin prompt, firewall rule, adapter restore and crash recovery from an MSIX install)

Generated by Claude Code

Checks GitHub's latest release a few seconds after start (release builds
only, can be turned off), with Check now in Settings. Install and restart
downloads the new exe, checks the published SHA-256, swaps it in, and
starts it; any failure keeps the current version. Offline checks fail
quietly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Z4ft1XCUSiTXomAzGqHci
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Z4ft1XCUSiTXomAzGqHci
The single-file analyzer (IL3000) rejects Assembly.Location in the
published build. Look for ProDHCPServer.dll beside the exe instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Z4ft1XCUSiTXomAzGqHci
- packaging/msix: manifest (runFullTrust + allowElevation, Windows 10 1809+) and tile images from app.ico.
- tools/build-msix.ps1 packs the single-file exe; -TestSign signs a copy with a throwaway certificate.
- Build and test: builds a test-signed MSIX, installs and starts it on the runner, uploads it.
- Release: builds the unsigned Store package when the STORE_* repository variables are set.
- A copy running from an MSIX package hides the GitHub update check; the Store updates it.
- PRIVACY.md for the Store listing, docs/microsoft-store.md (Simon's steps, admin-rights question
  for Microsoft) and docs/hardware-test-msix.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Z4fsxMBt2xZRseV2z4FFe
@cookingwithsimon cookingwithsimon self-assigned this Oct 27, 2026
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.

2 participants