MSIX & Microsoft Store

Covers the standalone NovaSQL Query Analyser (src/QueryAnalysis.App). The monitor ships as an MSI and is untouched by any of this — see installer.md for that.

Build the package

pwsh installer/msix/build-msix.ps1 -Version 1.0.0.0

Produces installer/SqlQueryAnalyzer-<Version>.msix (~67 MB) and leaves the uncompressed payload in installer/msix/publish/.

No Windows SDK installation is required. makeappx.exe and signtool.exe are pulled from the Microsoft.Windows.SDK.BuildTools NuGet package into installer/msix/.tools/ on first run. That keeps the build working on a plain dev box and in CI without an admin install.

The package is self-contained: a Store package must not depend on a machine-wide .NET runtime being present. That is where the size comes from — about 156 MB of payload, 67 MB compressed.

Version numbers

MSIX versions are four parts and the last part must be 0 — the Store rejects anything else. The script checks this up front rather than letting you discover it at upload time.

Assets

All tiles in installer/msix/Assets/, the app icon src/QueryAnalysis.App/Assets/QueryAnalyzer.ico (exe, taskbar, window title bar) and the three Store logos in docs/store/logos/ are generated by installer/msix/make-assets.ps1 from one master image, src/Logo/NovaSQL_Query_Analyser.png. A new logo means replacing that file and re-running the script — never editing a tile by hand. The outputs are committed, so building or packaging needs neither the script nor the master.

powershell -File installer/msix/make-assets.ps1   # regenerate after changing the logo

What the script does with the master, so a replacement keeps working:

  • The white background becomes transparent, but the mark and the lettering are processed separately and the full logo is stitched from both. The manifest declares a transparent tile background, so a white square would sit on a dark taskbar — but a plain fade-out also hollows the white highlights inside the mark. So the mark's pass protects anything the background cannot reach through a gap wider than ~24 px, which keeps the separator rings, the cylinder top and the star core opaque. The lettering needs the opposite: every counter is an enclosed hole that a fill can never reach, so protecting them leaves the letters outlined and filled with white — legible on white, a mess on dark. Its pass therefore protects nothing. Pass -MaskPath mask.png to see what a protected pass would fade out.
  • Small sizes use the mark only (44, 50, 71, 150 and the .ico); the lettering appears on the 310×310, wide tile and splash screen. The mark is found as the content above the first empty horizontal band, so a new master needs the same layout: mark on top, text below, a gap in between.
  • The "QUERY ANALYSER" lettering is dark grey and hard to read on a dark background. Only the large tiles carry it, which Windows 11 barely shows.

The set is complete enough that packaging and certification will not fail on a missing size.

Testing locally

For a Store upload the package must stay unsigned — Microsoft signs it. To install it on your own machine you need a signature and a trusted certificate:

pwsh installer/msix/build-msix.ps1 -Version 1.0.0.0 -Sign

The script creates a self-signed certificate, signs the package and prints the two commands needed to trust and install it. Trusting the certificate writes to LocalMachine\TrustedPeople and therefore needs an elevated shell.

A faster loop that needs no signing at all — register the published folder directly (requires Developer Mode):

Add-AppxPackage -Register installer\msix\publish\AppxManifest.xml
Get-AppxPackage 54076piwonka.NovaSQLQueryAnalyser
# launch it:
Start-Process "shell:AppsFolder\$((Get-AppxPackage 54076piwonka.NovaSQLQueryAnalyser).PackageFamilyName)!QueryAnalyzer"
# clean up:
Remove-AppxPackage (Get-AppxPackage 54076piwonka.NovaSQLQueryAnalyser).PackageFullName

This is what was used to validate the manifest and confirm the app starts packaged.

Where the data goes — verified, not assumed

A full-trust MSIX app writes to the real %APPDATA%\Roaming\QueryAnalyzer\, not into …\Packages\<PackageFamilyName>\LocalCache\Roaming\. AppData redirection is old Desktop App Converter behaviour and does not apply to a Windows.FullTrustApplication package.

This was measured, because the intuition points the other way: delete the database, launch the packaged build, and the new file appears back in the real Roaming folder.

Two consequences, both worth knowing:

  • The packaged build and a plain build share one database. A user can move between them without losing connection profiles or history.
  • Uninstalling does not remove that data. Good for the user, but it means the app leaves a folder behind.

The app reports its own storage location and installation kind under Datenspeicher… in the status bar, so this is discoverable without reading this document.

Store submission checklist

Registration is free for both individual and company accounts as of 2026 (previously $19 / $99). Selling through Microsoft's commerce platform costs a commission; using your own commerce for a non-gaming app lets you keep 100%. Verify the current rates in Partner Center before pricing — published figures vary by discovery path.

Before uploading:

  1. Identity is the one Partner Center assigned — reserved name NovaSQL Query Analyser, Store ID 9N7C6C5BB8RK, listing https://apps.microsoft.com/detail/9N7C6C5BB8RK. These three must match it character for character or the upload is rejected:

    Where Value
    Package/Identity/Name (manifest template) 54076piwonka.NovaSQLQueryAnalyser
    Package/Identity/Publisher (-Publisher) CN=83C65A29-5AA0-4851-A520-6663B04A6E98
    Package/Properties/PublisherDisplayName (-PublisherName) piwonka

    The publisher pair is the script's default, so a plain build is already correct; the GUID is an identity, not a secret. The package family name is 54076piwonka.NovaSQLQueryAnalyser_0fsdk9qvhk84j, which is what Get-AppxPackage reports and what the launch command below is built from.

    The executable, the MSIX file name and the %APPDATA%\QueryAnalyzer\ data folder keep the old spelling on purpose: renaming the data folder would strand every existing profile database.

  2. Upload the unsigned package. Do not submit a -Sign build.

  3. Privacy policy URL is required. The app connects to database servers the user names and stores their connection strings locally. That needs stating.

  4. Age rating questionnaire.

  5. Add screenshots. Five per listing language under docs/store/screenshots/{de,en}/, captured with docs/store/capture-window.ps1. Upload them in file-name order — the score card first is what makes the rest legible. See docs/store/README.md.

Capabilities

The manifest declares only internetClient and runFullTrust. The app opens outbound TDS connections to instances the user names; it does not listen, and it does not touch user libraries. Keeping the list this short keeps certification straightforward — every additional capability invites review questions.

Known limits

  • x64 only. No ARM64 package is built. Adding one means a second publish and a bundle (.msixbundle); nothing in the code prevents it.
  • The analyzer has no license enforcement of its own, unlike the monitor. For Store distribution that is fine — Microsoft handles entitlement. For any other channel it is not.
  • The MSI channel is still the primary one for business customers. Enterprise environments commonly block the Store by policy, and those are exactly the users this tool targets. Treat the Store as additional reach for individual DBAs and consultants rather than as a replacement.