Release notes

BUGFIX

Windows startup crash is fixed, and packaging no longer drops modules

Windows crashed on startup in v0.29.34 through v0.29.36.

The 0.29.34 refactor moved wintray.py and tui.py to wintray/app.py and tui/app.py, but scripts/build_windows.ps1 still hidden-imported the old top-level module names. Because __init__.py in both packages is empty, PyInstaller only packaged empty shells and dropped the wintray dependency tree (panels.*, updates.*, and more). Every downloader hit ModuleNotFoundError: No module named 'wintray.app', and the TUI fallback failed because tui.app was also missing. macOS was unaffected because setup_app.py collects the whole package by name via py2app, which still matched after the rename.

FEATURE

Build script inspects archive contents to prevent shipping broken Windows executables

The Windows build script build_windows.ps1 previously only checked that an .exe file existed, which is why the three broken releases shipped without anyone noticing — the file was there, but missing the modules users needed. build_windows.ps1 now reads the PyInstaller archive contents with archive_viewer and throws if either wintray.app or tui.app entry-point module is missing. This ensures any future regression fails the release job instead of shipping a broken artifact.

Original changelog

Original changelogWindows startup crash is fixed, and packaging no longer drops modules
**Windows crashed on startup in v0.29.34 through v0.29.36.** The 0.29.34 refactor moved `wintray.py` to `wintray/app.py` and `tui.py` to `tui/app.py`, but `scripts/build_windows.ps1` still hidden-imported the old top-level module names. Both packages' `__init__.py` are empty, so PyInstaller packaged only empty shells and dropped the whole `wintray` dependency tree (`panels.*`, `updates.*`, and more) along with it — every downloader hit `ModuleNotFoundError: No module named 'wintray.app'`, and the TUI fallback failed the same way since `tui.app` was missing too. macOS was unaffected; `setup_app.py` collects the whole package by name via py2app, and the names still matched after the rename.
Original changelogBuild script inspects archive contents to prevent shipping broken Windows executables
**The Windows build script now verifies the packaged exe actually contains `wintray.app` and `tui.app`.** It previously only checked that an exe file existed, which is why the three broken releases above shipped without anyone noticing — the file was there, just missing the modules users needed. `build_windows.ps1` now reads the PyInstaller archive contents with `archive_viewer` and throws if either entry-point module is missing, so a future regression fails the release job instead of shipping a broken artifact.