Package the tray+daemon as a single PyInstaller onefile exe so it runs on a
fresh Windows 11 box with no Python and no pip install. Verified on hardware:
the frozen exe connects over BLE, reads the Windows media session, and pushes
now-playing (incl. Cyrillic) at the 3s / 60s cadence.
- clawdmeter.spec: onefile, windowed (no console; logs to daemon.log). collect_all
for winrt + bleak is the key bit — bleak loads its WinRT backend dynamically and
the winrt.windows.* projections are split distributions that PyInstaller's static
analysis misses, so BLE and the media session would otherwise fail at runtime.
upx off (lowers AV false-positive rate).
- build-exe.ps1: one-command build (venv + deps + pyinstaller + spec).
- tray_windows.py: resolve the brand-logo asset from sys._MEIPASS when frozen.
- autostart_windows.py: when frozen, the HKCU\Run "Start at login" value points at
the exe itself (sys.executable), not pythonw + script.
- .gitignore: ignore /build, /dist, /.venv — the exe ships via a Gitea release.
- README-windows.md: document the standalone-exe path (download / run / build).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>