Scope
This is the reproduced Inno Setup recipe for a Windows 11 x64 Python GUI application built as a complete PyInstaller --onedir folder. It does not cover signing, Store ingestion, MSIX conversion, PE version resources, or universal preservation of application data.
The mapped estate uses that folder layout for PolyForm Noncommercial/Internal Use distributions because bundled LGPL Qt and other LGPL libraries must remain replaceable by end users. It is not a general --onedir preference.
Answer
When that LGPL replaceability requirement applies, build the complete --onedir folder, keep a stable installer AppId, and build the installer from that folder in the release workflow. The release tag supplies AppVersion. The workflow names the installer with the app name and release tag, then publishes it beside the portable ZIP with SHA-256 and build provenance.
Recipe
- Build the complete
dist\<app folder>output with PyInstaller--onedir. Do not point the installer at only the executable. - Generate one unique AppId for the application and keep it unchanged for later releases. Pass it as
app_idto the shared workflow. - Tag the release. The shared workflow uses the tag as
MyAppVersionand names the output<app name>-<tag>-setup.exe. - Let the workflow pass the complete distribution folder as
MySourceDirto the shared Inno Setup script. - Keep a portable ZIP of the same folder alongside the installer.
- The shared setup defaults to a per-user installation and provides an all-users choice at the privileges prompt. It creates a Start menu shortcut and has preselected desktop-shortcut and launch-after-install choices.
- A newer installer with the same AppId is the upgrade path. Run that newer installer rather than changing identity.
- Uninstall appears in Add or Remove Programs. After normal uninstall, the shared script offers an optional prompt to remove leftover application data beside the executable.
Do not infer PE version resources from this recipe. Do not assume every application keeps data in a location that the optional cleanup prompt can remove or preserve in the way you need.
Production evidence
The reusable workflow reads the release tag, builds the installer, passes the stable AppId and full source folder, creates its versioned filename, writes a SHA-256 file, and attests the installer with the ZIP. The shared Inno Setup script implements the installation choices, shortcuts, uninstall registration, and optional leftover-data prompt. Simple UNA Log Viewer’s caller supplies one stable AppId.
Unsupported or external outcomes
- The released local installer artifacts are not Authenticode-signed.
--onefileinstaller input was not chosen or reproduced for this mapped PolyForm route. This does not say--onefileuniversally violates LGPL; other license and distribution models need their own analysis and testing.- Store or MSIX is deferred and not reproduced. Store distribution may be viable but is not reproduced here.
- General WinGet acceptance is external.
- An installer does not establish malware safety or SmartScreen reputation.
- 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 |
|---|---|---|---|---|
| Inno Setup | https://jrsoftware.org/ishelp/topic_setup_privilegesrequired.htm | Framework-critical | August 14, 2026 | Per-user and administrative installation modes. |
| Inno Setup | https://jrsoftware.org/ishelp/topic_setup_privilegesrequiredoverridesallowed.htm | Framework-critical | August 14, 2026 | User choice between installation modes. |
| JDE-Projects Build-Tools | https://github.com/JDE-Projects/Build-Tools/blob/ab90ba3459fe0e7cadab8d23d7e920d0bacabdaa/.github/workflows/release.yml | Production evidence | August 14, 2026 | Release-tag version, complete folder input, filename, checksum, and provenance. |
| JDE-Projects Build-Tools | https://github.com/JDE-Projects/Build-Tools/blob/ab90ba3459fe0e7cadab8d23d7e920d0bacabdaa/installer/installer.iss | Production evidence | August 14, 2026 | AppId, shortcuts, uninstall, and cleanup prompt behavior. |
| 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 states why the installer consumes the complete --onedir folder. |
| Qt | https://www.qt.io/development/open-source-lgpl-obligations | Framework-critical | August 14, 2026 | Qt 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. |
| JDE-Projects Simple UNA Log Viewer | https://github.com/JDE-Projects/Simple-UNA-Log-Viewer/blob/df2ce2118a0d8c2ffa3ec0ea0189dc6a6eefc1e3/.github/workflows/release.yml | Production evidence | August 14, 2026 | One production caller’s stable AppId and release inputs. |