English | Deutsch
Local-first Windows GUI for preparing Python apps for Microsoft Store submission: AppxManifest, Store icons, project profiles, screenshots, and MSIX packaging
Note
AI Agent & LLM Integration Notice: High-level repository structure and context boundaries are documented in llms.txt. LLM agents and automated tools can inspect package schemas via PROJECT_PROFILE_FORMAT.md and winstorepackager-project-v1.json.
| I want to... | Start with |
|---|---|
| Package a Python desktop app for the Microsoft Store | WindowsStorePublisher_3.py on Windows |
| Run the SDK-free Unix (Linux/macOS) desktop preflight | unix_preflight.py |
| Share project metadata without local secrets | PROJECT_PROFILE_FORMAT.md |
| Dogfood the WinStorePackager Store profile | winstorepackager-project-v1.json |
| Check privacy and local-data boundaries | PRIVACY_POLICY.md and Repository Hygiene |
WinStorePackager is built for solo developers and small teams that need a practical Python-to-Microsoft-Store workflow without setting up Visual Studio projects for every app. It focuses on the repetitive pieces: Store manifest fields, required icon sizes, screenshot collection, profile exchange, and Windows SDK packaging commands.
| Feature | Description |
|---|---|
| Manifest Generator | Automatically creates AppxManifest.xml from form inputs |
| Icon Generator | All required Store sizes: 44×44, 50×50, 150×150, 310×310, 310×150 (Wide) |
| Keyring Integration | Secure storage of certificate passwords (no plaintext) |
| Screenshot Assistant | Captures app screenshots directly via pygetwindow |
| 11 Store Categories | Predefined (Games, Productivity, Developer Tools, ...) |
| Age Ratings | 3+ to 18+ ratings |
| MSIX Build | Invokes makeappx.exe and signtool.exe from the Windows SDK |
| Settings Persistence | Configuration is saved in JSON and loaded on next launch |
| Auto-Install | Missing dependencies are automatically installed |
graph TD
A["Python App Source"] --> B["WinStorePackager GUI / CLI"]
B --> C["AppxManifest.xml Generator"]
B --> D["Store Icon Generator (44x44 .. 310x310)"]
B --> E["Project Profile JSON Export"]
C --> F["Windows SDK makeappx.exe"]
D --> F
F --> G["MSIX Package"]
G --> H["signtool.exe (Keyring Auth)"]
H --> I["Microsoft Store Partner Center"]
J["Unix / Preflight Mode"] --> K["unix_preflight.py"]
K --> L["Metadata & Profile Validation"]
The current UI combines manifest fields, icon generation, screenshot capture, and MSIX build preparation in one desktop workflow.
Rebuild the curated Microsoft Store screenshot set with:
python generate_store_screenshots.pyThe generator writes four 1920x1080 PNGs to releases/windowsstore/screenshots/ and uses only neutral demo metadata. It does not expose Partner Center publisher DNs, certificate paths, passwords, Windows SDK paths, or private project paths.
WinStorePackager now ships with a shared project profile format: PROJECT_PROFILE_FORMAT.md. The desktop app can import and export winstorepackager-project-v1.json so that Store metadata can be prepared outside Windows without exposing local Publisher IDs, SDK paths, certificate paths, or passwords.
This repository also includes its own dogfooding profile, winstorepackager-project-v1.json. Load it in the desktop app to package WinStorePackager with WinStorePackager, or validate it without the Windows SDK:
python unix_preflight.py --project-root . --profile-path winstorepackager-project-v1.jsonThe profile intentionally keeps Partner Center Publisher IDs, certificate paths, SDK paths, and passwords out of Git. Add those values only in local settings before building or signing an MSIX.
Project-profile exchange is handled by the desktop app and the documented winstorepackager-project-v1.json format. WinStorePackager is not a web app, cloud service, Android app, or iOS product line.
Useful search phrases for this repository:
WinStorePackager Python Microsoft Store MSIXfile-bricks WinStorePackagerPython AppxManifest generatorlocal-first MSIX packaging toolMicrosoft Store packaging GUI for Python apps
The project is not the Microsoft MSIX Packaging Tool and does not replace Partner Center submission. It is a local helper that prepares files and metadata before you run or submit the final package.
- Python 3.10+
- Windows 10/11
- Windows SDK (for
makeappx.exeandsigntool.exe) - Microsoft Store developer account (for submission)
pip install -r requirements.txtgit clone https://github.com/file-bricks/WinStorePackager.git
cd WinStorePackager
pip install -r requirements.txt
python WindowsStorePublisher_3.pyOr on Windows, double-click START.bat.
For Linux/macOS workstations or CI runs without the Windows SDK, the repository now includes a metadata-only preflight:
python unix_preflight.py --project-root .Optional project profile validation:
python unix_preflight.py --project-root . --profile-path ./winstorepackager-project-v1.jsonThe Unix preflight intentionally stays below the Windows packaging layer. It checks project structure, store_package.json, README, privacy policy, Store listing, screenshot/icon artifacts, and an optional exported project profile, but it does not build MSIX packages, sign code, or run WACK. (For backward compatibility, linux_preflight.py is kept as a wrapper).
Use build_exe.bat to create a local dist\WinStorePackager.exe from the tracked WinStorePackager.spec. The build work directory is outside OneDrive at C:\_Local_DEV\codex_build\winstorepackager, while generated executables and release bundles remain ignored by Git.
START.bat prefers dist\WinStorePackager.exe when it exists and falls back to python WindowsStorePublisher_3.py.
- Launch the tool —
python WindowsStorePublisher_3.pyorSTART.bat - Enter app data — Name, Publisher ID, version, path to
.pyfile - Select icon — the tool automatically generates all Store sizes
- Generate manifest —
AppxManifest.xmlis created - Build MSIX — Tool invokes
makeappx.exeand creates the package - Sign — Select certificate, enter password securely via Keyring
On first launch, machine-specific settings are stored outside the source checkout:
- Windows:
%LOCALAPPDATA%\WinStorePackager\settings_store_packager.json - macOS source runs:
~/Library/Application Support/WinStorePackager/settings_store_packager.json - Linux source runs:
${XDG_CONFIG_HOME:-~/.config}/winstorepackager/settings_store_packager.json
Runtime logs are also host-local (%LOCALAPPDATA%\WinStorePackager\logs on Windows).
WINSTOREPACKAGER_DATA_DIR and WINSTOREPACKAGER_LOG_DIR provide explicit overrides for
controlled test or portable environments. A valid legacy settings_store_packager.json
beside the source file is migrated atomically on first launch and removed only after a
successful readback. Existing runtime settings are never overwritten. Certificate passwords
remain in the operating-system Keyring and are never written to the JSON file.
The settings file may contain local Publisher IDs, certificate paths, Windows SDK paths, and other machine-specific values. Template:
{
"app_name": "MyApp",
"publisher": "CN=YOUR-PUBLISHER-ID",
"publisher_display": "Your Name",
"version": "1.0.0.0",
"makeappx_path": "C:/Program Files (x86)/Windows Kits/10/App Certification Kit/makeappx.exe",
"signtool_path": "C:/Program Files (x86)/Windows Kits/10/App Certification Kit/signtool.exe"
}You can find your Publisher ID in the Microsoft Partner Center.
WinStorePackager works on local project files only. Generated MSIX packages, EXE builds, temporary staging folders, certificates, and release bundles are intentionally ignored by Git. Machine-specific settings and runtime logs live outside the checkout. Release artifacts should be distributed through GitHub Releases, Microsoft Store submissions, or another release channel instead of source commits.
If dependencies are missing, the launcher can install Python packages from PyPI via pip. After dependencies are installed, the packaging workflow itself runs locally and uses the Windows SDK tools configured on your machine.
The repository intentionally tracks only source code, documentation, workflow files, and static sample assets. The curated demo Store screenshots under releases/windowsstore/screenshots/ are kept as submission references. Local Partner Center data, Publisher IDs, certificates, generated manifests, MSIX/AppX packages, WACK logs, ad-hoc captures, and release bundles stay outside Git. The legacy settings ignore rule remains as defense in depth for older checkouts.
Last hygiene and visibility check: 2026-08-01. The repository documentation describes only the maintained desktop and SDK-free preflight workflows; local planning files, Partner Center settings, certificates, SDK paths, generated packages, and release artifacts remain ignored.
| Feature | WinStorePackager | MSIX Packaging Tool | Visual Studio | Advanced Installer |
|---|---|---|---|---|
| GUI | ✅ | ✅ | ✅ | |
| Python Focus | ✅ | ❌ | ❌ | ❌ |
| Auto-Icons | ✅ | ❌ | ✅ | |
| Manifest Template | ✅ | ❌ | ✅ | ✅ |
| Free | ✅ | ✅ | ❌ | |
| Screenshot Assistant | ✅ | ❌ | ❌ | ❌ |
| Keyring Security | ✅ | ❌ | ❌ | ❌ |
Dieses Projekt steht unter der MIT License.
A GUI tool for preparing Python applications for the Microsoft Store (MSIX packaging).
- MSIX package creation
- App manifest generation
- Icon and asset management
- Store submission preparation
- Shared project profile exchange via
winstorepackager-project-v1.json - Installable local project-profile helper with offline shell, manifest preview, and icon checks
git clone https://github.com/file-bricks/WinStorePackager.git
cd WinStorePackager
pip install -r requirements.txt
python "WindowsStorePublisher_3.py"See LICENSE for details.
Dieses Projekt ist eine unentgeltliche Open-Source-Schenkung im Sinne der §§ 516 ff. BGB. Die Haftung des Urhebers ist gemäß § 521 BGB auf Vorsatz und grobe Fahrlässigkeit beschränkt. Ergänzend gilt der Haftungsausschluss der MIT License.
Nutzung auf eigenes Risiko. Keine Wartungszusage, keine Verfügbarkeitsgarantie, keine Gewähr für Fehlerfreiheit oder Eignung für einen bestimmten Zweck.
This project is an unpaid open-source donation. Liability is limited to intent and gross negligence (§ 521 German Civil Code). Use at your own risk. No warranty, no maintenance guarantee, no fitness-for-purpose assumed.
