Skip to content

feat(windows): ship an installer, with the zip as the portable option - #114

Merged
StuartCameronCode merged 5 commits into
linux-appimagefrom
windows-installer
Oct 5, 2026
Merged

StuartCameronCode merged 5 commits into
linux-appimagefrom
windows-installer

Conversation

@StuartCameronCode

Copy link
Copy Markdown
Owner

Stacked on #113 (base linux-appimage) — both touch the same release scripts, README table and packaging_test.dart. Merge #113 first; GitHub will retarget this to main.

Summary

The Windows release was a zip to extract and run. It now also ships an Inno Setup installer built from the same tree: Start menu shortcut, optional desktop shortcut, an entry in Settings → Apps. The zip stays as the portable option.

  • packaging/windows/vapourbox.iss (new) — the installer definition.
  • Scripts/build-windows-installer.ps1 (new) — compiles it from an assembled package directory; checks the tree is complete first.
  • package-windows.ps1 — calls it after zipping. -SkipInstaller gives the zip alone.
  • build-windows.yml — installs Inno Setup, builds the installer, uploads -setup.exe + .zip.
  • ci-build-and-release.sh, release.sh — the release upload picks up *-setup.exe; release-notes text updated.
  • packaging_test.dart — three lint tests (below).
  • Docs — README install steps and download table, docs/BUILDING.md, a Windows section in CLAUDE.md.

Design notes

  • Per-user only (PrivilegesRequired=lowest), no all-users option. On Windows the app downloads deps and add-ons into deps\ and addons\ next to the executable, so the install directory must stay user-writable. It installs to %LOCALAPPDATA%\Programs\VapourBox and never prompts for admin. A lint test ties this restriction to the line in dependency_manager.dart that makes it necessary.
  • Upgrade keeps deps\/addons\; uninstall removes them. [InstallDelete] clears templates\ and data\ before an upgrade, because Inno never removes a file a newer version dropped and exe_dir\templates is the first path the worker searches. Saved presets are left alone.
  • Its own script, not part of package-windows.ps1, because build-windows.yml assembles the package inline rather than calling that script (and the two zips differ in layout). That pre-existing split is untouched here.
  • Inno Setup pinned to 6.7.3 by SHA-256, not 7.x: the .iss is written against 6.

Not changed

  • The installer is unsigned, like the rest of the Windows build, so SmartScreen warns on it. The README tells users to choose More info → Run anyway. Removing the warning needs a code-signing certificate.
  • The zip's contents and layout.

Test plan

  • flutter test test/packaging_test.dart passes locally (10 tests)
  • The installer has not been compiled yet — it needs Inno Setup on Windows. build-windows.yml dispatched on this branch; result to follow in a comment.
  • Run the installer on Windows 10/11: no UAC prompt, Start menu shortcut, first-launch deps download succeeds, a job encodes
  • Install an older build then this one: deps are kept, no second entry in Settings → Apps
  • Uninstall: deps\ and addons\ are gone, %USERPROFILE%\.vapourbox is not

🤖 Generated with Claude Code

https://claude.ai/code/session_014GLXdGLfPwgYjW1AkonGqN

StuartCameronCode and others added 5 commits October 5, 2026 22:17
The Windows release was a zip to extract and run. It now also ships an
Inno Setup installer built from the same tree, giving a Start menu
shortcut, an optional desktop shortcut and an entry in Settings > Apps.

- Per-user only (PrivilegesRequired=lowest), with no all-users option:
  on Windows the app downloads deps and add-ons beside the executable,
  so the install directory has to stay user-writable.
- An upgrade keeps deps\ and addons\; uninstall removes them. templates\
  and data\ are cleared before an upgrade, since Inno never removes a
  file a newer version dropped.
- The installer is its own script, build-windows-installer.ps1, because
  build-windows.yml assembles the package inline rather than calling
  package-windows.ps1. Both now call it.
- Inno Setup is pinned to 6.7.3 by SHA-256 in the workflow.
- packaging_test.dart lints the per-user restriction, the uninstall and
  upgrade rules, and the filename across the .iss, scripts and upload.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GLXdGLfPwgYjW1AkonGqN
Same Windows-checkout CRLF trap as the AppImage lint tests: the installer
group asserted workflow lines ending in \n.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GLXdGLfPwgYjW1AkonGqN
…e runner's

The runner image already has an ISCC.exe on PATH (a Chocolatey shim), and
build-windows-installer.ps1 found that before the pinned 6.7.3 the
workflow had just installed. Install the pinned copy to its own directory
and pass it as $ISCC; log the compiler's version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GLXdGLfPwgYjW1AkonGqN
ISCC.exe carries no usable version resource, so it printed 0.0.0.0. The
path already names the pinned copy in CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014GLXdGLfPwgYjW1AkonGqN
@StuartCameronCode

Copy link
Copy Markdown
Owner Author

Test builds of this branch are green: https://github.com/StuartCameronCode/VapourBox/actions/runs/37303191178 (version 0.0.1, deps-v1.12.0).

  • The .iss compiles; the artifact holds VapourBox-0.0.1-windows-x64-setup.exe (~13 MB) and the .zip (~16 MB).
  • The first build compiled with the runner image's own ISCC.exe (a Chocolatey shim on PATH) rather than the pinned 6.7.3. Fixed in f3db8bf: the pinned copy installs to its own directory and is passed as $ISCC. The second build's log confirms D:\a\_temp\InnoSetup-6.7.3\ISCC.exe did the compiling.
  • CI Tests pass on all four platforms at f3db8bf, including the CRLF fix for the lint tests on a Windows checkout.

Still unchecked: running the installer on a real Windows machine (no UAC prompt, first-launch deps download, upgrade, uninstall).

🤖 Generated with Claude Code

@StuartCameronCode
StuartCameronCode merged commit 2594f56 into linux-appimage Oct 5, 2026
4 checks passed
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.

1 participant