- build-common.sh: remove zeroconf/_services from the strip list.
zeroconf's compiled Cython _listener.pyd imports from _services
internally, so stripping it broke `import zeroconf` at runtime with
ModuleNotFoundError — same class of bug as the numpy.linalg strip.
- build-common.sh: add smoke_test_imports() that imports every top-level
dependency against the stripped site-packages. Catches "we stripped
something that was actually needed" regressions at build time instead
of on a user's machine after install.
- build-dist.sh: wire smoke test into the Linux flow (runs real imports).
- build-dist-windows.sh: cross-build can't load win_amd64 .pyd files with
the host python, so instead verify that the known-required submodule
dirs (numpy.linalg/lib/matrixlib/ma, zeroconf._services) exist after
cleanup. Fails loud if any future strip-rule removes them.
- build-common.sh: detect_version() normalizes non-PEP440 labels (e.g. 'dev',
'nightly') to 0.0.0.dev0 so stamping pyproject.toml doesn't break pip install.
- build-common.sh: split .py deletion out of cleanup_site_packages into a new
compile_and_strip_sources() that runs 'compileall -b' FIRST, then removes
sources. compileall now fails loud instead of silently no-op'ing.
- build-dist.sh: add missing compile_and_strip_sources call on Linux site-packages
(previous tarballs shipped empty packages with no .py and no .pyc).
- build-dist-windows.sh: reorder so compile_and_strip_sources runs right after
cleanup_site_packages, not after .py files have already been deleted.
- installer.nsi: RMDir /r payload dirs (python/, app/, scripts/) and delete
LedGrab.bat at the top of SecCore before File /r. NSIS File /r MERGES into
existing dirs, so upgrades left half-old/half-new state that surfaced as
'version mismatch' or duplicate-package ImportErrors. data/ and logs/ remain
untouched to preserve user config.
- Create utils/image_codec.py with cv2-based image helpers
- Replace PIL usage across all routes, filters, and engines with cv2
- Move Pillow from core deps to [tray] optional in pyproject.toml
- Extract shared build logic into build-common.sh (detect_version, cleanup, etc.)
- Strip unused NumPy/PIL/zeroconf/debug files in build scripts
- Move startup banner into main.py so it shows the actual configured
port instead of a hardcoded 8080 in the launcher scripts
- Wrap tkinter import in try/except so embedded Python (which lacks
tkinter) logs a warning instead of crashing the overlay thread
Windows: install-autostart.bat (Startup folder shortcut),
uninstall-autostart.bat. Linux: install-service.sh (systemd unit),
uninstall-service.sh.
Both launchers now use python -m wled_controller.main so port is
read from config/env instead of being hardcoded to 8080.
Restructure release.yml into 4 jobs:
- create-release: shared Gitea release with download table
- build-windows: existing portable ZIP (unchanged)
- build-linux: new tarball with venv + run.sh launcher
- build-docker: push image to Gitea Container Registry
Add build-dist.sh as Linux equivalent of build-dist.ps1.
Docker tags: version + latest (stable only, no latest for alpha/beta/rc).