From dc4d35024fa3cd5755a9093c43eb8f7aa28da2e0 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 17:11:35 -0800 Subject: [PATCH 1/7] Add Apple Silicon ZMQ detector for Frigate Moves object detection from ONNX CPU (~117ms/frame) to the apple-silicon-detector running natively on indri via CoreML/Neural Engine (~15ms), communicating with Frigate over ZMQ (tcp://host.minikube.internal:5555). - New ansible role `frigate_detector` with LaunchAgent - Switch Frigate configmap from ONNX to ZMQ detector - Remove detect FPS cap (no longer needed with fast inference) - Update docs and add changelog fragment Co-Authored-By: Claude Opus 4.6 --- ansible/playbooks/indri.yml | 2 + .../roles/frigate_detector/defaults/main.yml | 6 +++ .../roles/frigate_detector/handlers/main.yml | 6 +++ ansible/roles/frigate_detector/tasks/main.yml | 48 +++++++++++++++++++ .../mcquack.eblume.frigate-detector.plist.j2 | 31 ++++++++++++ argocd/manifests/frigate/configmap.yaml | 6 +-- .../changelog.d/frigate-zmq-detector.infra.md | 1 + docs/reference/services/frigate.md | 16 ++++--- 8 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 ansible/roles/frigate_detector/defaults/main.yml create mode 100644 ansible/roles/frigate_detector/handlers/main.yml create mode 100644 ansible/roles/frigate_detector/tasks/main.yml create mode 100644 ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 create mode 100644 docs/changelog.d/frigate-zmq-detector.infra.md diff --git a/ansible/playbooks/indri.yml b/ansible/playbooks/indri.yml index 3042366..f1c7d11 100644 --- a/ansible/playbooks/indri.yml +++ b/ansible/playbooks/indri.yml @@ -175,3 +175,5 @@ tags: jellyfin_metrics - role: caddy tags: caddy + - role: frigate_detector + tags: frigate_detector diff --git a/ansible/roles/frigate_detector/defaults/main.yml b/ansible/roles/frigate_detector/defaults/main.yml new file mode 100644 index 0000000..3070809 --- /dev/null +++ b/ansible/roles/frigate_detector/defaults/main.yml @@ -0,0 +1,6 @@ +--- +frigate_detector_repo: https://github.com/frigate-nvr/apple-silicon-detector.git +frigate_detector_dir: "{{ ansible_env.HOME }}/code/3rd/apple-silicon-detector" +frigate_detector_endpoint: "tcp://*:5555" +frigate_detector_model: AUTO +frigate_detector_log_dir: "{{ ansible_env.HOME }}/Library/Logs" diff --git a/ansible/roles/frigate_detector/handlers/main.yml b/ansible/roles/frigate_detector/handlers/main.yml new file mode 100644 index 0000000..850c66c --- /dev/null +++ b/ansible/roles/frigate_detector/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: Restart frigate-detector + ansible.builtin.shell: | + launchctl unload ~/Library/LaunchAgents/mcquack.eblume.frigate-detector.plist 2>/dev/null || true + launchctl load ~/Library/LaunchAgents/mcquack.eblume.frigate-detector.plist + changed_when: true diff --git a/ansible/roles/frigate_detector/tasks/main.yml b/ansible/roles/frigate_detector/tasks/main.yml new file mode 100644 index 0000000..95e06f1 --- /dev/null +++ b/ansible/roles/frigate_detector/tasks/main.yml @@ -0,0 +1,48 @@ +--- +# Apple Silicon ZMQ detector for Frigate +# Runs natively on macOS, using CoreML / Neural Engine for ~15ms inference. +# Communicates with Frigate via ZMQ over TCP. +# +# ONE-TIME SETUP (before running ansible): +# +# 1. Clone the repo: +# ssh indri 'git clone https://github.com/frigate-nvr/apple-silicon-detector.git ~/code/3rd/apple-silicon-detector' +# +# 2. Install dependencies: +# ssh indri 'cd ~/code/3rd/apple-silicon-detector && make install' +# +# 3. Run ansible to deploy LaunchAgent: +# mise run provision-indri -- --tags frigate_detector + +- name: Verify apple-silicon-detector repo exists + ansible.builtin.stat: + path: "{{ frigate_detector_dir }}/Makefile" + register: frigate_detector_stat + +- name: Fail if apple-silicon-detector not found + ansible.builtin.fail: + msg: | + apple-silicon-detector not found at {{ frigate_detector_dir }}. + Please clone and install first: + ssh indri 'git clone {{ frigate_detector_repo }} {{ frigate_detector_dir }}' + ssh indri 'cd {{ frigate_detector_dir }} && make install' + when: not frigate_detector_stat.stat.exists + +- name: Deploy frigate-detector LaunchAgent plist + ansible.builtin.template: + src: mcquack.eblume.frigate-detector.plist.j2 + dest: ~/Library/LaunchAgents/mcquack.eblume.frigate-detector.plist + mode: '0644' + notify: Restart frigate-detector + +- name: Check if frigate-detector LaunchAgent is loaded + ansible.builtin.command: launchctl list mcquack.eblume.frigate-detector + register: frigate_detector_launchctl_check + changed_when: false + failed_when: false + +- name: Load frigate-detector LaunchAgent if not loaded + ansible.builtin.command: launchctl load ~/Library/LaunchAgents/mcquack.eblume.frigate-detector.plist + when: frigate_detector_launchctl_check.rc != 0 + changed_when: true + failed_when: false diff --git a/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 b/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 new file mode 100644 index 0000000..6ac39c5 --- /dev/null +++ b/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 @@ -0,0 +1,31 @@ + + + + + + Label + mcquack.eblume.frigate-detector + ProgramArguments + + /usr/bin/make + run + + WorkingDirectory + {{ frigate_detector_dir }} + EnvironmentVariables + + ENDPOINT + {{ frigate_detector_endpoint }} + MODEL + {{ frigate_detector_model }} + + RunAtLoad + + KeepAlive + + StandardOutPath + {{ frigate_detector_log_dir }}/mcquack.frigate-detector.out.log + StandardErrorPath + {{ frigate_detector_log_dir }}/mcquack.frigate-detector.err.log + + diff --git a/argocd/manifests/frigate/configmap.yaml b/argocd/manifests/frigate/configmap.yaml index 570f935..b43052d 100644 --- a/argocd/manifests/frigate/configmap.yaml +++ b/argocd/manifests/frigate/configmap.yaml @@ -30,7 +30,6 @@ data: roles: [detect] detect: enabled: true - fps: 2 stationary: max_frames: default: 1500 @@ -51,8 +50,9 @@ data: track: [person, car, dog, cat, bird] detectors: - onnx: - type: onnx + apple_silicon: + type: zmq + endpoint: tcp://host.minikube.internal:5555 model: model_type: yolonas diff --git a/docs/changelog.d/frigate-zmq-detector.infra.md b/docs/changelog.d/frigate-zmq-detector.infra.md new file mode 100644 index 0000000..91519c9 --- /dev/null +++ b/docs/changelog.d/frigate-zmq-detector.infra.md @@ -0,0 +1 @@ +Add Apple Silicon ZMQ detector for Frigate — inference moves from ONNX CPU (~117ms) to CoreML/Neural Engine (~15ms) diff --git a/docs/reference/services/frigate.md b/docs/reference/services/frigate.md index 074b69b..63c7008 100644 --- a/docs/reference/services/frigate.md +++ b/docs/reference/services/frigate.md @@ -27,12 +27,14 @@ Open-source network video recorder (NVR) with object detection. Runs cloud-free ReoLink Camera (GableCam) │ RTSP ▼ -Frigate pod - ├── go2rtc — RTSP restream proxy - ├── FFmpeg — stream decoding - ├── ONNX detector — object detection (YOLO-NAS-s, CPU) - ├── /media/frigate — NFS recordings (sifaka) - └── /db — SQLite (local PVC) +Frigate pod (minikube) + ├── go2rtc — RTSP restream proxy + ├── FFmpeg — stream decoding + ├── ZMQ detector ──tcp://host.minikube.internal:5555──→ apple-silicon-detector + │ ├── CoreML / Neural Engine + │ └── LaunchAgent (mcquack.eblume.frigate-detector) + ├── /media/frigate — NFS recordings (sifaka) + └── /db — SQLite (local PVC) │ └──→ MQTT (Mosquitto) → frigate-notify → ntfy → mobile ``` @@ -47,7 +49,7 @@ Camera credentials are stored in 1Password and synced via [[external-secrets]] t ## Detection -Object detection uses ONNX with a YOLO-NAS-s model running on CPU (ARM64). The model file lives on the NFS recordings volume at `/media/frigate/models/yolo_nas_s.onnx`. +Object detection uses the [apple-silicon-detector](https://github.com/frigate-nvr/apple-silicon-detector), which runs natively on [[indri]] as a LaunchAgent (`mcquack.eblume.frigate-detector`). It communicates with Frigate via ZMQ over TCP (`tcp://host.minikube.internal:5555`), leveraging CoreML and the M1 Neural Engine for ~15ms inference (down from ~117ms with ONNX CPU). A `driveway_entrance` zone is configured for alert filtering — only detections in this zone trigger review alerts. -- 2.50.1 (Apple Git-155) From e5e7228f2becfc155e04c4295ffe19fd7e9be224 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 17:16:44 -0800 Subject: [PATCH 2/7] Use forge mirror for apple-silicon-detector repo Co-Authored-By: Claude Opus 4.6 --- ansible/roles/frigate_detector/defaults/main.yml | 2 +- ansible/roles/frigate_detector/tasks/main.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ansible/roles/frigate_detector/defaults/main.yml b/ansible/roles/frigate_detector/defaults/main.yml index 3070809..8913905 100644 --- a/ansible/roles/frigate_detector/defaults/main.yml +++ b/ansible/roles/frigate_detector/defaults/main.yml @@ -1,5 +1,5 @@ --- -frigate_detector_repo: https://github.com/frigate-nvr/apple-silicon-detector.git +frigate_detector_repo: https://forge.ops.eblu.me/eblume/apple-silicon-detector.git frigate_detector_dir: "{{ ansible_env.HOME }}/code/3rd/apple-silicon-detector" frigate_detector_endpoint: "tcp://*:5555" frigate_detector_model: AUTO diff --git a/ansible/roles/frigate_detector/tasks/main.yml b/ansible/roles/frigate_detector/tasks/main.yml index 95e06f1..948d05b 100644 --- a/ansible/roles/frigate_detector/tasks/main.yml +++ b/ansible/roles/frigate_detector/tasks/main.yml @@ -5,8 +5,8 @@ # # ONE-TIME SETUP (before running ansible): # -# 1. Clone the repo: -# ssh indri 'git clone https://github.com/frigate-nvr/apple-silicon-detector.git ~/code/3rd/apple-silicon-detector' +# 1. Clone the repo (use localhost:3001 - hairpinning doesn't work): +# ssh indri 'git clone http://localhost:3001/eblume/apple-silicon-detector.git ~/code/3rd/apple-silicon-detector' # # 2. Install dependencies: # ssh indri 'cd ~/code/3rd/apple-silicon-detector && make install' -- 2.50.1 (Apple Git-155) From 02d44c35b4c7f463deed327d5d752ddeb68052b8 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 17:21:44 -0800 Subject: [PATCH 3/7] Use uv instead of make/venv for frigate detector Runs the detector script directly via `uv run --with` with inline dependencies, eliminating the need for `make install` and a managed venv. Co-Authored-By: Claude Opus 4.6 --- .../roles/frigate_detector/defaults/main.yml | 2 ++ ansible/roles/frigate_detector/tasks/main.yml | 21 +++++++++----- .../mcquack.eblume.frigate-detector.plist.j2 | 28 +++++++++++++------ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/ansible/roles/frigate_detector/defaults/main.yml b/ansible/roles/frigate_detector/defaults/main.yml index 8913905..71af21d 100644 --- a/ansible/roles/frigate_detector/defaults/main.yml +++ b/ansible/roles/frigate_detector/defaults/main.yml @@ -4,3 +4,5 @@ frigate_detector_dir: "{{ ansible_env.HOME }}/code/3rd/apple-silicon-detector" frigate_detector_endpoint: "tcp://*:5555" frigate_detector_model: AUTO frigate_detector_log_dir: "{{ ansible_env.HOME }}/Library/Logs" +frigate_detector_uv_binary: "{{ ansible_env.HOME }}/.local/share/mise/installs/uv/latest/uv-aarch64-apple-darwin/uv" +frigate_detector_python: "3.12" diff --git a/ansible/roles/frigate_detector/tasks/main.yml b/ansible/roles/frigate_detector/tasks/main.yml index 948d05b..07b5ffc 100644 --- a/ansible/roles/frigate_detector/tasks/main.yml +++ b/ansible/roles/frigate_detector/tasks/main.yml @@ -2,32 +2,39 @@ # Apple Silicon ZMQ detector for Frigate # Runs natively on macOS, using CoreML / Neural Engine for ~15ms inference. # Communicates with Frigate via ZMQ over TCP. +# Dependencies managed inline by uv — no venv or make install needed. # # ONE-TIME SETUP (before running ansible): # # 1. Clone the repo (use localhost:3001 - hairpinning doesn't work): # ssh indri 'git clone http://localhost:3001/eblume/apple-silicon-detector.git ~/code/3rd/apple-silicon-detector' # -# 2. Install dependencies: -# ssh indri 'cd ~/code/3rd/apple-silicon-detector && make install' -# -# 3. Run ansible to deploy LaunchAgent: +# 2. Run ansible to deploy LaunchAgent: # mise run provision-indri -- --tags frigate_detector - name: Verify apple-silicon-detector repo exists ansible.builtin.stat: - path: "{{ frigate_detector_dir }}/Makefile" + path: "{{ frigate_detector_dir }}/detector/zmq_onnx_client.py" register: frigate_detector_stat - name: Fail if apple-silicon-detector not found ansible.builtin.fail: msg: | apple-silicon-detector not found at {{ frigate_detector_dir }}. - Please clone and install first: + Please clone first: ssh indri 'git clone {{ frigate_detector_repo }} {{ frigate_detector_dir }}' - ssh indri 'cd {{ frigate_detector_dir }} && make install' when: not frigate_detector_stat.stat.exists +- name: Verify uv binary exists + ansible.builtin.stat: + path: "{{ frigate_detector_uv_binary }}" + register: frigate_detector_uv_stat + +- name: Fail if uv not found + ansible.builtin.fail: + msg: "uv not found at {{ frigate_detector_uv_binary }}. Install via mise: mise use uv@latest" + when: not frigate_detector_uv_stat.stat.exists + - name: Deploy frigate-detector LaunchAgent plist ansible.builtin.template: src: mcquack.eblume.frigate-detector.plist.j2 diff --git a/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 b/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 index 6ac39c5..87921ac 100644 --- a/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 +++ b/ansible/roles/frigate_detector/templates/mcquack.eblume.frigate-detector.plist.j2 @@ -7,18 +7,30 @@ mcquack.eblume.frigate-detector ProgramArguments - /usr/bin/make + {{ frigate_detector_uv_binary }} run + --python + {{ frigate_detector_python }} + --with + numpy==1.26.* + --with + opencv-python-headless==4.11.0.* + --with + opencv-contrib-python==4.11.0.* + --with + onnxruntime==1.22.* + --with + pyzmq==26.2.* + --with + pydantic==2.10.* + detector/zmq_onnx_client.py + --model + {{ frigate_detector_model }} + --endpoint + {{ frigate_detector_endpoint }} WorkingDirectory {{ frigate_detector_dir }} - EnvironmentVariables - - ENDPOINT - {{ frigate_detector_endpoint }} - MODEL - {{ frigate_detector_model }} - RunAtLoad KeepAlive -- 2.50.1 (Apple Git-155) From 925f7c2d14663ed18381b43e4bda9e936e78295a Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 18:07:35 -0800 Subject: [PATCH 4/7] Switch Frigate model from YOLO-NAS to YOLOv9-t for CoreML compatibility YOLO-NAS has dynamic output shapes incompatible with CoreML EP, and the apple-silicon-detector has no yolonas post-processor. YOLOv9-t works with CoreML and uses the supported yolo-generic model type. Co-Authored-By: Claude Opus 4.6 --- argocd/manifests/frigate/configmap.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/argocd/manifests/frigate/configmap.yaml b/argocd/manifests/frigate/configmap.yaml index b43052d..fb0fbe9 100644 --- a/argocd/manifests/frigate/configmap.yaml +++ b/argocd/manifests/frigate/configmap.yaml @@ -55,12 +55,12 @@ data: endpoint: tcp://host.minikube.internal:5555 model: - model_type: yolonas + model_type: yolo-generic width: 320 height: 320 input_tensor: nchw - input_pixel_format: bgr - path: /media/frigate/models/yolo_nas_s.onnx + input_dtype: float + path: /media/frigate/models/yolov9t.onnx labelmap_path: /labelmap/coco-80.txt record: -- 2.50.1 (Apple Git-155) From 9c2f69adc3a9c097262cfb6f81cccf739bdffa85 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 18:26:16 -0800 Subject: [PATCH 5/7] Update docs to reflect actual ZMQ detector performance (~50-80ms) CoreML runs 468/662 model nodes with the rest on CPU, yielding ~50-80ms inference rather than the initially estimated ~15ms. Co-Authored-By: Claude Opus 4.6 --- docs/changelog.d/frigate-zmq-detector.infra.md | 2 +- docs/reference/services/frigate.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.d/frigate-zmq-detector.infra.md b/docs/changelog.d/frigate-zmq-detector.infra.md index 91519c9..0035dc1 100644 --- a/docs/changelog.d/frigate-zmq-detector.infra.md +++ b/docs/changelog.d/frigate-zmq-detector.infra.md @@ -1 +1 @@ -Add Apple Silicon ZMQ detector for Frigate — inference moves from ONNX CPU (~117ms) to CoreML/Neural Engine (~15ms) +Add Apple Silicon ZMQ detector for Frigate — inference moves from ONNX CPU (~117ms) to CoreML/Neural Engine (~50-80ms) diff --git a/docs/reference/services/frigate.md b/docs/reference/services/frigate.md index 63c7008..492e0ba 100644 --- a/docs/reference/services/frigate.md +++ b/docs/reference/services/frigate.md @@ -49,7 +49,7 @@ Camera credentials are stored in 1Password and synced via [[external-secrets]] t ## Detection -Object detection uses the [apple-silicon-detector](https://github.com/frigate-nvr/apple-silicon-detector), which runs natively on [[indri]] as a LaunchAgent (`mcquack.eblume.frigate-detector`). It communicates with Frigate via ZMQ over TCP (`tcp://host.minikube.internal:5555`), leveraging CoreML and the M1 Neural Engine for ~15ms inference (down from ~117ms with ONNX CPU). +Object detection uses the [apple-silicon-detector](https://github.com/frigate-nvr/apple-silicon-detector) with a YOLOv9-t model (`yolo-generic`, 320x320), running natively on [[indri]] as a LaunchAgent (`mcquack.eblume.frigate-detector`). It communicates with Frigate via ZMQ over TCP (`tcp://host.minikube.internal:5555`), using CoreML with partial Neural Engine acceleration (~50-80ms inference, down from ~117ms with in-pod ONNX CPU). A `driveway_entrance` zone is configured for alert filtering — only detections in this zone trigger review alerts. -- 2.50.1 (Apple Git-155) From fd4692a02a1b14ea0d8e9585a80d499bee4971b2 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 19:02:20 -0800 Subject: [PATCH 6/7] Add driveway zone, switch model to YOLOv9-m for better detection - Add driveway zone from UI config with review detection filtering - Upgrade model from YOLOv9-t (7.7M params) to YOLOv9-m (51M params) for improved nighttime/low-light detection capability - YOLOv9-t produced max 5.7% confidence on nighttime IR footage Co-Authored-By: Claude Opus 4.6 --- argocd/manifests/frigate/configmap.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/argocd/manifests/frigate/configmap.yaml b/argocd/manifests/frigate/configmap.yaml index fb0fbe9..9c96008 100644 --- a/argocd/manifests/frigate/configmap.yaml +++ b/argocd/manifests/frigate/configmap.yaml @@ -41,11 +41,17 @@ data: driveway_entrance: coordinates: 0.85,0.366,0.735,0.344,0.681,0.2,0.795,0.255 objects: [car, dog, person] + driveway: + coordinates: 0.767,0.25,0.58,0.2,0.218,0.25,0.128,0.296,0.003,0.565,0.001,0.992,0.826,0.992,0.897,0.665,0.869,0.608,0.788,0.354 review: alerts: labels: [person, car] required_zones: - driveway_entrance + detections: + required_zones: + - driveway + - driveway_entrance objects: track: [person, car, dog, cat, bird] @@ -60,7 +66,7 @@ data: height: 320 input_tensor: nchw input_dtype: float - path: /media/frigate/models/yolov9t.onnx + path: /media/frigate/models/yolov9m.onnx labelmap_path: /labelmap/coco-80.txt record: -- 2.50.1 (Apple Git-155) From 8b7005bec3bcc26c55a95aeb4ffd29d1eb758f2d Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Tue, 17 Feb 2026 19:03:07 -0800 Subject: [PATCH 7/7] Update docs for YOLOv9-m model and driveway zone Co-Authored-By: Claude Opus 4.6 --- docs/changelog.d/frigate-zmq-detector.infra.md | 2 +- docs/reference/services/frigate.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.d/frigate-zmq-detector.infra.md b/docs/changelog.d/frigate-zmq-detector.infra.md index 0035dc1..2bb35b2 100644 --- a/docs/changelog.d/frigate-zmq-detector.infra.md +++ b/docs/changelog.d/frigate-zmq-detector.infra.md @@ -1 +1 @@ -Add Apple Silicon ZMQ detector for Frigate — inference moves from ONNX CPU (~117ms) to CoreML/Neural Engine (~50-80ms) +Add Apple Silicon ZMQ detector for Frigate — inference moves from in-pod ONNX CPU to CoreML on indri via ZMQ, using YOLOv9-m model diff --git a/docs/reference/services/frigate.md b/docs/reference/services/frigate.md index 492e0ba..edd93af 100644 --- a/docs/reference/services/frigate.md +++ b/docs/reference/services/frigate.md @@ -49,9 +49,9 @@ Camera credentials are stored in 1Password and synced via [[external-secrets]] t ## Detection -Object detection uses the [apple-silicon-detector](https://github.com/frigate-nvr/apple-silicon-detector) with a YOLOv9-t model (`yolo-generic`, 320x320), running natively on [[indri]] as a LaunchAgent (`mcquack.eblume.frigate-detector`). It communicates with Frigate via ZMQ over TCP (`tcp://host.minikube.internal:5555`), using CoreML with partial Neural Engine acceleration (~50-80ms inference, down from ~117ms with in-pod ONNX CPU). +Object detection uses the [apple-silicon-detector](https://github.com/frigate-nvr/apple-silicon-detector) with a YOLOv9-m model (`yolo-generic`, 320x320), running natively on [[indri]] as a LaunchAgent (`mcquack.eblume.frigate-detector`). It communicates with Frigate via ZMQ over TCP (`tcp://host.minikube.internal:5555`), using CoreML with partial Neural Engine acceleration (~100-170ms inference). Model ONNX files are stored on the NFS volume at `/media/frigate/models/`. -A `driveway_entrance` zone is configured for alert filtering — only detections in this zone trigger review alerts. +Two zones are configured: `driveway_entrance` (triggers review alerts for person/car) and `driveway` (triggers review detections). ## Retention -- 2.50.1 (Apple Git-155)