From 5f966de322dcc079ceb24e449578ec0182b4cbd2 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Tue, 21 Jul 2026 17:25:35 -0500 Subject: [PATCH] add config overrides section --- docs/docs/configuration/advanced/reference.md | 2 + docs/docs/configuration/config.md | 2 +- docs/docs/configuration/config_overrides.md | 244 ++++++++++++++++++ docs/sidebars.ts | 1 + 4 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 docs/docs/configuration/config_overrides.md diff --git a/docs/docs/configuration/advanced/reference.md b/docs/docs/configuration/advanced/reference.md index 827be1aa94..e70eeeca83 100644 --- a/docs/docs/configuration/advanced/reference.md +++ b/docs/docs/configuration/advanced/reference.md @@ -11,6 +11,8 @@ It is not recommended to copy this full configuration file. Only specify values ::: +Sections marked `# NOTE: Can be overridden at the camera level` can be set globally and then adjusted per camera. See [Global and Camera-Level Configuration](../config_overrides.md) for how that works. + ```yaml mqtt: # Optional: Enable mqtt server (default: shown below) diff --git a/docs/docs/configuration/config.md b/docs/docs/configuration/config.md index 971de7e84b..76458e4d36 100644 --- a/docs/docs/configuration/config.md +++ b/docs/docs/configuration/config.md @@ -20,7 +20,7 @@ Settings are organized into two scopes: - **Global configuration**: values under apply to every camera by default. This is where you set the baseline behavior for object detection, recording, snapshots, motion, and so on. - **Camera configuration**: values under apply to a single camera. Use the camera selector button at the top of these pages to choose which camera you are editing. -When a camera-level section is left untouched, the camera simply inherits the global values. Changing a value on a camera page **overrides** the global value for that camera only: the global setting and every other camera are unaffected. This mirrors how the YAML works, where a value set under `cameras.` takes precedence over the same value set at the top level. +When a camera-level section is left untouched, the camera simply inherits the global values. Changing a value on a camera page **overrides** the global value for that camera only: the global setting and every other camera are unaffected. This mirrors how the YAML works, where a value set under `cameras.` takes precedence over the same value set at the top level. See [Global and Camera-Level Configuration](./config_overrides.md) for the full details, including how lists and maps are handled and which settings must be enabled globally first. To undo an override and go back to inheriting from the parent scope, use the reset button at the bottom of the section: diff --git a/docs/docs/configuration/config_overrides.md b/docs/docs/configuration/config_overrides.md new file mode 100644 index 0000000000..61aa545f44 --- /dev/null +++ b/docs/docs/configuration/config_overrides.md @@ -0,0 +1,244 @@ +--- +id: config_overrides +title: Global and Camera-Level Configuration +--- + +import ConfigTabs from "@site/src/components/ConfigTabs"; +import TabItem from "@theme/TabItem"; +import NavPath from "@site/src/components/NavPath"; + +Most of Frigate's configuration can be set once for all cameras and then adjusted for individual cameras. The global value acts as the default for every camera, and any camera can override it. + +This page explains how that inheritance works. For a tour of the Settings UI itself, see [Frigate Configuration](./config.md). + +## The basics + +Set a value globally and every camera uses it. Set the same value on a camera and that camera uses its own value instead. + + + + +1. Navigate to and set **Detect FPS** to `5`. Every camera now detects at 5 fps. +2. Navigate to , select the `driveway` camera, and set **Detect FPS** to `10`. + +The `driveway` camera now detects at 10 fps. Every other camera still uses the global value of 5. + + + + +```yaml +detect: + fps: 5 # every camera detects at 5 fps + +cameras: + front_door: + ffmpeg: ... + driveway: + ffmpeg: ... + detect: + fps: 10 # except this one +``` + +`front_door` inherits `fps: 5`, and `driveway` uses `10`. + + + + +## Overrides apply per value, not per section + +Overriding one value in a section does not detach the rest of that section. Everything you don't set on the camera still comes from the global configuration. + + + + +If you set a camera's **Motion threshold** but leave **Contour area** alone, only the threshold is overridden. The contour area continues to follow , and changing it there still affects that camera. + +Open a section to see which values are overridden: the section header indicates how many fields differ from the global configuration. + + + + +```yaml +motion: + threshold: 30 + contour_area: 10 + +cameras: + driveway: + motion: + threshold: 40 +``` + +The `driveway` camera ends up with `threshold: 40` and `contour_area: 10`. Only the value you wrote was overridden. + + + + +## Returning a camera to the global value + + + + +A camera section that has its own values shows an **Overridden** badge. To remove the override and go back to inheriting, use the **Reset to Global** button at the bottom of the section. + + + + +Frigate treats a camera value as an override because it is written in the config file, not because it differs from the global value. Repeating the global value under a camera still creates an override: + +```yaml +snapshots: + enabled: true + +cameras: + driveway: + snapshots: + enabled: true # this is an override, even though it matches +``` + +If you later change the global `snapshots.enabled` to `false`, `driveway` keeps saving snapshots, because it has its own value. To make a camera follow the global value again, delete the key from the camera rather than setting it to match. + + + + +## Lists replace, maps merge + +This is the distinction that surprises people most. + +**Lists are replaced entirely.** A camera's list does not add to the global list, it takes its place. + + + + +The camera page shows the objects the camera is currently tracking, starting from the global list. Changing that selection under replaces the list for that camera, so make sure every object you want tracked is selected, not just the ones you are adding. + + + + +```yaml +objects: + track: + - person + - car + +cameras: + backyard: + objects: + track: + - dog # backyard tracks ONLY dog, not person or car +``` + +To track `dog` in addition to the global objects, list all of them on the camera. + + + + +An empty list is a valid override, and is the normal way to opt a camera out of something: + +```yaml +review: + alerts: + labels: + - person + +cameras: + street: + review: + alerts: + labels: [] # this camera never creates alerts +``` + +**Maps are merged key by key.** A camera can add an entry without redeclaring the others. + + + + +Adding a filter for one object under does not remove the filters inherited from . The camera keeps both. + + + + +```yaml +objects: + filters: + person: + min_area: 5000 + +cameras: + driveway: + objects: + filters: + car: + min_area: 10000 +``` + +The `driveway` camera ends up with both the `car` filter it defined and the `person` filter from the global configuration. + + + + +## Which settings can be overridden + +Most, but not all. The [full reference config](./advanced/reference.md) is the authoritative source: sections that support camera-level overrides are marked with the comment `# NOTE: Can be overridden at the camera level`. In the UI, a setting can be overridden if it appears under both and . + +A few things worth knowing beyond that: + +- Some sections are **global only** and have no camera-level equivalent, including `go2rtc`, `genai` providers, `classification`, `telemetry`, `camera_groups`, and `ui`. +- Some sections exist **only at the camera level**, such as `zones` and `onvif`. +- Some sections are **partially overridable**, meaning a camera accepts only a few of the keys available globally. `face_recognition`, `lpr`, and `audio_transcription` work this way, and the reference config notes which keys apply. + +## Enrichments that must be enabled globally first + +License plate recognition and face recognition are special: the global setting is not just a default, it is a switch that must be on before any camera can use the feature. Enabling one on a camera while it is disabled globally is a configuration error, and Frigate will refuse to start: + +``` +Camera driveway has lpr enabled but lpr is disabled at the global level of the config. You must enable lpr at the global level. +``` + +Enable the feature globally, then turn it off on the cameras that don't need it. + + + + +1. Navigate to and enable **LPR**. +2. Navigate to , select each camera that should not run LPR, and disable the **Enable LPR** toggle. + + + + +```yaml +lpr: + enabled: true + +cameras: + driveway: + ffmpeg: ... # inherits lpr, enabled + backyard: + ffmpeg: ... + lpr: + enabled: false # opted out +``` + + + + +:::note + +This applies only to `lpr` and `face_recognition`, because the global setting controls whether the supporting background process starts at all. Other features do not work this way. Audio transcription, for example, can be enabled on a single camera without being enabled globally. + +::: + +## Profiles + +[Profiles](./profiles.md) add a further layer on top of everything described above. A profile is a named set of camera overrides that you can switch on and off while Frigate is running, for example to change detection and recording behavior when you leave the house. + +Profiles are applied on top of a camera's already-resolved configuration, so a profile value wins over both the camera and the global value while that profile is active. Profiles cover a subset of the camera sections and do not modify your config file. + +## Summary + +- A camera inherits every value you don't set on it. +- Overriding one value does not detach the rest of the section. +- Writing a value on a camera overrides it, even if it matches the global value. Remove it to inherit again. +- Lists replace the global list. Maps merge into it. +- An empty list is an override, not an omission. +- `lpr` and `face_recognition` must be enabled globally before a camera can use them. diff --git a/docs/sidebars.ts b/docs/sidebars.ts index ce6c41c133..f516c28fc6 100644 --- a/docs/sidebars.ts +++ b/docs/sidebars.ts @@ -30,6 +30,7 @@ const sidebars: SidebarsConfig = { ], Configuration: [ "configuration/config", + "configuration/config_overrides", { type: "category", label: "Detectors",