AI video analytics for your cameras – on your own hardware
VisionGuard analyses network camera streams live on your GPU: it detects and tracks people, animals and vehicles, recognises faces, licence plates and pets, remembers where your things are – and reacts with rules, push notifications, MQTT or an MCP server for AI agents. No continuous recording, no cloud required.
Screenshots use the built-in demo data (no real people). The interface is available in English and German – more languages can be added with plain translation files.
Everything happens locally
One docker compose up starts the whole stack: restreaming, GPU worker, backend, database,
MQTT broker and the web interface. Built for up to 16 cameras on a single GPU.
Live detection
YOLO11 on the GPU, batched across all cameras, ByteTrack tracking, zones and overlays in the browser via WebRTC.
Faces, plates & pets
InsightFace, fast-alpr and DINOv2. Unknown subjects get an ID, can be named, merged in bulk – and a nightly run cleans up fragments.
“Where is my remote?”
Open-vocabulary item tracking (YOLOE) with location hints like “probably on the table” and a daily change log.
Rules & actions
Zone, class, identity, posture, gesture, time or sensor triggers with conditions → snapshot, clip, push, MQTT, webhook, PTZ or TV.
Push & emergencies
ntfy or Pushover with images, fall detection repeated until acknowledged, “please confirm” questions that teach the system.
Time machine
A searchable image memory (SigLIP 2 + pgvector, no video): “red box in the hallway” returns the matching time ranges.
Ask the camera
A local vision model answers questions about the current image – and powers virtual sensors like “is the window open?”.
PTZ & TV
ONVIF pan/tilt with patrols and subject following; show a camera full screen on your DLNA TV when someone is at the door.
Pets, presence & health
Pet diary (food, water, litter box), who-is-where across cameras, and camera health checks (covered, blurred, moved).
Multilingual
English and German out of the box – interface per browser, notifications, reports and AI-agent answers in the system language. New languages need only translation files.
Home Assistant & MQTT
Events, per-camera counters, sensors and notifications on MQTT (read-only from outside) – plus webhooks and a REST API with scoped API keys.
Secure by default
Camera credentials never leave the backend, media goes out only as signed, expiring links, API keys have read/write scopes and login is rate-limited.
Screenshots
A tour through the web interface, recorded with the demo data that ships with the frontend. Click an image to enlarge it.
Built for AI agents
The mcp service exposes VisionGuard as a Model Context Protocol server (Streamable HTTP).
Ask your assistant “Where are my keys?”, “What changed since this morning?” or “Is someone at the door?”.
Access is protected by API keys with read/write scopes; media goes out as signed, expiring links.
find_objectwhat_changedwho_is_whereget_camera_snapshot
search_historyask_cameralist_alertsget_daily_report
list_sensorsget_pet_diaryptz_move_toshow_on_tv
+ 11 more
# Claude Code claude mcp add --transport http visionguard \ http://localhost:8080/mcp \ --header "Authorization: Bearer $VG_API_KEY" # any client with a JSON config { "mcpServers": { "visionguard": { "type": "http", "url": "https://vg.example.org/mcp", "headers": { "Authorization": "Bearer vgt_…" } } } }
Get started
You need Docker with Compose v2 and an NVIDIA GPU with the NVIDIA Container Toolkit (driver ≥ 550, CUDA 12.4). The demo profile starts two simulated cameras so you can try everything right away.
- No continuous recording – clips come from a RAM ring buffer, only when a rule fires.
- One connection per camera – go2rtc restreams to the browser and the GPU worker.
- Home Assistant friendly – events, counters and sensors via MQTT (read-only from outside).
- Measured – 16 cameras × 5 fps at 20–35 % load on an RTX 4080 Laptop GPU.
# clone and configure git clone https://github.com/mupf-dev/vision-guard.git cd vision-guard cp .env.example .env # set ADMIN_PASSWORD and SECRET_KEY=$(openssl rand -hex 32) # demo videos for the simulated cameras ./testcam/download-videos.sh docker compose up -d --build # → http://localhost:8080
Cameras (RTSP) ──▶ go2rtc ──WebRTC/MSE──▶ Browser (React UI, nginx)
│ ▲ REST + WebSocket
│ RTSP (sub stream) │
▼ │
worker (GPU) ──MQTT──▶ mosquitto ◀──▶ backend (FastAPI) ──▶ PostgreSQL (pgvector)
YOLO11, ByteTrack, ▲ rules, events, media volume
face/plate/pet, │ GPU lease identities, items, (snapshots/clips)
YOLOE items, pose, │ notifications, auth
RAM ring buffer for clips │ ▲
vlm (vision model) │ REST
mcp (AI agents, /mcp)
Privacy by design
- Runs on your hardware. Cloud models are opt-in per camera; nothing leaves your network by default.
- Camera credentials stay in the backend – masked in the API, never passed to the worker, never logged.
- Face recognition is biometric data (GDPR Art. 9): switch identification off per camera and set retention periods.
- Re-identification across cameras is kept in memory only and expires automatically.
Licence
VisionGuard is free software under the GNU AGPL v3.0.
Third-party models keep their own licences: Ultralytics YOLO11 is AGPL-3.0, the InsightFace
buffalo_l weights are for non-commercial use only, the demo videos are CC BY 4.0 (Intel IoT DevKit).