VibeNVR – open-source self-hosted NVR with native MQTT + Home Assistant auto-discovery (v1.28)

Hi everyone!

I wanted to share VibeNVR, an open-source self-hosted NVR I’ve been building for IP cameras. The v1.28.x release introduces native MQTT integration with Home Assistant auto-discovery, which I think a lot of people here will find useful.

What it does

VibeNVR runs 100% locally via Docker Compose — no cloud, no subscription, no vendor lock-in. It connects to IP cameras via RTSP and ONVIF, records continuously or on motion/AI events, and now publishes everything to HA automatically.

Home Assistant integration (v1.28)

  • Native MQTT with auto-discovery: cameras, motion events and AI detections are automatically exposed as Home Assistant entities — no manual YAML configuration needed. Just point VibeNVR at your MQTT broker and entities appear.
  • Works alongside your existing HA setup, cameras remain independent

AI detection

  • Switch between YOLOv8 (high accuracy) or MobileNet SSD (faster, lighter) at runtime
  • Google Coral TPU supported as singleton inference engine
  • Lean Mode: no AI accelerator needed, runs on standard hardware
  • Universal AI Master Switch: disable TFLite entirely to free memory, cameras auto-fallback to OpenCV motion detection

Other highlights

  • ONVIF auto-discovery for compatible cameras (Tapo, Reolink, Hikvision, Dahua tested)
  • Dual-stream support: sub-stream for live view (~80% less CPU), main stream for recording
  • Timeline with motion/AI event filtering
  • RBAC with viewer/admin isolation
  • Built with Python + FastAPI + React

Links

Happy to answer any questions or hear feedback from the HA community!

Update: v1.28.7 just released

For anyone following this thread, v1.28.7 is out with a focus on security and access control — some things particularly relevant for Home Assistant users:

Group-Based RBAC – you can now assign different capability sets to different user groups dynamically. Viewer roles are fully isolated from admin actions. This is useful if you want family members or guests to see camera feeds but not touch settings.

Log redaction – tokens and passwords are now automatically masked in logs system-wide.

Hardened security – PyAV pre-flight checks, stronger SSRF and Path Traversal protections.

Per-camera retention policies – Custom Days mode per camera, storage dashboard with precise capacity estimates (down to 0.01 GB).

Full changelog: Release v1.28.7 · spupuz/VibeNVR · GitHub

Happy to answer any questions from the HA community!

The main issue I am seeing here is that despite being one of the newer nvr projects, its still starting out with / revolves around the Google Coral TPU, something that has always been nearly impossible to find, especially outside developed markets, not really that affordable either when can be found in those developing markets, and most importantly, really old and EOL by Google themselves, so it will be even harder to get now.

Who is this project really for besides yourself? The limited number of old timers from certain markets that manage to get their hands on a Coral TPU? And the rest stuck with CPU only?

Yes I am being harsh, but you people need to give up on all these old stuff that no one else can benefit from anymore, simply because there is no way to get them in our hands. This is a newer project, not something created during the era of the Google Coral TPU.

Aliexpress?

Good afternoon.
I’ve brought this service up to my frigate location, but I can’t figure out how to send a video stream and photo frames.
I set up MQTT and got:

{
"state_topic": "vibenvr/3/motion",
  "availability_topic": "vibenvr/3/status",
  "payload_on": "ON",
  "payload_off": "OFF",
  "device_class": "motion",
  "unique_id": "vibenvr_3_motion",
  "device": {
    "identifiers": [
      "vibenvr_camera_3"
    ],
    "model": "VibeNVR Camera",
    "manufacturer": "VibeNVR",
    "name": "Game"
  },
  "name": "Game Motion"
}

The object was created, but without the video stream.
Tell me what I’m doing wrong.

Добрый день.
Я поднял данный сервис у себя в место frigate, но не могу понять как отправлять видео поток и фото кадры.
Я настроил MQTT и получил:

{
  "state_topic": "vibenvr/3/motion",
  "availability_topic": "vibenvr/3/status",
  "payload_on": "ON",
  "payload_off": "OFF",
  "device_class": "motion",
  "unique_id": "vibenvr_3_motion",
  "device": {
    "identifiers": [
      "vibenvr_camera_3"
    ],
    "model": "VibeNVR Camera",
    "manufacturer": "VibeNVR",
    "name": "Game"
  },
  "name": "Game Motion"
}

Объект создался, но без видеопотока.
Подскажите что я делаю не так.