Skip to content

Releases: jamesccupps/UnifiStockWatcher

v2.1.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 18:27

Downloads

File Use
UnifiStockWatcher.exe The GUI. Double-click; no Python needed.
UnifiStockWatcher-cli.exe Headless watcher, for running under Task Scheduler.

Both are portable — they keep watched_items.json, settings.json and
stock_history.json in the folder you put the executable in, so put it
somewhere writable rather than Program Files.

The executables are unsigned, so SmartScreen will warn on first run
(More info → Run anyway). Some antivirus engines flag unsigned PyInstaller
builds; if you would rather not trust a binary, running from source is
still fully supported — see the README.

v2.0.1

Choose a tag to compare

@jamesccupps jamesccupps released this 19 Aug 17:41
Fix mouse wheel scrolling doing nothing

The previous fix for the bind_all leak installed the wheel binding on
<Enter> of the canvas and tore it down on <Leave>. Moving the pointer onto a
child row fires <Leave> on the container, so the binding was removed exactly
where the user scrolls - and in a list the pointer is always over a row.
Scrolling stopped working entirely, in both the watch list and the browse
dialog.

Bind on the toplevel instead: a toplevel is in the bindtags of every widget
inside it, so it catches wheel events over any descendant while staying
scoped to that window. The handler resolves the scroll target from the
pointer position rather than closing over one canvas, so a destroyed canvas
is simply never found - which keeps the original leak fixed too.

Verified over rows, over nested labels and checkbuttons, in both the watch
list and the browse dialog, and with the browse dialog closed. Two tests
added; the first fails against the old binding.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Update v2

Choose a tag to compare

@jamesccupps jamesccupps released this 19 Aug 17:28
UniFi Stock Watcher 2.0.0

A correctness release. Stock detection was wrong for a large part of the
catalog, in ways that produced no error and no visible symptom - the
watcher simply never fired.

Verified against catalog truth: a 40-product sweep went from 10 correct /
10 wrong to 40 / 0. Also closes a command-injection hole in the
notification path, and adds 92 tests plus CI on Windows and Linux across
Python 3.10-3.13.

Breaking for anyone importing unifi_core: check_slug() raises
ProductNotFound / StoreError instead of returning a fabricated
(False, None); invalidate_build_id() takes a region; StockHistory buffers
writes and needs flush().

See CHANGELOG.md for the full list.

Unifi Stock Tracker - Category Update

Choose a tag to compare

@jamesccupps jamesccupps released this 17 Apr 19:44

Added

  • Two new top-level categories: Accessories, Cables & DACs (+229 products)
    and Network Storage (+33 products). Product discovery went from ~199 to
    ~461 unique items.
  • fetch_all_products now accepts an optional error_cb(category, exception)
    so GUI callers can surface per-category failures.
  • Automatic retry with fresh buildId when a category fetch 404s mid-run
    (matches the existing behavior in check_slug).
  • Fallback support for flat pageProps.products lists for future-proofing.

Notes

  • No config migration required. Existing watched_items.json,
    settings.json, and stock_history.json are untouched.
  • Fully backward compatible — existing CLI and GUI calls work unchanged.

Unifi Stock Watcher v1.0.0

Choose a tag to compare

@jamesccupps jamesccupps released this 15 Apr 17:52
d42e626

Initial release - Unifi Stock Watcher v1.0.0