Scope
This is printable page copy and rule documentation for choosing a Windows 11 x64 route for a Python GUI app. It is not selector code. It documents the locally reproduced route and labels every other route as external or not reproduced.
Questions
- Framework: Is the app pywebview on the PySide6 Qt backend, a direct native PySide6 app, or another framework?
- Frozen form: Is the current build
--onedir,--onefile, both, or not yet frozen? - Dependency licensing: Do dependency licenses require end users to replace or relink bundled libraries? If yes, select the mapped
--onedirroute for that requirement. The canonical SXT policy permits either layout for MIT/open-source tools, but the actual dependency obligations and release behavior still require review and testing. - Desired delivery: Is the goal a website download, Microsoft Store, both, or undecided? A WinGet goal is captured separately because it is an overlay.
- Installer state: Is the current distributable none, a portable archive, EXE, MSI, or MSIX? If it is an installer, does it have a stable identity?
- Update owner: Will updates be owned by the Store, the application, the installer, manual download, or is that undecided? In the reproduced app estate, the app only notifies about GitHub releases. It does not self-update.
- Install needs: Do you need a Start menu entry, optional desktop shortcut, optional launch after setup, Add or Remove Programs uninstall, per-user installation, or an all-users option?
- Signing position and geography: Will artifacts be unsigned, Authenticode-signed, or submitted through a Store route? Where is the developer or organization eligible to use the chosen signing service or certificate?
- Stable versioned HTTPS hosting: Can you host each installer at a stable, versioned HTTPS URL for as long as an external catalog or Store installer route needs it?
- WinGet goal: Is WinGet only a discovery and command-line installation overlay for a released installer, or are you expecting it to replace the installer, hosting, signing, update, commerce, or external review responsibilities?
Deterministic result structure
Viable routes in the mapped evidence
| Route | Result | Cause |
|---|---|---|
pywebview plus PySide6 Qt backend, PyInstaller --onedir, portable ZIP |
Viable | This exact build shape is mapped for PolyForm Noncommercial/Internal Use distributions where bundled LGPL Qt and other LGPL libraries must remain replaceable by end users. |
The same --onedir output with the shared Inno Setup installer |
Viable | It is the mapped installer input when the estate’s LGPL replaceability requirement applies; the workflow builds, hashes, attests, and releases it. |
| WinGet discovery for Simple UNA Log Viewer | Viable for that application’s recorded lifecycle only | The initial package and later update were accepted in the WinGet repository. |
Eliminated routes for this draft set
| Route | Result | Cause |
|---|---|---|
PyInstaller --onefile |
Eliminated from the mapped PolyForm route | It was not chosen or reproduced where the estate’s LGPL replaceability requirement applies. |
| Standalone native PySide6 application | Eliminated from the reproduced path | The estate uses PySide6 under pywebview, not as a separate native application release. |
| Authenticode-signed artifact | Eliminated from the reproduced path | The released estate artifacts are unsigned. |
| Store or MSIX | Deferred and not reproduced | Acceptance, package preparation, account operation, and external review are not mapped here. |
Viable but not reproduced here
Store or MSIX distribution, Authenticode signing, direct native PySide6 packaging, and --onefile may be viable but are not reproduced here. The canonical SXT policy permits either PyInstaller layout for MIT/open-source tools. Other license and distribution models require their own analysis and testing.
WinGet is an overlay
WinGet can add discovery and command-line installation for an already released installer. It does not create the installer, host its asset, sign it, update the application, handle commerce, or decide repository acceptance.
Artifact chain
source at a release tag -> --onedir folder when LGPL replaceability is required -> Windows build runner -> complete folder -> portable ZIP and Inno Setup installer -> SHA-256 file and GitHub build provenance -> GitHub Release -> optional WinGet manifest pointing to a released installer
Ownership table
| Responsibility | Owner in the reproduced route | Boundary |
|---|---|---|
| Signing | No Authenticode signer in the local artifact estate | A future signing service or certificate owner must operate and validate this separately. |
| Hosting | GitHub Release for ZIP, installer, checksum, and attestation record | Stable versioned HTTPS installer hosting for external Store routes is not reproduced. |
| Update notification | Application release-check feature | It only notifies about GitHub releases. |
| Replacing installed files | User running a newer installer | No self-update mechanism is reproduced. |
| Commerce | No owner in this draft set | No commerce route is included. |
| External review | Microsoft Store or WinGet maintainers, when submitted | Their outcomes remain external. |
Production evidence and mapped evidence
The Build-Tools workflow builds from a tag, produces ZIP and installer artifacts, writes SHA-256 files, and creates provenance attestations. Simple UNA Log Viewer’s build script supplies the --onedir, PySide6, qtpy, and truststore build pattern. Its initial WinGet submission and update are limited to that application’s accepted lifecycle.
Unknowns and prerequisites
- A signing route needs an eligible signer, certificate or service choice, geography review, signing operation, and artifact validation.
- An MSI or EXE Store route needs the Store’s current requirements, a signed installer, stable versioned HTTPS hosting, account operation, and external review.
- MSIX needs package preparation, Store or direct-distribution prerequisites, and separate testing.
- A WinGet submission needs a released installer URL, matching version and hash data, repository validation, and external review.
- A
--onefileor direct native PySide6 route needs its own application and artifact testing.
Printable text summary
For the estate’s PolyForm Noncommercial/Internal Use builds, the mapped route is PyInstaller --onedir, a portable ZIP, and the shared Inno Setup installer because bundled LGPL libraries must remain replaceable by end users. This does not say --onedir is generally better or that --onefile universally violates LGPL. The app can notify about a GitHub release but does not self-update. Hashes verify bytes and GitHub provenance identifies the build origin. WinGet is an optional discovery overlay, not an installer, hosting, signing, update, commerce, or review system.
Unsupported or external outcomes
- No result here establishes malware safety or SmartScreen reputation.
- Store or MSIX remains deferred and not reproduced.
- General WinGet acceptance is external.
- The released local artifacts are not Authenticode-signed.
- This is not legal advice. Layout alone does not fulfill all license obligations; notices, source or offer requirements, and the actual dependency and license versions still matter.
Related drafts
Source ledger
| Source owner | Primary URL | Review class | Last reviewed | Exact claim or evidence mapped |
|---|---|---|---|---|
| Microsoft | https://learn.microsoft.com/en-us/windows/apps/package-and-deploy/choose-distribution-path | Release-critical | August 14, 2026 | Distribution routes differ in signing, updates, hosting, and discovery responsibilities. |
| Microsoft | https://learn.microsoft.com/en-us/windows/apps/package-and-deploy/code-signing-options | Release-critical | August 14, 2026 | Signing choices have eligibility and SmartScreen boundaries. |
| Microsoft | https://learn.microsoft.com/en-us/windows/package-manager/package/repository | Release-critical | August 14, 2026 | WinGet submission is an external repository process. |
| JDE-Projects Build-Tools | https://github.com/JDE-Projects/Build-Tools/blob/ab90ba3459fe0e7cadab8d23d7e920d0bacabdaa/.github/workflows/release.yml | Production evidence | August 14, 2026 | Tag build, ZIP, installer, SHA-256, provenance, and release gate. |
| JDE-Projects Simple UNA Log Viewer | https://github.com/JDE-Projects/Simple-UNA-Log-Viewer/blob/df2ce2118a0d8c2ffa3ec0ea0189dc6a6eefc1e3/Build_Simple_UNA_Log_Viewer.bat | Production evidence | August 14, 2026 | --onedir pywebview and PySide6 build pattern. |
| JDE-Projects Simple UNA Log Viewer | https://github.com/JDE-Projects/Simple-UNA-Log-Viewer/blob/df2ce2118a0d8c2ffa3ec0ea0189dc6a6eefc1e3/THIRD-PARTY-LICENSES.txt | Production evidence | August 14, 2026 | Estate notice identifies the PolyForm build and --onedir replaceability goal. |
| Qt | https://www.qt.io/development/open-source-lgpl-obligations | Framework-critical | August 14, 2026 | Qt’s stated LGPL obligations boundary. |
| Qt | https://www.qt.io/faq/qt-open-source-licensing | Framework-critical | August 14, 2026 | Qt open-source licensing context. |
| Free Software Foundation | https://www.gnu.org/licenses/lgpl-3.0.en.html | Framework-critical | August 14, 2026 | LGPLv3 primary license text. |
| Microsoft WinGet Community Repository | https://github.com/microsoft/winget-pkgs/pull/403412 | Production evidence | August 14, 2026 | Initial WinGet lifecycle for Simple UNA Log Viewer only. |
| Microsoft WinGet Community Repository | https://github.com/microsoft/winget-pkgs/pull/416401 | Production evidence | August 14, 2026 | WinGet update lifecycle for Simple UNA Log Viewer only. |