Why Frigate Is Worth the Setup Time
Most consumer security camera systems come with a catch: your footage lives on someone else’s server, your data passes through third-party clouds, and your subscription fee climbs every year. Frigate cuts through all of that. It runs entirely on your own hardware, processes video locally, and uses a real-time object detection model to distinguish between a person walking through your yard and a tree branch moving in the wind. That difference matters far more than it sounds when you’re getting pushed notifications at 3am.
Frigate is an open-source Network Video Recorder (NVR) built specifically for Home Assistant integration, though it works independently too. It uses Google’s Coral TPU (or your CPU/GPU as a fallback) to run TensorFlow Lite object detection, meaning it can identify people, cars, animals, and other objects without sending a single frame to the internet. The software stores clips, generates snapshots, and publishes detection events over MQTT – all from a Docker container you control.
The setup involves more moving parts than a plug-and-play cloud camera system, but what you get in return is a fully local, infinitely customizable surveillance stack.

What You Need Before You Start
Before installing anything, get your environment sorted. Frigate runs best on a Linux host – Ubuntu 22.04 or Debian 12 are solid choices. You need Docker and Docker Compose installed, at least 4GB of RAM (8GB is more comfortable if you’re running multiple cameras), and a reasonably modern CPU. A dedicated GPU or a Google Coral USB Accelerator will dramatically improve detection performance, but Frigate can run on CPU alone for one or two cameras if your expectations are calibrated accordingly. If you’re already running a self-hosted stack with tools like Dashy as your homepage dashboard, you likely already have a suitable host machine ready.
Your cameras need to support RTSP streams. Most modern IP cameras do – check your camera’s documentation or admin panel for an RTSP URL. ONVIF-compatible cameras are ideal. You’ll also want to know your camera’s substream URL if it has one, because Frigate uses a low-resolution stream for detection and a high-resolution stream for recording. Mixing those up wastes processing cycles and causes missed detections. Write down both URLs before you open a config file.
On the storage side, decide where your recordings will live. Frigate expects a /media/frigate mount point by default, and it will fill that space. A dedicated drive or partition is a cleaner approach than sharing your OS disk. For reference, one 1080p camera recording motion clips continuously can generate several gigabytes per day depending on activity level. Plan accordingly, and set Frigate’s retention rules from the start rather than discovering a full disk two weeks in.
Installing and Configuring Frigate
Start with a docker-compose.yml file. Pull the official Frigate image – ghcr.io/blakeblackshear/frigate:stable – and map the ports: 5000 for the web UI, 8554 for RTSP restreaming, and 8555 for WebRTC. Mount your config directory and your media storage. If you’re using a Coral USB Accelerator, pass the device through with a devices entry pointing to /dev/bus/usb. For GPU acceleration using NVIDIA, you’ll need the NVIDIA container toolkit installed and the runtime: nvidia option set in your compose file. A minimal compose file looks like this:
- Image:
ghcr.io/blakeblackshear/frigate:stable - Privileged mode: required for hardware access
- Volumes: config folder, media folder, and optionally
/dev/shmsized to at least 67MB per camera - Ports: 5000 (UI), 8554 (RTSP), 8555 (WebRTC)
- Environment: set
FRIGATE_RTSP_PASSWORDif your streams need credentials

The real work happens in config.yml. At minimum, you need a cameras block, a detectors block, and a record block. Under detectors, set the type to cpu, edgetpu (for Coral), or tensorrt (for NVIDIA). Under each camera, define your ffmpeg inputs – one path for your main high-resolution stream, one for your detect substream. Set the detect resolution to match your substream (commonly 640×480 or 1280×720). Then add an objects block specifying what to track: person, car, dog, or whatever matters for your use case. Minimum score thresholds around 0.5 to 0.6 filter most false positives without being so strict that real detections get skipped.
Zones are one of Frigate’s more useful features and are worth setting up immediately. A zone is a polygon you draw over specific regions of the camera frame – your driveway, the front door area, the sidewalk edge. You can configure alerts to only fire when a detected object enters a specific zone, which eliminates most false triggers caused by activity at the edges of frame. Draw zones by pulling up the camera in the Frigate UI, using the mask and zone editor to click coordinates, and then pasting those coordinates into your config. It takes ten minutes per camera and saves hours of notification fatigue.
Connecting to Home Assistant and Hardening the Setup
Frigate publishes detection events to MQTT topics. If you’re running Home Assistant with the MQTT integration, adding the Frigate integration from HACS (Home Assistant Community Store) gives you camera entities, binary sensors per zone, and the ability to trigger automations on specific object detections. The integration creates a frigate/events topic that Home Assistant listens to, so you can build an automation that, for example, sends a snapshot to your phone only when a person – not a car or animal – is detected in your front door zone after sunset. That level of specificity is not something any subscription-based system offers out of the box.
On the security side, do not expose Frigate’s web UI directly to the internet. If you need remote access, route it through a VPN (WireGuard is the standard recommendation) or a reverse proxy with authentication in front of it. Frigate does not have built-in user authentication by default on the web interface – that is a deliberate design choice since it assumes you’re running on a trusted local network. Exposing port 5000 to the public internet without protection is a real risk. Use nginx or Caddy as a reverse proxy and add HTTP basic auth at minimum, or better yet, keep it VPN-only.
For the MQTT broker, Mosquitto running in its own Docker container is the standard pairing. Configure it with a password file and disable anonymous access. Frigate’s MQTT config block accepts a username and password directly. It’s a five-minute step that closes an obvious vector most people skip because it feels like optional complexity.

Once everything is running, open the Frigate UI and go to the debug view for each camera. You’ll see bounding boxes drawn in real time around detected objects, along with the confidence score for each detection. If you’re seeing too many false positives on a specific object type, raise the minimum score threshold in your config. If detections are being missed, check that your detect stream resolution matches what Frigate expects – a mismatch here is the most common cause of a detection model that looks like it’s not working at all, when the actual problem is that it’s scanning the wrong frame dimensions.





