config.ini now saves to AppData\Local\Series3Watcher\ instead of Program Files — fixes permission denied error on first-run wizard save.
Config path resolution in both series3_tray.py and series3_watcher.py updated to use sys.frozen + LOCALAPPDATA when running as a PyInstaller .exe.
Status menu item now uses a callable so it updates every time the menu opens — was showing stale "Starting..." while tooltip correctly showed current status.
Settings dialog now opens in its own thread — fixes unresponsive tabs and text fields while the watcher loop is running.
Tray icon reverted to plain colored dot — custom icon graphic was unreadable at 16px tray size. .ico file is still used for the .exe file icon.
Changed
Terra-View URL field in settings wizard now accepts base URL only (e.g. http://192.168.x.x:8000) — /api/series3/heartbeat endpoint appended automatically.
Test Connection button now hits /health endpoint instead of posting a fake heartbeat — no database side effects.
"terra-view URL" label capitalized to "Terra-View URL".
Default log path updated to AppData\Local\Series3Watcher\agent_logs\series3_watcher.log.
Installer now creates agent_logs\ folder on install.
BUILDING.md added — step-by-step guide for building, releasing, and updating.
[1.4.0] - 2026-03-12
Added
series3_tray.py — system tray launcher using pystray + Pillow. Color-coded icon (green=OK, amber=Pending, red=Missing, purple=Error, grey=Starting). Right-click menu shows live status, unit count, last scan age, Open Log Folder, and Exit.
run_watcher(state, stop_event) in series3_watcher.py for background thread use by the tray. Shared state dict updated on every scan cycle with status, unit list, last scan time, and last error.
Interruptible sleep in watcher loop — tray exit is immediate, no waiting out the full scan interval.
Changed
main() now calls run_watcher() — standalone behavior unchanged.
## [1.4.1] - 2026-03-17
### Fixed
- `config.ini` now saves to `AppData\Local\Series3Watcher\` instead of `Program Files` — fixes permission denied error on first-run wizard save.
- Config path resolution in both `series3_tray.py` and `series3_watcher.py` updated to use `sys.frozen` + `LOCALAPPDATA` when running as a PyInstaller `.exe`.
- Status menu item now uses a callable so it updates every time the menu opens — was showing stale "Starting..." while tooltip correctly showed current status.
- Settings dialog now opens in its own thread — fixes unresponsive tabs and text fields while the watcher loop is running.
- Tray icon reverted to plain colored dot — custom icon graphic was unreadable at 16px tray size. `.ico` file is still used for the `.exe` file icon.
### Changed
- Terra-View URL field in settings wizard now accepts base URL only (e.g. `http://192.168.x.x:8000`) — `/api/series3/heartbeat` endpoint appended automatically.
- Test Connection button now hits `/health` endpoint instead of posting a fake heartbeat — no database side effects.
- "terra-view URL" label capitalized to "Terra-View URL".
- Default log path updated to `AppData\Local\Series3Watcher\agent_logs\series3_watcher.log`.
- Installer now creates `agent_logs\` folder on install.
- `BUILDING.md` added — step-by-step guide for building, releasing, and updating.
## [1.4.0] - 2026-03-12
### Added
- `series3_tray.py` — system tray launcher using `pystray` + `Pillow`. Color-coded icon (green=OK, amber=Pending, red=Missing, purple=Error, grey=Starting). Right-click menu shows live status, unit count, last scan age, Open Log Folder, and Exit.
- `run_watcher(state, stop_event)` in `series3_watcher.py` for background thread use by the tray. Shared `state` dict updated on every scan cycle with status, unit list, last scan time, and last error.
- Interruptible sleep in watcher loop — tray exit is immediate, no waiting out the full scan interval.
### Changed
- `main()` now calls `run_watcher()` — standalone behavior unchanged.
- `requirements.txt` updated to document tray dependencies (`pystray`, `Pillow`); watcher itself remains stdlib-only.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
[1.4.1] - 2026-03-17
Fixed
config.ininow saves toAppData\Local\Series3Watcher\instead ofProgram Files— fixes permission denied error on first-run wizard save.series3_tray.pyandseries3_watcher.pyupdated to usesys.frozen+LOCALAPPDATAwhen running as a PyInstaller.exe..icofile is still used for the.exefile icon.Changed
http://192.168.x.x:8000) —/api/series3/heartbeatendpoint appended automatically./healthendpoint instead of posting a fake heartbeat — no database side effects.AppData\Local\Series3Watcher\agent_logs\series3_watcher.log.agent_logs\folder on install.BUILDING.mdadded — step-by-step guide for building, releasing, and updating.[1.4.0] - 2026-03-12
Added
series3_tray.py— system tray launcher usingpystray+Pillow. Color-coded icon (green=OK, amber=Pending, red=Missing, purple=Error, grey=Starting). Right-click menu shows live status, unit count, last scan age, Open Log Folder, and Exit.run_watcher(state, stop_event)inseries3_watcher.pyfor background thread use by the tray. Sharedstatedict updated on every scan cycle with status, unit list, last scan time, and last error.Changed
main()now callsrun_watcher()— standalone behavior unchanged.requirements.txtupdated to document tray dependencies (pystray,Pillow); watcher itself remains stdlib-only.