Viseron

Self-hosted NVR with local AI object detection

Video Surveillance ★ 3.5k stars Medium setup MIT

Viseron is a self-hosted, local-only network video recorder with built-in object detection and face recognition. It is designed to keep all processing on your own hardware without cloud dependencies.

Key features

  • Local AI object detection
  • Face recognition
  • Hardware acceleration support
  • Cloud-free operation

Pros & cons

Strengths

  • Fully local processing
  • Supports Coral and GPU acceleration

Trade-offs

  • Configuration via YAML
  • Resource intensive with AI

Viseron replaces

Last reviewed Sep 13, 2026 · 876 words

Viseron is the NVR to run when you want Frigate's local object detection but do not want Home Assistant at the centre of your camera system. It records, detects people and cars, recognises faces, and reads number plates on your own hardware, with no cloud account anywhere in the chain. It needs about 2 GB of RAM before you add a detector and is configured through one YAML file. That file is both its strength and the reason it sits at 3,477 stars while Frigate has a following many times larger.

One YAML, structured by component

Everything in Viseron is a component that you enable and configure, and cameras are declared once and referenced by every other component. The minimal config for one camera with CPU detection looks like this:

ffmpeg:
  camera:
    front_door:
      host: 192.168.1.50
      port: 554
      path: /stream1
      username: viewer
      password: change-me
      substream:
        port: 554
        path: /stream2
        width: 640
        height: 360

darknet:
  object_detector:
    cameras:
      front_door:
        fps: 1
        labels:
          - label: person
            confidence: 0.7
            trigger_recorder: true

nvr:
  front_door:

Two habits carry over from every other NVR: run detection on the substream at 1 to 2 fps and record the main stream, and start with one label at a high confidence before adding cars, cats, and packages. Viseron's web UI on port 8888 shows live feeds and recordings but the config is edited in the file; there is no settings page that writes YAML for you, and that is the configuration cost the catalogue is honest about.

CPU handles two cameras; past that, buy a Coral

The Darknet detector on a modern x86 CPU manages 2 or 3 cameras at 1 fps before it starts stealing cycles from recording. Beyond that the answer is an accelerator. Viseron's edgetpu component drives a Google Coral (USB or M.2) and handles a dozen cameras with room to spare; the CUDA image variants use an NVIDIA GPU for both detection and decoding, and there are VAAPI-capable builds for Intel integrated graphics. The project publishes separate image tags per architecture and accelerator, so pick deliberately: the plain roflcoopter/viseron tag on a box with a Coral plugged in will not use it until you switch to a tag and component that do. Pass the device through in compose:

services:
  viseron:
    image: roflcoopter/viseron:latest
    devices:
      - /dev/bus/usb:/dev/bus/usb
      - /dev/dri:/dev/dri
    volumes:
      - ./config:/config
      - /srv/cctv:/recordings
    ports:
      - "8888:8888"
    restart: unless-stopped

With a Coral and 4 cameras the whole thing settles around the 2 GB minimum; with the CUDA image and face recognition on, plan for 3 to 4 GB. Those are homelab observations, not published figures.

Face and plate recognition are built in, not bolted on

This is where Viseron pulls ahead of Frigate for some users. Face recognition is a first-class component: point it at a folder of images per person and it labels detected faces on events. Number-plate recognition works the same way. Frigate users get equivalent results by running Double Take and a separate recognition service alongside; Viseron ships it in one container. The trade-off is that recognition is far more sensitive to camera placement and lighting than object detection, so treat it as a nice-to-have on the doorbell camera rather than the reason to buy 6 cameras.

MQTT is the integration, and it is optional

Viseron publishes events, snapshots, and camera state over MQTT and supports Home Assistant's discovery convention, so Home Assistant picks it up as sensors and cameras without a custom integration. The important word is optional. Frigate has a first-party HA integration and increasingly assumes you have it; Viseron works exactly as well with no MQTT broker at all, which is the whole reason a standalone-NVR person picks it. If you want to put it behind SSO, its web UI supports a built-in login, and the usual reverse proxy with forward auth works in front of it.

When Frigate is the safer pick

Bigger community, more detector backends, a live-restreaming layer, a settings UI that keeps growing, and a proper HA integration. If your house already runs on Home Assistant, or you expect to lean on forum answers at 11 pm when a camera drops, Frigate is the lower-risk choice and the rest of the video surveillance category will tell you the same. Viseron wins when you want one container, one YAML, built-in recognition, and no obligation to run anything else. ZoneMinder remains the answer only if you need a decade of plugin history and can live without modern detection.

What I'd do

Viseron for a 2-to-6 camera house that does not run Home Assistant, on a small x86 box with a USB Coral and a dedicated recordings disk with a retention of 14 days. One camera, one label, one component at a time until the events look right, then add faces on the door camera only. Back up the config directory; the recordings are replaceable, the YAML you tuned over three evenings is not. If Home Assistant is already the hub, take Frigate instead and do not look back.

Compare Viseron

17 head-to-head comparisons.

Similar video surveillance apps