Add self-hosted camera dashboard using go2rtc + WebRTC#1
Open
dlfoster311 wants to merge 12 commits intomainfrom
Open
Add self-hosted camera dashboard using go2rtc + WebRTC#1dlfoster311 wants to merge 12 commits intomainfrom
dlfoster311 wants to merge 12 commits intomainfrom
Conversation
Adds a cameras/ page that streams Wyze RTSP feeds directly in the browser via go2rtc — no Wyze cloud, no subscription required. Features: - Live WebRTC streams from go2rtc (converts RTSP → WebRTC locally) - 1×1, 2×2, 1+3 grid layouts - Per-camera connect/disconnect, mute, and fullscreen controls - Settings panel to configure go2rtc host and camera list (localStorage) - Setup guide with Frigate NVR recommendation and step-by-step go2rtc setup - Dark theme, mobile-responsive https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Configured for 2 Wyze cameras with RTSP. Addresses the specific Wyze pain points: accurate cat/dog/person/car detection via local AI (no cloud), motion masks for wind chimes and shadows, zone-based alerting so the street doesn't trigger, and configurable confidence thresholds to cut false positives. Includes: - docker-compose.yml with sensible defaults, hardware accel comments - config/config.yml with go2rtc stream setup, per-object score filters, motion threshold tuning, snapshot/recording retention, and zone examples User needs to fill in camera IPs and draw masks/zones in the Frigate UI. https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Wires up the full notification pipeline: - mosquitto: MQTT broker that Frigate publishes detection events to - notifier: Python service that reads MQTT events and sends push notifications to ntfy (iOS/Android app, free) Notification rules (all configurable in docker-compose env vars): - Only alert on specified objects (default: person, car — not cat/dog) - Minimum AI confidence threshold (default: 75%) - Only fire when object is inside a defined zone (ignores the street) - Per-camera+object cooldown to prevent notification spam (default: 2min) - Links back to the Frigate event in the UI on tap https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Full feature stack:
Face recognition (DeepStack + Double-Take)
- DeepStack runs the AI face recognition model locally
- Double-Take orchestrates: watches Frigate person events, sends
snapshots to DeepStack, publishes results to MQTT
- Known family members → quiet "arrived home" notification
- Unrecognized face → urgent "Stranger at [camera]" alert
- Train faces via the Double-Take UI at http://localhost:3000
HomeKit + Google Home (Scrypted)
- Native iOS Home app, Apple Watch, and Siri camera access
- "Hey Siri, show me the front door" works
- Add via Scrypted UI → Frigate NVR plugin → HomeKit plugin
Self-hosted ntfy
- Push notifications now served locally (no cloud dependency)
- Snapshot images embed in notifications (ntfy fetches directly
from Frigate on the same Docker network)
- Subscribe via Tailscale IP so it works away from home too
Tailscale VPN (tailscale-setup.sh)
- Secure, encrypted access to all services from iPhone/Android
- No port forwarding, no public exposure
- Run once on host, install app on phones, done
Notifier updates
- Routes persons through Double-Take instead of generic Frigate alerts
- Dedicated package delivery notification ("Package delivered at...")
- Family vs stranger alert logic with configurable KNOWN_PEOPLE
https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Replaces manual config editing with an interactive setup wizard: - Asks 8 questions (camera IPs, RTSP password, names, GPU, timezone) - Writes a .env file — docker-compose reads it automatically, no YAML editing - Camera IPs/credentials flow through FRIGATE_* env vars into config.yml - Applies hardware acceleration preset via sed (default: CPU-only safe mode) - Runs docker compose pull + up -d - Installs Tailscale and updates .env with the Tailscale IP - Restarts ntfy and notifier with the correct external URL - Prints all service URLs and next steps at the end Also: - Updated for 4 cameras (front_door, backyard, front_yard, side_yard) - shm_size raised to 512mb (recommended for 4 cameras) - num_threads raised to 4 - .gitignore added to exclude .env (contains credentials) - double-take/config.yml pre-populated with all 4 camera names - All⚠️ manual-edit markers removed from docker-compose.yml and config.yml https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
- setup.sh now asks per-camera whether it's pan/tilt - PTZ cameras get ONVIF + autotracking config blocks auto-generated (Wyze Pan Cam uses ONVIF port 2020, reuses RTSP credentials) - Frigate will physically rotate the camera to follow detected people - calibrate_on_startup: true automatically finds pan/tilt limits - Confirm screen shows "(pan/tilt + autotracking)" for PTZ cameras - Final summary prints Wyze conflict warning + home preset instructions - PTZ flags saved to .env for reference https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Frigate listens to camera microphones and fires MQTT events on specific sounds. The notifier subscribes to frigate/+/audio/+ and routes them to ntfy. Supported and wired up: glass_breaking → urgent alert "Glass breaking" screaming → urgent alert "Screaming detected" fire_alarm → urgent alert "Fire alarm" smoke_detector_alarm → urgent alert "Smoke alarm" bark → default alert "Dog barking" speech, motorcycle → low-priority (can filter out in future) Note: gunshot detection is not in Frigate's built-in audio model. The default model covers the above list only. Two-way audio works via Scrypted + HomeKit (Apple Home app intercom). Frigate itself doesn't implement audio talk-back. https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Default ntfy cache_duration is 12h, which means notifications disappear from history quickly. 168h (7 days) keeps a full week of alert history visible in the ntfy app and web UI. https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Daily digest (new service: digest/): - Runs every morning at 8am (configurable via DIGEST_HOUR in .env) - Fetches all of yesterday's Frigate events via API - Sends an ntfy notification: "14 people · 3 cars · 1 package" - Attaches a ghost composite image: all person snapshots overlaid with transparency so every position shows at once (the "multiple people" effect) - Falls back to a thumbnail grid if fewer than 3 person detections - ntfy attachment expiry set to 72h so images are accessible for 3 days Quiet hours (notifier): - New QUIET_HOURS_START / QUIET_HOURS_END env vars (default: 10pm–7am) - During quiet hours: car, package, family arrival, bark alerts are suppressed - Strangers, glass breaking, screaming, fire/smoke alarms always fire - Set both to the same value to disable quiet hours entirely https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
License plate recognition (new service: lpr/):
- Listens for car events via MQTT; on event end, downloads the snapshot
and posts to Plate Recognizer API (free tier: 2,500 reads/month)
- Sends ntfy notification: "ABC-1234 · White Sedan · Ontario" + snapshot
- Per-plate cooldown (default 1hr) prevents repeat alerts for parked cars
- Appends every detected plate to /data/plates.log for later review
- Gracefully disabled if PLATE_RECOGNIZER_TOKEN is not set in .env
Spatial awareness (notifier):
- Reads each event's bounding box height as a fraction of the frame
- Classifies distance: "close" (>55%), "mid" (25-55%), "far" (<25%)
- Proximity phrase appended to notification body:
"Stranger — right at the camera" vs "Stranger — far edge of view"
- Close detections bump priority one level (close stranger → max urgency)
- Thresholds tunable via PROXIMITY_CLOSE / PROXIMITY_MID in .env
Twin composite / pan cameras (digest):
- Replace semi-transparent ghost with full-opacity twin effect:
crops each person's bounding box region at 100% opacity and pastes
onto a base frame — literally looks like multiple people in yard
- Deduplicates positions that overlap (15% threshold) so twins spread out
- Add TWIN_CAMERAS env var: only list static cameras in the composite
(exclude PTZ/pan cameras whose background shifts between shots)
https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
New service (species/): - Subscribes to Frigate MQTT events for configurable animal labels (bird, cat, dog, deer, bear, raccoon, fox, squirrel by default) - On event end, downloads the cropped animal snapshot from Frigate - Sends to iNaturalist computer vision API for species identification - The iNat model is trained on tens of millions of wildlife photos and covers birds, mammals, reptiles, insects, amphibians — all of nature - Sends ntfy notification: "Northern Cardinal at Backyard" with the snapshot attached and scientific name in the body - 30-minute per-species cooldown so you're not spammed when the same bird hangs out at the feeder all morning - Logs every sighting to /data/sightings.log with timestamp + confidence - Gracefully disabled if INAT_TOKEN is not set in .env Optional accuracy improvement: set INAT_LAT + INAT_LNG in .env so the model can use local species range data to pick between similar-looking birds/animals (e.g. Cooper's Hawk vs Sharp-shinned Hawk) https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Explains that "bash is not recognized" on Windows means bash isn't in PATH, and gives two options: Git Bash (quickest) or WSL (recommended). https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a cameras/ page that streams Wyze RTSP feeds directly in the
browser via go2rtc — no Wyze cloud, no subscription required.
Features:
https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz