clean up now obsolete namespaces

This commit is contained in:
Josh Hawkins 2026-01-31 10:18:38 -06:00
parent 3f7f5e3253
commit 5e8de5a911
62 changed files with 27 additions and 1561 deletions

View File

@ -1,32 +0,0 @@
{
"label": "Audio events",
"description": "Settings for audio-based event detection; can be overridden per-camera.",
"enabled": {
"label": "Enable audio detection",
"description": "Enable or disable audio event detection; can be overridden per-camera."
},
"max_not_heard": {
"label": "End timeout",
"description": "Amount of seconds without the configured audio type before the audio event is ended."
},
"min_volume": {
"label": "Minimum volume",
"description": "Minimum RMS volume threshold required to run audio detection; lower values increase sensitivity (e.g., 200 high, 500 medium, 1000 low)."
},
"listen": {
"label": "Listen types",
"description": "List of audio event types to detect (for example: bark, fire_alarm, scream, speech, yell)."
},
"filters": {
"label": "Audio filters",
"description": "Per-audio-type filter settings such as confidence thresholds used to reduce false positives."
},
"enabled_in_config": {
"label": "Original audio state",
"description": "Indicates whether audio detection was originally enabled in the static config file."
},
"num_threads": {
"label": "Detection threads",
"description": "Number of threads to use for audio detection processing."
}
}

View File

@ -1,24 +0,0 @@
{
"label": "Audio transcription",
"description": "Settings for live and speech audio transcription used for events and live captions.",
"enabled": {
"label": "Enable audio transcription",
"description": "Enable or disable automatic audio transcription globally."
},
"language": {
"label": "Transcription language",
"description": "Language code used for transcription/translation (for example 'en' for English)."
},
"device": {
"label": "Transcription device",
"description": "Device key (CPU/GPU) to run the transcription model on."
},
"model_size": {
"label": "Model size",
"description": "Model size to use for transcription; the small model runs on CPU, large model requires a GPU."
},
"live_enabled": {
"label": "Live transcription",
"description": "Enable streaming live transcription for audio as it is received."
}
}

View File

@ -1,48 +0,0 @@
{
"label": "Authentication",
"description": "Authentication and session-related settings including cookie and rate limit options.",
"enabled": {
"label": "Enable authentication",
"description": "Enable native authentication for the Frigate UI."
},
"reset_admin_password": {
"label": "Reset admin password",
"description": "If true, reset the admin user's password on startup and print the new password in logs."
},
"cookie_name": {
"label": "JWT cookie name",
"description": "Name of the cookie used to store the JWT token for native authentication."
},
"cookie_secure": {
"label": "Secure cookie flag",
"description": "Set the secure flag on the auth cookie; should be true when using TLS."
},
"session_length": {
"label": "Session length",
"description": "Session duration in seconds for JWT-based sessions."
},
"refresh_time": {
"label": "Session refresh window",
"description": "When a session is within this many seconds of expiring, refresh it back to full length."
},
"failed_login_rate_limit": {
"label": "Failed login limits",
"description": "Rate limiting rules for failed login attempts to reduce brute-force attacks."
},
"trusted_proxies": {
"label": "Trusted proxies",
"description": "List of trusted proxy IPs used when determining client IP for rate limiting."
},
"hash_iterations": {
"label": "Hash iterations",
"description": "Number of PBKDF2-SHA256 iterations to use when hashing user passwords."
},
"roles": {
"label": "Role mappings",
"description": "Map roles to camera lists. An empty list grants access to all cameras for the role."
},
"admin_first_time_login": {
"label": "First-time admin flag",
"description": "When true the UI may show a help link on the login page informing users how to sign in after an admin password reset. "
}
}

View File

@ -1,52 +0,0 @@
{
"label": "Birdseye",
"description": "Settings for the Birdseye composite view that composes multiple camera feeds into a single layout.",
"enabled": {
"label": "Enable Birdseye",
"description": "Enable or disable the Birdseye view feature."
},
"mode": {
"label": "Tracking mode",
"description": "Mode for including cameras in Birdseye: 'objects', 'motion', or 'continuous'."
},
"restream": {
"label": "Restream RTSP",
"description": "Re-stream the Birdseye output as an RTSP feed; enabling this will keep Birdseye running continuously."
},
"width": {
"label": "Width",
"description": "Output width (pixels) of the composed Birdseye frame."
},
"height": {
"label": "Height",
"description": "Output height (pixels) of the composed Birdseye frame."
},
"quality": {
"label": "Encoding quality",
"description": "Encoding quality for the Birdseye mpeg1 feed (1 highest quality, 31 lowest)."
},
"inactivity_threshold": {
"label": "Inactivity threshold",
"description": "Seconds of inactivity after which a camera will stop being shown in Birdseye."
},
"layout": {
"label": "Layout",
"description": "Layout options for the Birdseye composition.",
"scaling_factor": {
"label": "Scaling factor",
"description": "Scaling factor used by the layout calculator (range 1.0 to 5.0)."
},
"max_cameras": {
"label": "Max cameras",
"description": "Maximum number of cameras to display at once in Birdseye; shows the most recent cameras."
}
},
"idle_heartbeat_fps": {
"label": "Idle heartbeat FPS",
"description": "Frames-per-second to resend the last composed Birdseye frame when idle; set to 0 to disable."
},
"order": {
"label": "Position",
"description": "Numeric position controlling the camera's ordering in the Birdseye layout."
}
}

View File

@ -1,16 +0,0 @@
{
"label": "Camera groups",
"description": "Configuration for named camera groups used to organize cameras in the UI.",
"cameras": {
"label": "Camera list",
"description": "Array of camera names included in this group."
},
"icon": {
"label": "Group icon",
"description": "Icon used to represent the camera group in the UI."
},
"order": {
"label": "Sort order",
"description": "Numeric order used to sort camera groups in the UI; larger numbers appear later."
}
}

View File

@ -1,32 +0,0 @@
{
"label": "MQTT",
"description": "MQTT image publishing settings.",
"enabled": {
"label": "Send image",
"description": "Enable publishing image snapshots for objects to MQTT topics for this camera."
},
"timestamp": {
"label": "Add timestamp",
"description": "Overlay a timestamp on images published to MQTT."
},
"bounding_box": {
"label": "Add bounding box",
"description": "Draw bounding boxes on images published over MQTT."
},
"crop": {
"label": "Crop image",
"description": "Crop images published to MQTT to the detected object's bounding box."
},
"height": {
"label": "Image height",
"description": "Height (pixels) to resize images published over MQTT."
},
"required_zones": {
"label": "Required zones",
"description": "Zones that an object must enter for an MQTT image to be published."
},
"quality": {
"label": "JPEG quality",
"description": "JPEG quality for images published to MQTT (0-100)."
}
}

View File

@ -1,12 +0,0 @@
{
"label": "Camera UI",
"description": "Display ordering and dashboard visibility for this camera in the UI.",
"order": {
"label": "UI order",
"description": "Numeric order used to sort the camera in the UI; larger numbers appear later."
},
"dashboard": {
"label": "Show in dashboard",
"description": "Toggle whether this camera is visible in the main dashboard."
}
}

View File

@ -1,64 +0,0 @@
{
"label": "Object classification",
"description": "Settings for classification models used to refine object labels or state classification.",
"bird": {
"label": "Bird classification config",
"description": "Settings specific to bird classification models.",
"enabled": {
"label": "Bird classification",
"description": "Enable or disable bird classification."
},
"threshold": {
"label": "Minimum score",
"description": "Minimum classification score required to accept a bird classification."
}
},
"custom": {
"label": "Custom Classification Models",
"description": "Configuration for custom classification models used for objects or state detection.",
"enabled": {
"label": "Enable model",
"description": "Enable or disable the custom classification model."
},
"name": {
"label": "Model name",
"description": "Identifier for the custom classification model to use."
},
"threshold": {
"label": "Score threshold",
"description": "Score threshold used to change the classification state."
},
"save_attempts": {
"label": "Save attempts",
"description": "How many classification attempts to save for recent classifications UI."
},
"object_config": {
"objects": {
"label": "Classify objects",
"description": "List of object types to run object classification on."
},
"classification_type": {
"label": "Classification type",
"description": "Classification type applied: 'sub_label' (adds sub_label) or other supported types."
}
},
"state_config": {
"cameras": {
"label": "Classification cameras",
"description": "Per-camera crop and settings for running state classification.",
"crop": {
"label": "Classification crop",
"description": "Crop coordinates to use for running classification on this camera."
}
},
"motion": {
"label": "Run on motion",
"description": "If true, run classification when motion is detected within the specified crop."
},
"interval": {
"label": "Classification interval",
"description": "Interval (seconds) between periodic classification runs for state classification."
}
}
}
}

View File

@ -1,8 +0,0 @@
{
"label": "Database",
"description": "Settings for the SQLite database used by Frigate to store tracked object and recording metadata.",
"path": {
"label": "Database path",
"description": "Filesystem path where the Frigate SQLite database file will be stored."
}
}

View File

@ -1,60 +0,0 @@
{
"label": "Object Detection",
"description": "Settings for the detection/detect role used to run object detection and initialize trackers.",
"enabled": {
"label": "Detection enabled",
"description": "Enable or disable object detection for this camera. Detection must be enabled for object tracking to run."
},
"height": {
"label": "Detect height",
"description": "Height (pixels) of frames used for the detect stream; leave empty to use the native stream resolution."
},
"width": {
"label": "Detect width",
"description": "Width (pixels) of frames used for the detect stream; leave empty to use the native stream resolution."
},
"fps": {
"label": "Detect FPS",
"description": "Desired frames per second to run detection on; lower values reduce CPU usage (recommended value is 5, only set higher - at most 10 - if tracking extremely fast moving objects)."
},
"min_initialized": {
"label": "Minimum initialization frames",
"description": "Number of consecutive detection hits required before creating a tracked object. Increase to reduce false initializations. Default value is fps divided by 2."
},
"max_disappeared": {
"label": "Maximum disappeared frames",
"description": "Number of frames without a detection before a tracked object is considered gone."
},
"stationary": {
"label": "Stationary objects config",
"description": "Settings to detect and manage objects that remain stationary for a period of time.",
"interval": {
"label": "Stationary interval",
"description": "How often (in frames) to run a detection check to confirm a stationary object."
},
"threshold": {
"label": "Stationary threshold",
"description": "Number of frames with no position change required to mark an object as stationary."
},
"max_frames": {
"label": "Max frames",
"description": "Limits how long stationary objects are tracked before being discarded.",
"default": {
"label": "Default max frames",
"description": "Default maximum frames to track a stationary object before stopping."
},
"objects": {
"label": "Object max frames",
"description": "Per-object overrides for maximum frames to track stationary objects."
}
},
"classifier": {
"label": "Enable visual classifier",
"description": "Use a visual classifier to detect truly stationary objects even when bounding boxes jitter."
}
},
"annotation_offset": {
"label": "Annotation offset",
"description": "Milliseconds to shift detect annotations to better align timeline bounding boxes with recordings; can be positive or negative."
}
}

View File

@ -1,56 +0,0 @@
{
"label": "Detector hardware",
"description": "Configuration for object detectors (CPU, GPU, ONNX backends) and any detector-specific model settings.",
"type": {
"label": "Detector Type",
"description": "Type of detector to use for object detection (for example 'cpu', 'edgetpu', 'openvino')."
},
"model": {
"label": "Detector specific model configuration",
"description": "Detector-specific model configuration options (path, input size, etc.).",
"path": {
"label": "Custom Object detection model path",
"description": "Path to a custom detection model file (or plus://<model_id> for Frigate+ models)."
},
"labelmap_path": {
"label": "Label map for custom object detector",
"description": "Path to a labelmap file that maps numeric classes to string labels for the detector."
},
"width": {
"label": "Object detection model input width",
"description": "Width of the model input tensor in pixels."
},
"height": {
"label": "Object detection model input height",
"description": "Height of the model input tensor in pixels."
},
"labelmap": {
"label": "Labelmap customization",
"description": "Overrides or remapping entries to merge into the standard labelmap."
},
"attributes_map": {
"label": "Map of object labels to their attribute labels",
"description": "Mapping from object labels to attribute labels used to attach metadata (for example 'car' -> ['license_plate'])."
},
"input_tensor": {
"label": "Model Input Tensor Shape",
"description": "Tensor format expected by the model: 'nhwc' or 'nchw'."
},
"input_pixel_format": {
"label": "Model Input Pixel Color Format",
"description": "Pixel colorspace expected by the model: 'rgb', 'bgr', or 'yuv'."
},
"input_dtype": {
"label": "Model Input D Type",
"description": "Data type of the model input tensor (for example 'float32')."
},
"model_type": {
"label": "Object Detection Model Type",
"description": "Detector model architecture type (ssd, yolox, yolonas) used by some detectors for optimization."
}
},
"model_path": {
"label": "Detector specific model path",
"description": "File path to the detector model binary if required by the chosen detector."
}
}

View File

@ -1,4 +0,0 @@
{
"label": "Environment variables",
"description": "Key/value pairs of environment variables to set for the Frigate process."
}

View File

@ -1,44 +0,0 @@
{
"label": "Face recognition",
"description": "Settings for face detection and recognition; can be overridden per-camera.",
"enabled": {
"label": "Enable face recognition",
"description": "Enable or disable face recognition globally."
},
"model_size": {
"label": "Model size",
"description": "Model size to use for face embeddings (small/large); larger may require GPU."
},
"unknown_score": {
"label": "Unknown score threshold",
"description": "Distance threshold below which a face is considered a potential match (higher = stricter)."
},
"detection_threshold": {
"label": "Detection threshold",
"description": "Minimum detection confidence required to consider a face detection valid."
},
"recognition_threshold": {
"label": "Recognition threshold",
"description": "Face embedding distance threshold to consider two faces a match."
},
"min_area": {
"label": "Minimum face area",
"description": "Minimum area (pixels) of a detected face box required to attempt recognition."
},
"min_faces": {
"label": "Minimum faces",
"description": "Minimum number of face recognitions required before applying a recognized sub-label to a person."
},
"save_attempts": {
"label": "Save attempts",
"description": "Number of face recognition attempts to retain for recent recognition UI."
},
"blur_confidence_filter": {
"label": "Blur confidence filter",
"description": "Adjust confidence scores based on image blur to reduce false positives for poor quality faces."
},
"device": {
"label": "Device",
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
}
}

View File

@ -1,68 +0,0 @@
{
"label": "FFmpeg",
"description": "FFmpeg settings including binary path, args, hwaccel options, and per-role output args.",
"path": {
"label": "FFmpeg path",
"description": "Path to the FFmpeg binary to use globally or a version alias (\"5.0\" or \"7.0\")."
},
"global_args": {
"label": "FFmpeg global args",
"description": "Global args passed to FFmpeg processes by default."
},
"hwaccel_args": {
"label": "Hardware acceleration args",
"description": "Hardware acceleration arguments for FFmpeg (auto or provider-specific)."
},
"input_args": {
"label": "Input args",
"description": "Input arguments applied to FFmpeg input streams by default."
},
"output_args": {
"label": "Output args",
"description": "Default output args used for different FFmpeg roles such as detect and record.",
"detect": {
"label": "Detect output args",
"description": "Default output args for detect role streams."
},
"record": {
"label": "Record output args",
"description": "Default output args for record role streams."
}
},
"retry_interval": {
"label": "FFmpeg retry time",
"description": "Seconds to wait before attempting to reconnect a camera stream after failure. Default is 10."
},
"apple_compatibility": {
"label": "Apple compatibility",
"description": "Enable HEVC tagging for better Apple player compatibility when recording H.265."
},
"gpu": {
"label": "GPU index",
"description": "Default GPU index used for hardware acceleration if available."
},
"inputs": {
"label": "Camera inputs",
"description": "List of input stream definitions (paths and roles) for this camera.",
"path": {
"label": "Input path",
"description": "Camera input stream URL or path."
},
"roles": {
"label": "Input roles",
"description": "Roles for this input stream (for example: detect, record, audio)."
},
"global_args": {
"label": "FFmpeg global args",
"description": "FFmpeg global arguments for this input stream."
},
"hwaccel_args": {
"label": "Hardware acceleration args",
"description": "Hardware acceleration arguments for this input stream."
},
"input_args": {
"label": "Input args",
"description": "Input arguments specific to this stream."
}
}
}

View File

@ -1,23 +0,0 @@
{
"label": "Generative AI configuration.",
"properties": {
"api_key": {
"label": "Provider API key."
},
"base_url": {
"label": "Provider base url."
},
"model": {
"label": "GenAI model."
},
"provider": {
"label": "GenAI provider."
},
"provider_options": {
"label": "GenAI Provider extra options."
},
"runtime_options": {
"label": "Options to pass during inference calls."
}
}
}

View File

@ -1,4 +0,0 @@
{
"label": "go2rtc",
"description": "Settings for the integrated go2rtc restreaming service used for live stream relaying and translation."
}

View File

@ -1,16 +0,0 @@
{
"label": "Live playback",
"description": "Settings used by the Web UI to control live stream resolution and quality.",
"streams": {
"label": "Live stream names",
"description": "Mapping of configured stream names to restream/go2rtc names used for live playback."
},
"height": {
"label": "Live height",
"description": "Height (pixels) to render the live stream in the Web UI; must be <= detect stream height."
},
"quality": {
"label": "Live quality",
"description": "Encoding quality for the live jsmpeg stream (1 highest, 31 lowest)."
}
}

View File

@ -1,12 +0,0 @@
{
"label": "Logging",
"description": "Controls default log verbosity and per-component log level overrides.",
"default": {
"label": "Logging level",
"description": "Default global log verbosity (debug, info, warning, error)."
},
"logs": {
"label": "Per-process log level",
"description": "Per-component log level overrides to increase or decrease verbosity for specific modules."
}
}

View File

@ -1,66 +0,0 @@
{
"label": "License Plate Recognition",
"description": "License plate recognition settings including detection thresholds, formatting, and known plates.",
"enabled": {
"label": "Enable LPR",
"description": "Enable or disable LPR globally; camera-level settings can override."
},
"model_size": {
"label": "Model size",
"description": "Model size used for text detection/recognition; small runs on CPU, large on GPU."
},
"detection_threshold": {
"label": "Detection threshold",
"description": "Detection confidence threshold to begin running OCR on a suspected plate."
},
"min_area": {
"label": "Minimum plate area",
"description": "Minimum plate area (pixels) required to attempt recognition."
},
"recognition_threshold": {
"label": "Recognition threshold",
"description": "Confidence threshold required for recognized plate text to be attached as a sub-label."
},
"min_plate_length": {
"label": "Min plate length",
"description": "Minimum number of characters a recognized plate must contain to be considered valid."
},
"format": {
"label": "Plate format regex",
"description": "Optional regex to validate recognized plate strings against an expected format."
},
"match_distance": {
"label": "Match distance",
"description": "Number of character mismatches allowed when comparing detected plates to known plates."
},
"known_plates": {
"label": "Known plates",
"description": "List of plates or regexes to specially track or alert on."
},
"enhancement": {
"label": "Enhancement level",
"description": "Enhancement level (0-10) to apply to plate crops prior to OCR; higher values may not always improve results, levels above 5 may only work with night time plates and should be used with caution."
},
"debug_save_plates": {
"label": "Save debug plates",
"description": "Save plate crop images for debugging LPR performance."
},
"device": {
"label": "Device",
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
},
"replace_rules": {
"label": "Replacement rules",
"description": "Regex replacement rules used to normalize detected plate strings before matching.",
"pattern": {
"label": "Regex pattern"
},
"replacement": {
"label": "Replacement string"
}
},
"expire_time": {
"label": "Expire seconds",
"description": "Time in seconds after which an unseen plate is expired from the tracker (for dedicated LPR cameras only)."
}
}

View File

@ -1,44 +0,0 @@
{
"label": "Detection model",
"description": "Settings to configure a custom object detection model and its input shape.",
"path": {
"label": "Custom Object detection model path",
"description": "Path to a custom detection model file (or plus://<model_id> for Frigate+ models)."
},
"labelmap_path": {
"label": "Label map for custom object detector",
"description": "Path to a labelmap file that maps numeric classes to string labels for the detector."
},
"width": {
"label": "Object detection model input width",
"description": "Width of the model input tensor in pixels."
},
"height": {
"label": "Object detection model input height",
"description": "Height of the model input tensor in pixels."
},
"labelmap": {
"label": "Labelmap customization",
"description": "Overrides or remapping entries to merge into the standard labelmap."
},
"attributes_map": {
"label": "Map of object labels to their attribute labels",
"description": "Mapping from object labels to attribute labels used to attach metadata (for example 'car' -> ['license_plate'])."
},
"input_tensor": {
"label": "Model Input Tensor Shape",
"description": "Tensor format expected by the model: 'nhwc' or 'nchw'."
},
"input_pixel_format": {
"label": "Model Input Pixel Color Format",
"description": "Pixel colorspace expected by the model: 'rgb', 'bgr', or 'yuv'."
},
"input_dtype": {
"label": "Model Input D Type",
"description": "Data type of the model input tensor (for example 'float32')."
},
"model_type": {
"label": "Object Detection Model Type",
"description": "Detector model architecture type (ssd, yolox, yolonas) used by some detectors for optimization."
}
}

View File

@ -1,51 +0,0 @@
{
"label": "Motion detection",
"description": "Default motion detection settings applied to cameras unless overridden per-camera.",
"enabled": {
"label": "Enable motion detection",
"description": "Enable or disable motion detection globally; per-camera settings can override this."
},
"threshold": {
"label": "Motion threshold",
"description": "Pixel difference threshold used by the motion detector; higher values reduce sensitivity (range 1-255)."
},
"lightning_threshold": {
"label": "Lightning threshold",
"description": "Threshold to detect and ignore brief lighting spikes (lower is more sensitive, values between 0.3 and 1.0)."
},
"improve_contrast": {
"label": "Improve contrast",
"description": "Apply contrast improvement to frames before motion analysis to help detection."
},
"contour_area": {
"label": "Contour area",
"description": "Minimum contour area in pixels required for a motion contour to be counted."
},
"delta_alpha": {
"label": "Delta alpha",
"description": "Alpha blending factor used in frame differencing for motion calculation."
},
"frame_alpha": {
"label": "Frame alpha",
"description": "Alpha value used when blending frames for motion preprocessing."
},
"frame_height": {
"label": "Frame height",
"description": "Height in pixels to scale frames to when computing motion (useful for performance)."
},
"mask": {
"label": "Mask coordinates",
"description": "Ordered x,y coordinates defining the motion mask polygon used to include/exclude areas."
},
"mqtt_off_delay": {
"label": "MQTT off delay",
"description": "Seconds to wait after last motion before publishing an MQTT 'off' state."
},
"enabled_in_config": {
"label": "Original motion state",
"description": "Indicates whether motion detection was enabled in the original static configuration."
},
"raw_mask": {
"label": "Raw Mask"
}
}

View File

@ -1,56 +0,0 @@
{
"label": "MQTT",
"description": "Settings for connecting and publishing telemetry, snapshots, and event details to an MQTT broker.",
"enabled": {
"label": "Enable MQTT",
"description": "Enable or disable MQTT integration for state, events, and snapshots."
},
"host": {
"label": "MQTT host",
"description": "Hostname or IP address of the MQTT broker."
},
"port": {
"label": "MQTT port",
"description": "Port of the MQTT broker (usually 1883 for plain MQTT)."
},
"topic_prefix": {
"label": "Topic prefix",
"description": "MQTT topic prefix for all Frigate topics; must be unique if running multiple instances."
},
"client_id": {
"label": "Client ID",
"description": "Client identifier used when connecting to the MQTT broker; should be unique per instance."
},
"stats_interval": {
"label": "Stats interval",
"description": "Interval in seconds for publishing system and camera stats to MQTT."
},
"user": {
"label": "MQTT username",
"description": "Optional MQTT username; can be provided via environment variables or secrets."
},
"password": {
"label": "MQTT password",
"description": "Optional MQTT password; can be provided via environment variables or secrets."
},
"tls_ca_certs": {
"label": "TLS CA certs",
"description": "Path to CA certificate for TLS connections to the broker (for self-signed certs)."
},
"tls_client_cert": {
"label": "Client cert",
"description": "Client certificate path for TLS mutual authentication; do not set user/password when using client certs."
},
"tls_client_key": {
"label": "Client key",
"description": "Private key path for the client certificate."
},
"tls_insecure": {
"label": "TLS insecure",
"description": "Allow insecure TLS connections by skipping hostname verification (not recommended)."
},
"qos": {
"label": "MQTT QoS",
"description": "Quality of Service level for MQTT publishes/subscriptions (0, 1, or 2)."
}
}

View File

@ -1,23 +0,0 @@
{
"label": "Networking",
"description": "Network-related settings such as IPv6 enablement for Frigate endpoints.",
"ipv6": {
"label": "IPv6 configuration",
"description": "IPv6-specific settings for Frigate network services.",
"enabled": {
"label": "Enable IPv6",
"description": "Enable IPv6 support for Frigate services (API and UI) where applicable."
}
},
"listen": {
"label": "Listening ports configuration",
"internal": {
"label": "Internal port",
"description": "Internal listening port for Frigate (default 5000)."
},
"external": {
"label": "External port",
"description": "External listening port for Frigate (default 8971)."
}
}
}

View File

@ -1,20 +0,0 @@
{
"label": "Notifications",
"description": "Settings to enable and control notifications; can be overridden per-camera.",
"enabled": {
"label": "Enable notifications",
"description": "Enable or disable notifications globally."
},
"email": {
"label": "Notification email",
"description": "Email address used for push notifications or required by certain notification providers."
},
"cooldown": {
"label": "Cooldown period",
"description": "Cooldown (seconds) between notifications to avoid spamming recipients."
},
"enabled_in_config": {
"label": "Original notifications state",
"description": "Indicates whether notifications were enabled in the original static configuration."
}
}

View File

@ -1,95 +0,0 @@
{
"label": "Objects",
"description": "Object tracking defaults including which labels to track and per-object filters.",
"track": {
"label": "Objects to track",
"description": "List of object labels to track globally; camera configs can override this."
},
"filters": {
"label": "Object filters",
"description": "Filters applied to detected objects to reduce false positives (area, ratio, confidence).",
"min_area": {
"label": "Minimum object area",
"description": "Minimum bounding box area (pixels or percentage) required for this object type. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
},
"max_area": {
"label": "Maximum object area",
"description": "Maximum bounding box area (pixels or percentage) allowed for this object type. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
},
"min_ratio": {
"label": "Minimum aspect ratio",
"description": "Minimum width/height ratio required for the bounding box to qualify."
},
"max_ratio": {
"label": "Maximum aspect ratio",
"description": "Maximum width/height ratio allowed for the bounding box to qualify."
},
"threshold": {
"label": "Avg confidence",
"description": "Average detection confidence threshold required for the object to be considered a true positive."
},
"min_score": {
"label": "Minimum confidence",
"description": "Minimum single-frame detection confidence required for the object to be counted."
},
"mask": {
"label": "Filter mask",
"description": "Polygon coordinates defining where this filter applies within the frame."
},
"raw_mask": {
"label": "Raw Mask"
}
},
"mask": {
"label": "Object mask",
"description": "Mask polygon used to prevent object detection in specified areas."
},
"genai": {
"label": "GenAI object config",
"description": "GenAI options for describing tracked objects and sending frames for generation.",
"enabled": {
"label": "Enable GenAI",
"description": "Enable GenAI generation of descriptions for tracked objects by default."
},
"use_snapshot": {
"label": "Use snapshots",
"description": "Use object snapshots instead of thumbnails for GenAI description generation."
},
"prompt": {
"label": "Caption prompt",
"description": "Default prompt template used when generating descriptions with GenAI."
},
"object_prompts": {
"label": "Object prompts",
"description": "Per-object prompts to customize GenAI outputs for specific labels."
},
"objects": {
"label": "GenAI objects",
"description": "List of object labels to send to GenAI by default."
},
"required_zones": {
"label": "Required zones",
"description": "Zones that must be entered for objects to qualify for GenAI description generation."
},
"debug_save_thumbnails": {
"label": "Save thumbnails",
"description": "Save thumbnails sent to GenAI for debugging and review."
},
"send_triggers": {
"label": "GenAI triggers",
"description": "Defines when frames should be sent to GenAI (on end, after updates, etc.).",
"tracked_object_end": {
"label": "Send on end",
"description": "Send a request to GenAI when the tracked object ends."
},
"after_significant_updates": {
"label": "Early GenAI trigger",
"description": "Send a request to GenAI after a specified number of significant updates for the tracked object."
}
},
"enabled_in_config": {
"label": "Original GenAI state",
"description": "Indicates whether GenAI was enabled in the original static config."
}
}
}

View File

@ -1,72 +0,0 @@
{
"label": "ONVIF",
"description": "ONVIF connection and PTZ autotracking settings for this camera.",
"host": {
"label": "ONVIF host",
"description": "Host (and optional scheme) for the ONVIF service for this camera."
},
"port": {
"label": "ONVIF port",
"description": "Port number for the ONVIF service."
},
"user": {
"label": "ONVIF username",
"description": "Username for ONVIF authentication; some devices require admin user for ONVIF."
},
"password": {
"label": "ONVIF password",
"description": "Password for ONVIF authentication."
},
"tls_insecure": {
"label": "Disable TLS verify",
"description": "Skip TLS verification and disable digest auth for ONVIF (unsafe; use in safe networks only)."
},
"autotracking": {
"label": "Autotracking",
"description": "Automatically track moving objects and keep them centered in the frame using PTZ camera movements.",
"enabled": {
"label": "Enable Autotracking",
"description": "Enable or disable automatic PTZ camera tracking of detected objects."
},
"calibrate_on_startup": {
"label": "Calibrate on start",
"description": "Measure PTZ motor speeds on startup to improve tracking accuracy. Frigate will update config with movement_weights after calibration."
},
"zooming": {
"label": "Zoom mode",
"description": "Control zoom behavior: disabled (pan/tilt only), absolute (most compatible), or relative (concurrent pan/tilt/zoom)."
},
"zoom_factor": {
"label": "Zoom factor",
"description": "Control zoom level on tracked objects. Lower values keep more scene in view; higher values zoom in closer but may lose tracking. Values between 0.1 and 0.75."
},
"track": {
"label": "Tracked objects",
"description": "List of object types that should trigger autotracking."
},
"required_zones": {
"label": "Required zones",
"description": "Objects must enter one of these zones before autotracking begins."
},
"return_preset": {
"label": "Return preset",
"description": "ONVIF preset name configured in camera firmware to return to after tracking ends."
},
"timeout": {
"label": "Return timeout",
"description": "Wait this many seconds after losing tracking before returning camera to preset position."
},
"movement_weights": {
"label": "Movement weights",
"description": "Calibration values automatically generated by camera calibration. Do not modify manually."
},
"enabled_in_config": {
"label": "Original autotrack state",
"description": "Internal field to track whether autotracking was enabled in configuration."
}
},
"ignore_time_mismatch": {
"label": "Ignore time mismatch",
"description": "Ignore time synchronization differences between camera and Frigate server for ONVIF communication."
}
}

View File

@ -1,36 +0,0 @@
{
"label": "Proxy",
"description": "Settings for integrating Frigate behind a reverse proxy that passes authenticated user headers.",
"header_map": {
"label": "Header mapping",
"description": "Map incoming proxy headers to Frigate user and role fields for proxy-based auth.",
"user": {
"label": "User header",
"description": "Header containing the authenticated username provided by the upstream proxy."
},
"role": {
"label": "Role header",
"description": "Header containing the authenticated user's role or groups from the upstream proxy."
},
"role_map": {
"label": "Role mapping",
"description": "Map upstream group values to Frigate roles (for example map admin groups to the admin role)."
}
},
"logout_url": {
"label": "Logout URL",
"description": "URL to redirect users to when logging out via the proxy."
},
"auth_secret": {
"label": "Proxy secret",
"description": "Optional secret checked against the X-Proxy-Secret header to verify trusted proxies."
},
"default_role": {
"label": "Default role",
"description": "Default role assigned to proxy-authenticated users when no role mapping applies (admin or viewer)."
},
"separator": {
"label": "Separator character",
"description": "Character used to split multiple values provided in proxy headers."
}
}

View File

@ -1,96 +0,0 @@
{
"label": "Recording",
"description": "Recording and retention settings applied to cameras unless overridden per-camera.",
"enabled": {
"label": "Enable recording",
"description": "Enable or disable recording globally; individual cameras can override this."
},
"expire_interval": {
"label": "Record cleanup interval",
"description": "Minutes between cleanup passes that remove expired recording segments."
},
"continuous": {
"label": "Continuous retention",
"description": "Number of days to retain recordings regardless of tracked objects or motion. Set to 0 if you only want to retain recordings of alerts and detections.",
"days": {
"label": "Retention days",
"description": "Days to retain recordings."
}
},
"motion": {
"label": "Motion retention",
"description": "Number of days to retain recordings triggered by motion regardless of tracked objects. Set to 0 if you only want to retain recordings of alerts and detections.",
"days": {
"label": "Retention days",
"description": "Days to retain recordings."
}
},
"detections": {
"label": "Detection retention",
"description": "Recording retention settings for detection events including pre/post capture durations.",
"pre_capture": {
"label": "Pre-capture seconds",
"description": "Number of seconds before the detection event to include in the recording."
},
"post_capture": {
"label": "Post-capture seconds",
"description": "Number of seconds after the detection event to include in the recording."
},
"retain": {
"label": "Event retention",
"description": "Retention settings for recordings of detection events.",
"days": {
"label": "Retention days",
"description": "Number of days to retain recordings of detection events."
},
"mode": {
"label": "Retention mode",
"description": "Mode for retention: all (save all segments), motion (save segments with motion), or active_objects (save segments with active objects)."
}
}
},
"alerts": {
"label": "Alert retention",
"description": "Recording retention settings for alert events including pre/post capture durations.",
"pre_capture": {
"label": "Pre-capture seconds",
"description": "Number of seconds before the detection event to include in the recording."
},
"post_capture": {
"label": "Post-capture seconds",
"description": "Number of seconds after the detection event to include in the recording."
},
"retain": {
"label": "Event retention",
"description": "Retention settings for recordings of detection events.",
"days": {
"label": "Retention days",
"description": "Number of days to retain recordings of detection events."
},
"mode": {
"label": "Retention mode",
"description": "Mode for retention: all (save all segments), motion (save segments with motion), or active_objects (save segments with active objects)."
}
}
},
"export": {
"label": "Export config",
"description": "Settings used when exporting recordings such as timelapse and hardware acceleration.",
"hwaccel_args": {
"label": "Export hwaccel args",
"description": "Hardware acceleration args to use for export/transcode operations."
}
},
"preview": {
"label": "Preview config",
"description": "Settings controlling the quality of recording previews shown in the UI.",
"quality": {
"label": "Preview quality",
"description": "Preview quality level (very_low, low, medium, high, very_high)."
}
},
"enabled_in_config": {
"label": "Original recording state",
"description": "Indicates whether recording was enabled in the original static configuration."
}
}

View File

@ -1,92 +0,0 @@
{
"label": "Review",
"description": "Settings that control alerts, detections, and GenAI review summaries used by the UI and storage.",
"alerts": {
"label": "Alerts config",
"description": "Settings for which tracked objects generate alerts and how alerts are retained.",
"enabled": {
"label": "Enable alerts",
"description": "Enable or disable alert generation for this camera."
},
"labels": {
"label": "Alert labels",
"description": "List of object labels that qualify as alerts (for example: car, person)."
},
"required_zones": {
"label": "Required zones",
"description": "Zones that an object must enter to be considered an alert; leave empty to allow any zone."
},
"enabled_in_config": {
"label": "Original alerts state",
"description": "Tracks whether alerts were originally enabled in the static configuration."
},
"cutoff_time": {
"label": "Alerts cutoff time",
"description": "Seconds to wait after no alert-causing activity before cutting off an alert."
}
},
"detections": {
"label": "Detections config",
"description": "Settings for creating detection events (non-alert) and how long to keep them.",
"enabled": {
"label": "Enable detections",
"description": "Enable or disable detection events for this camera."
},
"labels": {
"label": "Detection labels",
"description": "List of object labels that qualify as detection events."
},
"required_zones": {
"label": "Required zones",
"description": "Zones that an object must enter to be considered a detection; leave empty to allow any zone."
},
"cutoff_time": {
"label": "Detections cutoff time",
"description": "Seconds to wait after no detection-causing activity before cutting off a detection."
},
"enabled_in_config": {
"label": "Original detections state",
"description": "Tracks whether detections were originally enabled in the static configuration."
}
},
"genai": {
"label": "GenAI config",
"description": "Controls use of generative AI for producing descriptions and summaries of review items.",
"enabled": {
"label": "Enable GenAI descriptions",
"description": "Enable or disable GenAI-generated descriptions and summaries for review items."
},
"alerts": {
"label": "Enable GenAI for alerts",
"description": "Use GenAI to generate descriptions for alert items."
},
"detections": {
"label": "Enable GenAI for detections",
"description": "Use GenAI to generate descriptions for detection items."
},
"image_source": {
"label": "Review image source",
"description": "Source of images sent to GenAI ('preview' or 'recordings'); 'recordings' uses higher quality frames but more tokens."
},
"additional_concerns": {
"label": "Additional concerns",
"description": "A list of additional concerns or notes the GenAI should consider when evaluating activity on this camera."
},
"debug_save_thumbnails": {
"label": "Save thumbnails",
"description": "Save thumbnails that are sent to the GenAI provider for debugging and review."
},
"enabled_in_config": {
"label": "Original GenAI state",
"description": "Tracks whether GenAI review was originally enabled in the static configuration."
},
"preferred_language": {
"label": "Preferred language",
"description": "Preferred language to request from the GenAI provider for generated responses."
},
"activity_context_prompt": {
"label": "Activity context prompt",
"description": "Custom prompt describing what is and is not suspicious activity to provide context for GenAI summaries."
}
}
}

View File

@ -1,4 +0,0 @@
{
"label": "Safe mode",
"description": "When enabled, start Frigate in safe mode with reduced features for troubleshooting."
}

View File

@ -1,52 +0,0 @@
{
"label": "Semantic Search",
"description": "Settings for Semantic Search which builds and queries object embeddings to find similar items.",
"enabled": {
"label": "Enable semantic search",
"description": "Enable or disable the semantic search feature."
},
"reindex": {
"label": "Reindex on startup",
"description": "Trigger a full reindex of historical tracked objects into the embeddings database."
},
"model": {
"label": "Semantic search model",
"description": "The embeddings model to use for semantic search (for example 'jinav1')."
},
"model_size": {
"label": "Model size",
"description": "Select model size; 'small' runs on CPU and 'large' typically requires GPU."
},
"device": {
"label": "Device",
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
},
"triggers": {
"label": "Triggers",
"description": "Actions and matching criteria for camera-specific semantic search triggers.",
"friendly_name": {
"label": "Friendly name",
"description": "Optional friendly name displayed in the UI for this trigger."
},
"enabled": {
"label": "Enable this trigger",
"description": "Enable or disable this semantic search trigger."
},
"type": {
"label": "Trigger type",
"description": "Type of trigger: 'thumbnail' (match against image) or 'description' (match against text)."
},
"data": {
"label": "Trigger content",
"description": "Text phrase or thumbnail ID to match against tracked objects."
},
"threshold": {
"label": "Trigger threshold",
"description": "Minimum similarity score (0-1) required to activate this trigger."
},
"actions": {
"label": "Trigger actions",
"description": "List of actions to execute when trigger matches (notification, sub_label, attribute)."
}
}
}

View File

@ -1,52 +0,0 @@
{
"label": "Snapshots",
"description": "Settings for saved JPEG snapshots of tracked objects; can be overridden per-camera.",
"enabled": {
"label": "Snapshots enabled",
"description": "Enable or disable saving snapshots globally."
},
"clean_copy": {
"label": "Save clean copy",
"description": "Save an unannotated clean copy of snapshots in addition to annotated ones."
},
"timestamp": {
"label": "Timestamp overlay",
"description": "Overlay a timestamp on saved snapshots."
},
"bounding_box": {
"label": "Bounding box overlay",
"description": "Draw bounding boxes for tracked objects on saved snapshots."
},
"crop": {
"label": "Crop snapshot",
"description": "Crop saved snapshots to the detected object's bounding box."
},
"required_zones": {
"label": "Required zones",
"description": "Zones an object must enter for a snapshot to be saved."
},
"height": {
"label": "Snapshot height",
"description": "Height (pixels) to resize saved snapshots to; leave empty to preserve original size."
},
"retain": {
"label": "Snapshot retention",
"description": "Retention settings for saved snapshots including default days and per-object overrides.",
"default": {
"label": "Default retention",
"description": "Default number of days to retain snapshots."
},
"mode": {
"label": "Retention mode",
"description": "Mode for retention: all (save all segments), motion (save segments with motion), or active_objects (save segments with active objects)."
},
"objects": {
"label": "Object retention",
"description": "Per-object overrides for snapshot retention days."
}
},
"quality": {
"label": "JPEG quality",
"description": "JPEG encode quality for saved snapshots (0-100)."
}
}

View File

@ -1,32 +0,0 @@
{
"label": "Telemetry",
"description": "System telemetry and stats options including GPU and network bandwidth monitoring.",
"network_interfaces": {
"label": "Network interfaces",
"description": "List of network interface name prefixes to monitor for bandwidth statistics."
},
"stats": {
"label": "System stats",
"description": "Options to enable/disable collection of various system and GPU statistics.",
"amd_gpu_stats": {
"label": "AMD GPU stats",
"description": "Enable collection of AMD GPU statistics if an AMD GPU is present."
},
"intel_gpu_stats": {
"label": "Intel GPU stats",
"description": "Enable collection of Intel GPU statistics if an Intel GPU is present."
},
"network_bandwidth": {
"label": "Network bandwidth",
"description": "Enable per-process network bandwidth monitoring for camera ffmpeg processes and detectors (requires capabilities)."
},
"intel_gpu_device": {
"label": "SR-IOV device",
"description": "Device identifier used when treating Intel GPUs as SR-IOV to fix GPU stats."
}
},
"version_check": {
"label": "Version check",
"description": "Enable an outbound check to detect if a newer Frigate version is available."
}
}

View File

@ -1,36 +0,0 @@
{
"label": "Timestamp style",
"description": "Styling options for in-feed timestamps applied to recordings and snapshots.",
"position": {
"label": "Timestamp position",
"description": "Position of the timestamp on the image (tl/tr/bl/br)."
},
"format": {
"label": "Timestamp format",
"description": "Datetime format string used for timestamps (Python datetime format codes)."
},
"color": {
"label": "Timestamp color",
"description": "RGB color values for the timestamp text (all values 0-255).",
"red": {
"label": "Red",
"description": "Red component (0-255) for timestamp color."
},
"green": {
"label": "Green",
"description": "Green component (0-255) for timestamp color."
},
"blue": {
"label": "Blue",
"description": "Blue component (0-255) for timestamp color."
}
},
"thickness": {
"label": "Timestamp thickness",
"description": "Line thickness of the timestamp text."
},
"effect": {
"label": "Timestamp effect",
"description": "Visual effect for the timestamp text (none, solid, shadow)."
}
}

View File

@ -1,8 +0,0 @@
{
"label": "TLS",
"description": "TLS settings for Frigate's web endpoints (port 8971).",
"enabled": {
"label": "Enable TLS",
"description": "Enable TLS for Frigate's web UI and API on the configured TLS port."
}
}

View File

@ -1,24 +0,0 @@
{
"label": "UI",
"description": "User interface preferences such as timezone, time/date formatting, and units.",
"timezone": {
"label": "Timezone",
"description": "Optional timezone to display across the UI (defaults to browser local time if unset)."
},
"time_format": {
"label": "Time format",
"description": "Time format to use in the UI (browser, 12hour, or 24hour)."
},
"date_style": {
"label": "Date style",
"description": "Date style to use in the UI (full, long, medium, short)."
},
"time_style": {
"label": "Time style",
"description": "Time style to use in the UI (full, long, medium, short)."
},
"unit_system": {
"label": "Unit system",
"description": "Unit system for display (metric or imperial) used in the UI and MQTT."
}
}

View File

@ -1,4 +0,0 @@
{
"label": "Current config version",
"description": "Numeric or string version of the active configuration to help detect migrations or format changes."
}

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const AudioSection = createConfigSection({
sectionPath: "audio",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"enabled",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const AudioTranscriptionSection = createConfigSection({
sectionPath: "audio_transcription",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["enabled", "language", "device", "model_size", "live_enabled"],
hiddenFields: ["enabled_in_config"],

View File

@ -81,8 +81,6 @@ export interface BaseSectionProps {
export interface CreateSectionOptions {
/** The config path for this section (e.g., "detect", "record") */
sectionPath: string;
/** i18n namespace for this section (e.g., "config/detect") */
i18nNamespace: string;
/** Default section configuration */
defaultConfig: SectionConfig;
}
@ -92,7 +90,6 @@ export interface CreateSectionOptions {
*/
export function createConfigSection({
sectionPath,
i18nNamespace,
defaultConfig,
}: CreateSectionOptions) {
const cameraUpdateTopicMap: Record<string, string> = {
@ -131,7 +128,7 @@ export function createConfigSection({
showTitle,
}: BaseSectionProps) {
const { t, i18n } = useTranslation([
i18nNamespace,
level === "camera" ? "config/cameras" : "config/global",
"config/cameras",
"views/settings",
"common",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const BirdseyeSection = createConfigSection({
sectionPath: "birdseye",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["enabled", "mode", "order"],
hiddenFields: [],

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const CameraMqttSection = createConfigSection({
sectionPath: "mqtt",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"enabled",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const CameraUiSection = createConfigSection({
sectionPath: "ui",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["dashboard", "order"],
hiddenFields: [],

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const DetectSection = createConfigSection({
sectionPath: "detect",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"enabled",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const FaceRecognitionSection = createConfigSection({
sectionPath: "face_recognition",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["enabled", "min_area"],
hiddenFields: [],

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const FfmpegSection = createConfigSection({
sectionPath: "ffmpeg",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"inputs",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const LiveSection = createConfigSection({
sectionPath: "live",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["stream_name", "height", "quality"],
fieldGroups: {},

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const LprSection = createConfigSection({
sectionPath: "lpr",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["enabled", "expire_time", "min_area", "enhancement"],
hiddenFields: [],

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const MotionSection = createConfigSection({
sectionPath: "motion",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"enabled",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const NotificationsSection = createConfigSection({
sectionPath: "notifications",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["enabled", "email"],
fieldGroups: {},

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const ObjectsSection = createConfigSection({
sectionPath: "objects",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["track", "alert", "detect", "filters"],
fieldGroups: {

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const OnvifSection = createConfigSection({
sectionPath: "onvif",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"host",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const RecordSection = createConfigSection({
sectionPath: "record",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"enabled",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const ReviewSection = createConfigSection({
sectionPath: "review",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["alerts", "detections", "genai"],
fieldGroups: {},

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const SemanticSearchSection = createConfigSection({
sectionPath: "semantic_search",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["triggers"],
hiddenFields: [],

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const SnapshotsSection = createConfigSection({
sectionPath: "snapshots",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: [
"enabled",

View File

@ -5,7 +5,6 @@ import { createConfigSection } from "./BaseSection";
export const TimestampSection = createConfigSection({
sectionPath: "timestamp_style",
i18nNamespace: "config/global",
defaultConfig: {
fieldOrder: ["position", "format", "color", "thickness"],
hiddenFields: ["effect", "enabled_in_config"],

View File

@ -11,13 +11,9 @@ export function DescriptionFieldTemplate(props: DescriptionFieldProps) {
const isCameraLevel = formContext?.level === "camera";
const sectionI18nPrefix = formContext?.sectionI18nPrefix;
const i18nNamespace = formContext?.i18nNamespace;
const effectiveNamespace = isCameraLevel ? "config/cameras" : i18nNamespace;
const effectiveNamespace = isCameraLevel ? "config/cameras" : "config/global";
const { t, i18n } = useTranslation([
effectiveNamespace || i18nNamespace || "common",
i18nNamespace || "common",
]);
const { t, i18n } = useTranslation([effectiveNamespace, "common"]);
let resolvedDescription = description;

View File

@ -69,14 +69,11 @@ export function ObjectFieldTemplate(props: ObjectFieldTemplateProps) {
const [isOpen, setIsOpen] = useState(true);
const isCameraLevel = formContext?.level === "camera";
const effectiveNamespace = isCameraLevel
? "config/cameras"
: formContext?.i18nNamespace;
const effectiveNamespace = isCameraLevel ? "config/cameras" : "config/global";
const sectionI18nPrefix = formContext?.sectionI18nPrefix;
const { t, i18n } = useTranslation([
effectiveNamespace || formContext?.i18nNamespace || "common",
formContext?.i18nNamespace || "common",
effectiveNamespace,
"config/groups",
"common",
]);

View File

@ -52,10 +52,8 @@ i18n
"views/system",
"views/exports",
"views/explore",
// Config namespaces: single consolidated global file + camera-level keys
"config/global",
"config/cameras",
// keep these for backwards compatibility with explicit ns usage
"config/validation",
"config/groups",
],

View File

@ -203,98 +203,81 @@ const CameraConfigContent = memo(function CameraConfigContent({
const sections: Array<{
key: string;
i18nNamespace: string;
component: typeof DetectSection;
showOverrideIndicator?: boolean;
}> = [
{
key: "detect",
i18nNamespace: "config/cameras",
component: DetectSection,
},
{
key: "ffmpeg",
i18nNamespace: "config/cameras",
component: FfmpegSection,
showOverrideIndicator: true,
},
{
key: "record",
i18nNamespace: "config/cameras",
component: RecordSection,
},
{
key: "snapshots",
i18nNamespace: "config/cameras",
component: SnapshotsSection,
},
{
key: "motion",
i18nNamespace: "config/cameras",
component: MotionSection,
},
{
key: "objects",
i18nNamespace: "config/cameras",
component: ObjectsSection,
},
{
key: "review",
i18nNamespace: "config/cameras",
component: ReviewSection,
},
{ key: "audio", i18nNamespace: "config/cameras", component: AudioSection },
{ key: "audio", component: AudioSection },
{
key: "audio_transcription",
i18nNamespace: "config/cameras",
component: AudioTranscriptionSection,
showOverrideIndicator: true,
},
{
key: "notifications",
i18nNamespace: "config/cameras",
component: NotificationsSection,
},
{ key: "live", i18nNamespace: "config/cameras", component: LiveSection },
{ key: "live", component: LiveSection },
{
key: "birdseye",
i18nNamespace: "config/cameras",
component: BirdseyeSection,
showOverrideIndicator: true,
},
{
key: "face_recognition",
i18nNamespace: "config/cameras",
component: FaceRecognitionSection,
showOverrideIndicator: true,
},
{
key: "lpr",
i18nNamespace: "config/cameras",
component: LprSection,
showOverrideIndicator: true,
},
{
key: "mqtt",
i18nNamespace: "config/cameras",
component: CameraMqttSection,
showOverrideIndicator: false,
},
{
key: "onvif",
i18nNamespace: "config/cameras",
component: OnvifSection,
showOverrideIndicator: false,
},
{
key: "ui",
i18nNamespace: "config/cameras",
component: CameraUiSection,
showOverrideIndicator: false,
},
{
key: "timestamp_style",
i18nNamespace: "config/cameras",
component: TimestampSection,
},
];

View File

@ -30,25 +30,22 @@ import { cn } from "@/lib/utils";
// Shared sections that can be overridden at camera level
const sharedSections = [
{ key: "detect", i18nNamespace: "config/global", component: DetectSection },
{ key: "record", i18nNamespace: "config/global", component: RecordSection },
{ key: "detect", component: DetectSection },
{ key: "record", component: RecordSection },
{
key: "snapshots",
i18nNamespace: "config/global",
component: SnapshotsSection,
},
{ key: "motion", i18nNamespace: "config/global", component: MotionSection },
{ key: "motion", component: MotionSection },
{
key: "objects",
i18nNamespace: "config/global",
component: ObjectsSection,
},
{ key: "review", i18nNamespace: "config/global", component: ReviewSection },
{ key: "audio", i18nNamespace: "config/global", component: AudioSection },
{ key: "live", i18nNamespace: "config/global", component: LiveSection },
{ key: "review", component: ReviewSection },
{ key: "audio", component: AudioSection },
{ key: "live", component: LiveSection },
{
key: "timestamp_style",
i18nNamespace: "config/global",
component: TimestampSection,
},
];
@ -61,12 +58,10 @@ const globalSectionConfigs: Record<
hiddenFields?: string[];
advancedFields?: string[];
liveValidate?: boolean;
i18nNamespace: string;
uiSchema?: Record<string, unknown>;
}
> = {
mqtt: {
i18nNamespace: "config/global",
fieldOrder: [
"enabled",
"host",
@ -93,12 +88,10 @@ const globalSectionConfigs: Record<
liveValidate: true,
},
database: {
i18nNamespace: "config/global",
fieldOrder: ["path"],
advancedFields: [],
},
auth: {
i18nNamespace: "config/global",
fieldOrder: [
"enabled",
"reset_admin_password",
@ -130,17 +123,14 @@ const globalSectionConfigs: Record<
},
},
tls: {
i18nNamespace: "config/global",
fieldOrder: ["enabled", "cert", "key"],
advancedFields: [],
},
networking: {
i18nNamespace: "config/global",
fieldOrder: ["ipv6"],
advancedFields: [],
},
proxy: {
i18nNamespace: "config/global",
fieldOrder: [
"header_map",
"logout_url",
@ -152,7 +142,6 @@ const globalSectionConfigs: Record<
liveValidate: true,
},
ui: {
i18nNamespace: "config/global",
fieldOrder: [
"timezone",
"time_format",
@ -163,22 +152,18 @@ const globalSectionConfigs: Record<
advancedFields: [],
},
logger: {
i18nNamespace: "config/global",
fieldOrder: ["default", "logs"],
advancedFields: ["logs"],
},
environment_vars: {
i18nNamespace: "config/global",
fieldOrder: [],
advancedFields: [],
},
telemetry: {
i18nNamespace: "config/global",
fieldOrder: ["network_interfaces", "stats", "version_check"],
advancedFields: [],
},
birdseye: {
i18nNamespace: "config/global",
fieldOrder: [
"enabled",
"restream",
@ -193,7 +178,6 @@ const globalSectionConfigs: Record<
advancedFields: ["width", "height", "quality", "inactivity_threshold"],
},
ffmpeg: {
i18nNamespace: "config/global",
fieldOrder: [
"path",
"global_args",
@ -253,12 +237,10 @@ const globalSectionConfigs: Record<
},
},
detectors: {
i18nNamespace: "config/global",
fieldOrder: [],
advancedFields: [],
},
model: {
i18nNamespace: "config/global",
fieldOrder: [
"path",
"labelmap_path",
@ -278,7 +260,6 @@ const globalSectionConfigs: Record<
hiddenFields: ["labelmap", "attributes_map"],
},
genai: {
i18nNamespace: "config/global",
fieldOrder: [
"provider",
"api_key",
@ -291,22 +272,18 @@ const globalSectionConfigs: Record<
hiddenFields: ["genai.enabled_in_config"],
},
classification: {
i18nNamespace: "config/global",
hiddenFields: ["custom"],
advancedFields: [],
},
semantic_search: {
i18nNamespace: "config/global",
fieldOrder: ["enabled", "reindex", "model", "model_size", "device"],
advancedFields: ["reindex", "device"],
},
audio_transcription: {
i18nNamespace: "config/global",
fieldOrder: ["enabled", "language", "device", "model_size", "live_enabled"],
advancedFields: ["language", "device", "model_size"],
},
face_recognition: {
i18nNamespace: "config/global",
fieldOrder: [
"enabled",
"model_size",
@ -331,7 +308,6 @@ const globalSectionConfigs: Record<
],
},
lpr: {
i18nNamespace: "config/global",
fieldOrder: [
"enabled",
"model_size",
@ -406,11 +382,7 @@ function GlobalConfigSection({
title,
}: GlobalConfigSectionProps) {
const sectionConfig = globalSectionConfigs[sectionKey];
const { t } = useTranslation([
sectionConfig?.i18nNamespace || "common",
"views/settings",
"common",
]);
const { t } = useTranslation(["config/global", "views/settings", "common"]);
const [pendingData, setPendingData] = useState<unknown | null>(null);
const [isSaving, setIsSaving] = useState(false);
const [formKey, setFormKey] = useState(0);
@ -522,8 +494,8 @@ function GlobalConfigSection({
liveValidate={sectionConfig.liveValidate}
uiSchema={sectionConfig.uiSchema}
showSubmit={false}
formContext={{ sectionI18nPrefix: sectionKey }}
i18nNamespace="config/global"
formContext={{ level: "global", sectionI18nPrefix: sectionKey }}
disabled={isSaving}
/>
@ -585,13 +557,11 @@ export default function GlobalConfigView() {
} else if (activeTab === "system") {
return systemSections.map((key) => ({
key,
i18nNamespace: globalSectionConfigs[key].i18nNamespace,
component: null, // Uses GlobalConfigSection instead
}));
} else {
return integrationSections.map((key) => ({
key,
i18nNamespace: globalSectionConfigs[key].i18nNamespace,
component: null,
}));
}
@ -721,21 +691,12 @@ export default function GlobalConfigView() {
{activeTab === "system" && (
<>
{systemSections.map((sectionKey) => {
const ns = globalSectionConfigs[sectionKey].i18nNamespace;
const sectionTitle =
ns === "config/global"
? t(`${sectionKey}.label`, {
ns: "config/global",
defaultValue:
sectionKey.charAt(0).toUpperCase() +
sectionKey.slice(1).replace(/_/g, " "),
})
: t("label", {
ns,
defaultValue:
sectionKey.charAt(0).toUpperCase() +
sectionKey.slice(1).replace(/_/g, " "),
});
const sectionTitle = t(`${sectionKey}.label`, {
ns: "config/global",
defaultValue:
sectionKey.charAt(0).toUpperCase() +
sectionKey.slice(1).replace(/_/g, " "),
});
return (
<div
@ -760,21 +721,12 @@ export default function GlobalConfigView() {
{activeTab === "integrations" && (
<>
{integrationSections.map((sectionKey) => {
const ns = globalSectionConfigs[sectionKey].i18nNamespace;
const sectionTitle =
ns === "config/global"
? t(`${sectionKey}.label`, {
ns: "config/global",
defaultValue:
sectionKey.charAt(0).toUpperCase() +
sectionKey.slice(1).replace(/_/g, " "),
})
: t("label", {
ns,
defaultValue:
sectionKey.charAt(0).toUpperCase() +
sectionKey.slice(1).replace(/_/g, " "),
});
const sectionTitle = t(`${sectionKey}.label`, {
ns: "config/global",
defaultValue:
sectionKey.charAt(0).toUpperCase() +
sectionKey.slice(1).replace(/_/g, " "),
});
return (
<div