Skip to content

Packaging: Windows native installer (MSI / WinGet) as Docker alternative #17

Description

@zzallirog

What this is

A Windows-native install path for weighted-compact: a WinGet manifest pointing at a PyInstaller-built portable executable, with a Windows Scheduled Task XML mirroring the systemd timer for the nightly REM pass. Docker (docs/docker-install.md) remains an option; this issue adds a no-Docker path.

Architectural answer (pre-set)

Primary target: WinGet

  • A WinGet manifest (manifests/z/zzallirog/weighted-compact/) that references a GitHub release artifact: weighted-compact.exe built by PyInstaller from the PyPI package.
  • PyInstaller produces a single-file portable executable (--onefile). It bundles the Python runtime and all deps except sentence-transformers model weights (those download on first use to the user's cache dir — this is existing behavior, not new).
  • The executable is released via GitHub Actions on each tagged release and attached to the GitHub release as an asset. The WinGet manifest references the asset URL + SHA256.

MSI: secondary, optional. If a contributor wants to add a WiX-based MSI wrapping the same exe, that's welcome but not required for the initial cut.

Scheduled Task XML:

<Task>
  <Triggers><CalendarTrigger><StartBoundary>2026-01-01T04:00:00</StartBoundary><ScheduleByDay><DaysInterval>1</DaysInterval></ScheduleByDay></CalendarTrigger></Triggers>
  <Actions><Exec><Command>weighted-compact.exe</Command><Arguments>rem-pass</Arguments></Exec></Actions>
</Task>

Installed via schtasks /create /xml in the install instructions, not auto-created by the installer. The user runs the command explicitly.

%APPDATA%\weighted-compact\ is the Windows equivalent of $XDG_DATA_HOME/weighted-compact/. config.py must map APPDATA on Windows — confirm this is handled or add it as part of the PR scope.

Open question for the contributor

  • Bundle Python or require it in PATH: PyInstaller --onefile bundles everything (~50–80 MB for the base package without model weights). The alternative is requiring python >= 3.11 in PATH and installing via pip. PyInstaller removes the Python prerequisite entirely and is more beginner-friendly. Recommend a choice and justify in the PR description.
  • config.py Windows path mapping: does config.py currently handle APPDATA / LOCALAPPDATA on Windows, or does it only handle XDG? If not, this issue must include the fix. Check config.py and report in your first comment on this issue before implementing.
  • GitHub Actions builder: the PyInstaller build should run in a Windows runner (windows-latest) in CI on tag push. Adding this workflow is in scope for this issue.

Where to start

  1. weighted_compact/config.py — check XDG fallback behavior on non-Linux platforms.
  2. pyproject.toml — deps that PyInstaller needs to bundle.
  3. systemd/ — the timer unit to mirror as a Scheduled Task XML.
  4. WinGet manifest spec — the YAML format.
  5. docs/docker-install.md — the existing alternative install path, for contrast.

What NOT to do

  • Do not add telemetry, crash reporting, or auto-update mechanisms to the installer.
  • Do not auto-create the Scheduled Task — require explicit user opt-in.
  • Do not add a network listener or cloud sync path to the Windows build.
  • Do not bundle model weights in the installer — let them download on first use to the user's cache.

Skill level

Medium — Windows packaging (PyInstaller, WinGet manifests) + GitHub Actions experience. The Python code needs a small config.py patch for the Windows data path; everything else is packaging infrastructure.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:packagingDistro packaging / installerscommunity-invitationMaintainer-drafted, architecture pre-set, contributor implementshelp wantedExtra attention is neededsize:MMedium — a few days

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions