All notable changes to this project will be documented in this file.
- bootstrap venv pip reliably when a system pip is present (0bab251)
- bump version to v7.0.22 (bff4a39)
- update CHANGELOG for v7.0.21 (9ec87b6)
- bump version to v7.0.21 (9a920a4)
- install pyzm[full] on local update + verify in gate (6a97fcb)
- offer local install + validation gate after release (404c8d8)
- auto-sync pyzm pin in hook/setup.py to latest PyPI (8c6b239)
- bootstrap pip into venv and document prerequisites (88e010a)
- update CHANGELOG for v7.0.20 (25d7c81)
- note pip3/python3-venv prerequisite for both paths (3beda52)
- point repo references to ZoneMinder/zmeventnotificationNg (3b9d381)
- update CHANGELOG for v7.0.19 (28489db)
- document convert_snapshot_to_fid default flip to "no" (2a3716c)
- patch venv shebang and fix tuple assignment for user key (7da1057)
- update CHANGELOG for v7.0.18 (f9d4fc4)
- update RTD title to zmesNg Event Notification Server Documentation (b00464d)
- log resolved file path on startup via pyzm get_log_file() (f43a88e)
- we don't need resize (d99fa70)
- update CHANGELOG for v7.0.17 (a34b290)
- rename project to zmeventnotificationNg / pyzmNg across all user-facing docs (fa50785)
- use fid=alarm in push picture URL when detection has no match (694c993)
- add push.send_push_on_no_match for direct mode push on detection failure (65ea0dd)
- bump version to v7.0.16 (dd7efbb)
- default replace_push_messages to yes in ES example config (5dd0b6a)
- update CHANGELOG for v7.0.15 (cb2d8dd)
- restructure config guide for clarity (347b090)
- add push table to Complete Hook Config Reference (459b35d)
- add complete ES config reference and push config table (5b90029)
- add --override/-O CLI flag to zm_detect.py (238570d)
- update send_push cloud function for zmNinjaNG (0255db6)
- bump version to v7.0.15 (da34a7a)
- verbump (0b2ffb1)
- added separator between detection and motion (57d9368)
- handle missing frame match prefix in pushover and ftp plugins (9476153)
- move max_detection_size, match_past_detections to ml_sequence.general (2c4c280)
- register ml_gateway_mode and ml_timeout in common_params (6606e8d)
- inject monitor_id and image_path into ml_options (dfb23d2)
- cache zm.event() call, remove private detector._gateway access (d4d0b5c)
- honor allow_self_signed in animation, guard ZeroDivisionError (53bb1b0)
- exit with error code 1 on config parse failure (56e3a5e)
- pass through pattern and ignore_pattern in import_zm_zones (ce59da3)
- update CHANGELOG for v7.0.14 (319387b)
- add implementation plan for show_frame_match_type (57ef67a)
- add keep_frame_match_type removal to breaking changes (cb91c16)
- update config reference for show_frame_match_type, remove keep_frame_match_type (90ecee9)
- rename zmNg/zmNinja to zmNinjaNG across all references (e890afc)
- fix RST formatting — promote config reference, fix nested markup (b6c905f)
- add complete config reference table, document breaking changes (16a7f4f)
- fix frame_strategy placement, clarify ml_sequence.general keys (3e5697f)
- add AGENTS.md with plan file hygiene instructions (a3c6644)
- update remote detection docs for thin server refactor (b8f8b0b)
- fix push_config ref label so it renders as a clickable link (3ce03c7)
- clarify Path 1 vs Path 2 notification capabilities across all docs (3ac2818)
- add include_profile_in_push config flag (681459c)
- add profile to visible push notification display (a579000)
- include profile in direct-mode FCM push payload (72a4da3)
- include profile in FCM push data payload (edfd896)
- parse and store profile in token registration (4dbdca6)
- auto-remove keep_frame_match_type during config upgrade (48b7983)
- add show_frame_match_type config to control [a]/[s]/[x] prefix (2b18e0c)
- ver bump (76bc545)
- add docs/plans/ to .gitignore (619aadc)
- ver bump (f640add)
- remove unused deps (imageio, pygifsicle, future) from setup.py (1484e09)
- ver bump (de84ce7)
- remove dead code from hook helpers (b02ae11)
- remove keep_frame_match_type — replaced by hook-side show_frame_match_type (263b3d2)
- use frame_id from detection JSON in buildPictureUrl (c749631)
- config simplicity — fix key placement, remove dead code, add validation (99bcd99)
- config flow tests for monitor overrides, remote, and monitor_id injection (a6d0cfc)
- feat: auto-update managed FCM defaults during install in #22 (0c8c889)
- read hook version from VERSION file instead of installed package (9767d62)
- generic invalid token detection for FCM proxy responses (a4b4c13)
- clean up NotRegistered tokens from FCM proxy response (be58ae2)
- include push module in setup.py py_modules (03a50a6)
- log FCM payload at debug level 1 for visibility in logfile (d7e7f51)
- update CHANGELOG for v7.0.12 (d790632)
- add manual push notification testing instructions (a076f74)
- add note about desktop polling in Direct mode (70f9a12)
- update Path 1 references to reflect push notification support (7daceb0)
- add setup steps for push config with secrets and key instructions (5a16c56)
- document push notification support in Path 1 and push config section (c7d7ae2)
- warn when push include_picture is set but picture_url is missing (4dbecf8)
- include picture URL in push notification payload (c0918cc)
- ship managed FCM key and URL as defaults in push config (6bc1f8f)
- add direct FCM push notifications to zm_detect (ca13f62)
- pass managed_defaults.yml during ES config upgrade (f5bddc5)
- add --managed-defaults flag to config_upgrade_yaml.py (ccab79c)
- bump ES to 7.0.12, require pyzm >= 2.3.0 (72f60c8)
- add managed_defaults.yml with old FCM key/URL defaults (8c02fc8)
- update FCM defaults to zmng-b7af6 cloud function (e11324b)
- use picture_url template for push image instead of hardcoding (f1bb55d)
- unified managed defaults for ES and hook configs (6b64dbd)
- remove redundant keys from objectconfig.yml (009b1a2)
- remove deprecated FCM legacy API, add monitorName/cause to push data (4756a26)
- add tests for managed defaults config upgrade (71d15b1)
- case-insensitive secret token lookup in _resolve_secret (f526979)
- ensure cv2.polylines receives int32 coordinates (a35358c)
- parse float zone coordinates in objectconfig.yml (3dc483e)
- update CHANGELOG for v7.0.11 (2a13157)
- fix (e190179)
- document recursive and case-insensitive secret resolution (7b46539)
- bump version to v7.0.11 (c398d1b)
- use Event.save_objdetect() from pyzm for image writing (7cc665d)
- replace _draw_bbox with result.annotate() from pyzm (6575f19)
- recursive secret resolution in process_config (8b0f9e9)
- use pyzm ZMClient for zone import instead of raw urllib (8d83425)
- update CHANGELOG for v7.0.10 (81adc64)
- update CHANGELOG for v7.0.9 (9d27e2e)
- Update README.md broken install link (826fea3)
- log objdetect image write path (f2c5633)
- update CHANGELOG for v7.0.8 (5250d7d)
- inline pyzm.helpers.utils functions removed in pyzm v2 (4665014)
- stop using PY_SUDO for system package installs and broaden ensure_venv scope (bc928c8)
- only show pyzm extras message when pyzm was freshly installed (c2d9979)
- update CHANGELOG for v7.0.7 (12303a5)
- expand face recognition install with BLAS and reinstall steps (067f267)
- remove the test count and fix gramar (c89d7ab)
- update CHANGELOG for v7.0.6 (d647693)
- fix inline code quoting for mlapi and pyzm.serve in breaking.rst (55eaf84)
- fix sidebar/note formatting in principles.rst section 3.2.1 (e249c05)
- update CHANGELOG for v7.0.5 (6f375d9)
- added documentation notes and pyzm reliance (49dd557)
- comprehensive RTD documentation audit and fixes (ea81fe1)
- broken --venv-path argument parsing (a44915b)
- update CHANGELOG for v7.0.4 (5a4b6db)
- fix objectconfig gateway mode default, comment out auth keys (c8cea48)
- update CHANGELOG for v7.0.4 (bb0a012)
- add BirdNET audio section to objectconfig and hooks guide (c9c655e)
- add BirdNET audio detection to hooks documentation (55d4bf0)
- add zmES7+ logo to README and RTD docs (a416f7d)
- point zmNg sidebar and doc links to RTD (2fea09d)
- add --install-birdnet flag for BirdNET audio detection (abca135)
- default zm_detect.py config to /etc/zm/objectconfig.yml (00e4fca)
- use shared venv instead of --break-system-packages (dce5934)
- bump version to v7.0.4 (e07bb9c)
- bump version to 7.0.4 (8524214)
- bump pyzm dependency to >=2.1.0 (6c0a459)
- use pyzm v2 OOP methods in zm_detect (f9ce160)
- sync hook version with VERSION file (9880c5e)
- bump version to v7.0.3 (a749a4a)
- fix sed regex not matching indented FALLBACK_VERSION line (551a94f)
- update CHANGELOG for v7.0.2 (6abf272)
- update all references from YOLOv26 default to YOLOv11 ONNX default (b5a459d)
- add --pyzm-debug to EventStartCommand examples (693acc0)
- bump version to v7.0.2 (9310d87)
- consolidate YOLO ONNX into single entry with yolo11 default (1abdc62)
- migrate all scripts from ZMLog to setup_zm_logging (68d37c7)
- add GitHub Release step to make_release.sh, pin --repo to pliablepixels fork (adeca59)
- update CHANGELOG for v7.0.1 (e6f50f5)
- add version bump option when tag already exists (d6ecb51)
- add ignore_pattern zone support and first_new frame strategy (a2fcc11)
- migrate zm_detect and helpers to pyzm.log.setup_zm_logging (e38c801)
- bump version to v7.0.1 (0d54762)
- guard against undef values in active_connections iterations (5ca77e2)
- deep-merge monitor overrides into global config instead of replacing (3bcd64d)
- install.sh Path 1 flow — skip ES config prompt and show correct final message (1077c53)
- use requirements file for RTD python dependencies (8884ef4)
- fix Sphinx conf.py for RTD build compatibility (8cfd6b1)
- update test stubs for pyzm v2 imports (d93a840)
- use public API methods instead of private/raw calls in zm_detect (6e5cfec)
- use hash ref access for secrets in getZmUserId (9685f38)
- handle zm_detect JSON format in _tag_detected_objects (1b5b90a)
- strip surrounding quotes in ES/secrets INI-to-YAML migration (44d751f)
- substitute /etc/zm paths in config files when TARGET_CONFIG differs (f856d38)
- auto-substitute all hardcoded paths in hook scripts (7c0fd70)
- auto-substitute config path in zm_event_start.sh (809b35c)
- strip whitespace from stream/eventid to handle non-breaking spaces (52aac3d)
- fix INI-to-YAML migration losing keys, chained vars, and types (f2e3707)
- add bind mount fallback for Perl module installs too (e5364b9)
- fall back to in-place copy when install fails on bind mounts (819e3c6)
- split OpenCV checks for yolov26 vs yolov4 in doctor (4fd55ca)
- parse ml_sequence under correct YAML path in doctor checks (e692e9e)
- update minimum OpenCV version to 4.13+ for ONNX YOLOv26 models (549eeac)
- support legacy {{base_data_path}} syntax in path substitution (590a8e7)
- expand {{variable}} references during INI to YAML migration (ddf75eb)
- update secrets.ini to secrets.yml reference in objectconfig.yml (823a379)
- add defensive checks for undefined values across codebase (e26d5cc)
- resolve uninitialized value warnings in Rules.pm and Version.pm (b03347a)
- make VERSION file the single source of truth (d940e10)
- move version to Perl module to fix install path issue (bc56a86)
- resolve uninitialized variable warnings and add comprehensive tests (e284021)
- add id-token permission for Claude OIDC auth (013270a)
- use correct OAuth token secret for Claude action (57b9ba4)
- auto-install pyyaml for config migration (8bb25c9)
- always update stale secrets.ini path in config (7a1eb48)
- import ceil from POSIX module (736a5b4)
- remove Perl taint mode causing socket startup crash (0c0f4d9)
- fix event_end cause update bug, remove dead code and legacy templates (e4af17a)
- guard missing secrets, remove dead import, improve error handling (4d916a4)
- update zm_detect.py for YAML secrets, disable yolov3 defaults (5035eba)
- move imports before ES version check (ad24d3a)
- always prompt before ultralytics install in interactive mode (f76ad28)
- use --no-deps for ultralytics/torch to preserve source-built OpenCV (548becf)
- guard against undef last_event_processed in log message (036396f)
- set CreateDate when creating new tags (7d5e539)
- use // '' instead of defined() for End state guards (a698086)
- guard $alarm->{End}->{State} checks against undef (98e8984)
- apply upstream Python hook fixes (a8459e4)
- apply critical DB/fork crash fixes from upstream (aec9cdb)
- update CHANGELOG for v7.0.0 (0c590d6)
- added self notes for release process (a83feda)
- add feature comparison table to installation page (f6a1ca2)
- restructure principles for both paths; professionalize tone; update install.sh (29210df)
- remove pip seg fault claim from OpenCV install section (eb7c31b)
- link to Ubuntu 24 OpenCV build gist in install guide (337ee88)
- expand sidebar navigation to show subsection indicators (465663d)
- note pyzm[serve] extra for remote ML server capability (5fdd0c5)
- consolidate troubleshooting into hooks_faq.rst (2f9b769)
- cross-link hooks troubleshooting and FAQ triage sections (874da9e)
- update Python requirement to 3.10+ in README (8dbfe62)
- warn about pycoral Python 3.10+ compatibility issues (cef23d7)
- fix OpenCV minimum version to 4.13+ for ONNX YOLOv26 (f9a7af0)
- update Path 1 minimum ZM version to 1.38.1+ (9926056)
- add prominent pycoral install notice to installer and FAQ (b8a59a5)
- add "Triaging No Detection Problems" section to hooks FAQ (21b4bf5)
- add ES version check to Path 2 test step (626f182)
- rename test step to "Test manually", fix Path 2 version check (0331a12)
- add version check step to install test sections (ceb7339)
- replace duplicated install/test instructions with RTD links (141ca99)
- restructure installation into clean Path 1 / Path 2 sidebar (73d8e99)
- rename pyzm to pyzmv2+ in sidebar (7ad2811)
- add pyzm and zmNg to sidebar (ff79942)
- auto-update copyright year in Sphinx config (97dbd66)
- add pyzm and zmNg links to documentation section (78e2d50)
- add overview of Event Server and ML Ecosystem to index page (8263929)
- update title to Event Notification Server v7+ (523af0e)
- add inline context for Path 1/Path 2 references in install.rst (562855e)
- fix EventStartCommand location to Monitor Config -> Recording tab (3e25d55)
- restructure around two setup paths (577db84)
- fix Perl dependency list — add RSA, SSL, LWP, JSON (1fc0a5c)
- remove outdated performance comparison section (306b573)
- rewrite ES docs for pyzm v2 accuracy (09f6c98)
- point README to zmeventnotificationv7.readthedocs.io (b283338)
- update for pyzm v2 and URL-mode remote detection (9d4a6cd)
- clarified scope (104483d)
- cleanup (97e04d7)
- quick summary of improvements (e8187ae)
- install clarifications (b468592)
- update all documentation for YAML config migration (0cd32ca)
- add CLAUDE.md with project instructions and commit conventions (bd30158)
- use pyzm.serve for remote ML detection, remove legacy remote_detect() (1cac40b)
- rewrite zm_detect.py for pyzm v2 pipeline (ad2b82e)
- expand doctor checks to cover full install environment (ffcb8f1)
- add post-install doctor checks for common config issues (d63e39b)
- switch from YOLOv11 to YOLOv26 ONNX models (dd475f5)
- migrate objectconfig.ini to YAML format (90fbf3e)
- add INSTALL_YOLOV11 flag for ONNX model downloads (7711333)
- add ONNX YOLOv11 config entries to objectconfig.ini (cac48d2)
- Add Ultralytics YOLO model support to install.sh and objectconfig.ini (decdfca)
- tag detected objects in ZM database (b35274e)
- add dependency checks, Perl module install, and modernize helpers (0545691)
- clean up changelog config — add commit/issue links, filter old history (04aae9b)
- replace github_changelog_generator with git-cliff and consolidate release scripts (a20f6e5)
- add docs/_build/ to .gitignore (75c18f9)
- add .readthedocs.yaml for RTD builds (0653e46)
- remove exta quote (f8fcb6e)
- add libtest-warn-perl to install dependencies (a9536ac)
- add Claude GitHub Actions workflow (5174fe1)
- bump pyzm dependency to >=0.4.0 (38480df)
- don't push to ZM (04a4c81)
- add zm_detect_fake.sh test utility to contrib (051acec)
- more explicit instructions (c175cee)
- apply upstream misc fixes and additions (4e51f63)
- add fcm_service_account_file option and reset use_hooks default (89c3d7a)
- use ZMClient.event_path() instead of local path lookup (65366d9)
- move doctor checks from inline heredoc to tools/install_doctor.py (b25fffe)
- comprehensive code simplification across all modules (d34847b)
- read version from VERSION file in make_changelog.sh (4228bc8)
- centralize version into single VERSION file (8bb3eea)
- migrate ES config, secrets, and rules from INI/JSON to YAML (2932658)
- simplify objectconfig - inline ml_sequence, remove {{}} templating (f48bdf9)
- remove direct ultralytics support, use ONNX via OpenCV DNN (393cb24)
- replace printDebug/printInfo/printError with ZM native logging (03c5a6a)
- replace ~60 individual config vars with 10 grouped hashes (7562d24)
- extract constants, DB, and rules into ZmEventNotification/ package (6dd9e77)