feat(windows): ship an installer (.exe) instead of the portable zip

Open
#1,621 1 comment 1 reaction 0 assignees View on GitHub

Maintainers usually reply within 1 day

@lollipopkit is already working on this.

Since Oct 20, 2026.

  • #1764 by @lollipopkit — open

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
dart, flutter, github-actions

Research direction

Start with packages/fl_build and its flutterBuildWin flow, then read build.yml and the existing fl_lib AppUpdate Windows handling. Review the proposed .iss script, installation.mdx, and platforms/desktop.md alongside the checksum and winget changes. Done means the installer, transition zip, update fallback, runtime files, checksums, winget submission, and documentation are all updated as described.

Written by the indexing model from the issue text.

Description

enhancement feature

Windows is shipped only as ServerBox_v1.0.N_windows_amd64.zip. A setup .exe would install the app, add a Start menu entry and an uninstaller, and let winget treat it as an ordinary installer.

What is there now

  • fl_build (flutterBuildWin) zips build\windows\x64\runner\Release. The CDN upload (fl_build -s) sends whatever file that produces.
  • The zip bundles no VC++ runtime (msvcp140.dll, vcruntime140.dll, vcruntime140_1.dll), so the app relies on the redistributable already being installed.
  • In-app update (fl_lib AppUpdate._getGitHubUrl) on Windows only matches a .zip containing windows, and opens it in the browser. A release without such an asset is silent by design: no notice, no error (update.dart).
  • winget: the first submission (microsoft/winget-pkgs#443244, 1.0.1617) is InstallerType: zip + NestedInstallerType: portable, still waiting on manual review. Nothing is published there yet.
  • Docs (installation.mdx, platforms/desktop.md) describe a portable zip.
  • App data lives in the user's app-data directory, not beside the exe, so moving from the zip to an installer keeps it.

Proposal

  • Inno Setup, preinstalled on windows-latest (InnoSetup 6.7.1 on both the 2022 and 2025 images).
  • A per-user install to %LOCALAPPDATA%\Programs\ServerBox (no admin), with a fixed AppId so a new version installs over the old, Start menu and optional desktop shortcuts, and closing a running instance before replacing files.
  • Bundle the VC++ runtime DLLs next to the exe (app-local), so a machine without the redistributable can start it.
  • Output ServerBox_v1.0.N_windows_amd64.exe, included in SHA256SUMS/MD5SUMS.

Changes

  • packages/fl_build: build the installer after the release build.
  • packages/fl_lib: on Windows, prefer the .exe asset and fall back to .zip.
  • This repo: the .iss script, build.yml (upload the exe, update the checksums), winget submission (installer URL; komac detects Inno), and the docs.

Transition
Releases up to v1.0.1719 only look for the .zip, and stay silent without it. Keep publishing the zip next to the exe for one or two releases (marked TODO), then drop it. Until then, the winget submission can switch to the exe, since nothing has been published there yet.

Not in scope
The exe stays unsigned, so SmartScreen still shows "unknown publisher", as it does now for the exe inside the zip (#907 was a Defender false positive on the download). Fixing that needs a code-signing certificate or Azure Trusted Signing, which is a separate decision.

Dominant language
Dart
Stars
9k
Forks
577
Avg merge
1h 48m
Merged PRs (30d)
153

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from lollipopkit/flutter_server_box

All issues in lollipopkit/flutter_server_box

Similar issues

More Dart issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.