Full UI configuration (#22151)

* use react-jsonschema-form for UI config

* don't use properties wrapper when generating config i18n json

* configure for full i18n support

* section fields

* add descriptions to all fields for i18n

* motion i18n

* fix nullable fields

* sanitize internal fields

* add switches widgets and use friendly names

* fix nullable schema entries

* ensure update_topic is added to api calls

this needs further backend implementation to work correctly

* add global sections, camera config overrides, and reset button

* i18n

* add reset logic to global config view

* tweaks

* fix sections and live validation

* fix validation for schema objects that can be null

* generic and custom per-field validation

* improve generic error validation messages

* remove show advanced fields switch

* tweaks

* use shadcn theme

* fix array field template

* i18n tweaks

* remove collapsible around root section

* deep merge schema for advanced fields

* add array field item template and fix ffmpeg section

* add missing i18n keys

* tweaks

* comment out api call for testing

* add config groups as a separate i18n namespace

* add descriptions to all pydantic fields

* make titles more concise

* new titles as i18n

* update i18n config generation script to use json schema

* tweaks

* tweaks

* rebase

* clean up

* form tweaks

* add wildcards and fix object filter fields

* add field template for additionalproperties schema objects

* improve typing

* add section description from schema and clarify global vs camera level descriptions

* separate and consolidate global and camera i18n namespaces

* clean up now obsolete namespaces

* tweaks

* refactor sections and overrides

* add ability to render components before and after fields

* fix titles

* chore(sections): remove legacy single-section components replaced by template

* refactor configs to use individual files with a template

* fix review description

* apply hidden fields after ui schema

* move util

* remove unused i18n

* clean up error messages

* fix fast refresh

* add custom validation and use it for ffmpeg input roles

* update nav tree

* remove unused

* re-add override and modified indicators

* mark pending changes and add confirmation dialog for resets

* fix red unsaved dot

* tweaks

* add docs links, readonly keys, and restart required per field

* add special case and comments for global motion section

* add section form special cases

* combine review sections

* tweaks

* add audio labels endpoint

* add audio label switches and input to filter list

* fix type

* remove key from config when resetting to default/global

* don't show description for new key/val fields

* tweaks

* spacing tweaks

* add activity indicator and scrollbar tweaks

* add docs to filter fields

* wording changes

* fix global ffmpeg section

* add review classification zones to review form

* add backend endpoint and frontend widget for ffmpeg presets and manual args

* improve wording

* hide descriptions for additional properties arrays

* add warning log about incorrectly nested model config

* spacing and language tweaks

* fix i18n keys

* networking section docs and description

* small wording tweaks

* add layout grid field

* refactor with shared utilities

* field order

* add individual detectors to schema

add detector titles and descriptions (docstrings in pydantic are used for descriptions) and add i18n keys to globals

* clean up detectors section and i18n

* don't save model config back to yaml when saving detectors

* add full detectors config to api model dump

works around the way we use detector plugins so we can have the full detector config for the frontend

* add restart button to toast when restart is required

* add ui option to remove inner cards

* fix buttons

* section tweaks

* don't zoom into text on mobile

* make buttons sticky at bottom of sections

* small tweaks

* highlight label of changed fields

* add null to enum list when unwrapping

* refactor to shared utils and add save all button

* add undo all button

* add RJSF to dictionary

* consolidate utils

* preserve form data when changing cameras

* add mono fonts

* add popover to show what fields will be saved

* fix mobile menu not re-rendering with unsaved dots

* tweaks

* fix logger and env vars config section saving

use escaped periods in keys to retain them in the config file (eg "frigate.embeddings")

* add timezone widget

* role map field with validation

* fix validation for model section

* add another hidden field

* add footer message for required restart

* use rjsf for notifications view

* fix config saving

* add replace rules field

* default column layout and add field sizing

* clean up field template

* refactor profile settings to match rjsf forms

* tweaks

* refactor frigate+ view and make tweaks to sections

* show frigate+ model info in detection model settings when using a frigate+ model

* update restartRequired for all fields

* fix restart fields

* tweaks and add ability enable disabled cameras

more backend changes required

* require restart when enabling camera that is disabled in config

* disable save when form is invalid

* refactor ffmpeg section for readability

* change label

* clean up camera inputs fields

* misc tweaks to ffmpeg section

- add raw paths endpoint to ensure credentials get saved
- restart required tooltip

* maintenance settings tweaks

* don't mutate with lodash

* fix description re-rendering for nullable object fields

* hide reindex field

* update rjsf

* add frigate+ description to settings pane

* disable save all when any section is invalid

* show translated field name in validation error pane

* clean up

* remove unused

* fix genai merge

* fix genai
This commit is contained in:
Josh Hawkins
2026-02-27 08:55:36 -07:00
committed by GitHub
parent eeefbf2bb5
commit e7250f24cb
206 changed files with 22200 additions and 4435 deletions
+10 -1
View File
@@ -115,8 +115,10 @@
"internalID": "The Internal ID Frigate uses in the configuration and database"
},
"button": {
"add": "Add",
"apply": "Apply",
"reset": "Reset",
"undo": "Undo",
"done": "Done",
"enabled": "Enabled",
"enable": "Enable",
@@ -150,7 +152,14 @@
"export": "Export",
"deleteNow": "Delete Now",
"next": "Next",
"continue": "Continue"
"continue": "Continue",
"modified": "Modified",
"overridden": "Overridden",
"resetToGlobal": "Reset to Global",
"resetToDefault": "Reset to Default",
"saveAll": "Save All",
"savingAll": "Saving All…",
"undoAll": "Undo All"
},
"menu": {
"system": "System",
-26
View File
@@ -1,26 +0,0 @@
{
"label": "Global Audio events configuration.",
"properties": {
"enabled": {
"label": "Enable audio events."
},
"max_not_heard": {
"label": "Seconds of not hearing the type of audio to end the event."
},
"min_volume": {
"label": "Min volume required to run audio detection."
},
"listen": {
"label": "Audio to listen for."
},
"filters": {
"label": "Audio filters."
},
"enabled_in_config": {
"label": "Keep track of original state of audio detection."
},
"num_threads": {
"label": "Number of detection threads"
}
}
}
@@ -1,23 +0,0 @@
{
"label": "Audio transcription config.",
"properties": {
"enabled": {
"label": "Enable audio transcription."
},
"language": {
"label": "Language abbreviation to use for audio event transcription/translation."
},
"device": {
"label": "The device used for license plate recognition."
},
"model_size": {
"label": "The size of the embeddings model used."
},
"enabled_in_config": {
"label": "Keep track of original state of camera."
},
"live_enabled": {
"label": "Enable live transcriptions."
}
}
}
-35
View File
@@ -1,35 +0,0 @@
{
"label": "Auth configuration.",
"properties": {
"enabled": {
"label": "Enable authentication"
},
"reset_admin_password": {
"label": "Reset the admin password on startup"
},
"cookie_name": {
"label": "Name for jwt token cookie"
},
"cookie_secure": {
"label": "Set secure flag on cookie"
},
"session_length": {
"label": "Session length for jwt session tokens"
},
"refresh_time": {
"label": "Refresh the session if it is going to expire in this many seconds"
},
"failed_login_rate_limit": {
"label": "Rate limits for failed login attempts."
},
"trusted_proxies": {
"label": "Trusted proxies for determining IP address to rate limit"
},
"hash_iterations": {
"label": "Password hash iterations"
},
"roles": {
"label": "Role to camera mappings. Empty list grants access to all cameras."
}
}
}
@@ -1,37 +0,0 @@
{
"label": "Birdseye configuration.",
"properties": {
"enabled": {
"label": "Enable birdseye view."
},
"mode": {
"label": "Tracking mode."
},
"restream": {
"label": "Restream birdseye via RTSP."
},
"width": {
"label": "Birdseye width."
},
"height": {
"label": "Birdseye height."
},
"quality": {
"label": "Encoding quality."
},
"inactivity_threshold": {
"label": "Birdseye Inactivity Threshold"
},
"layout": {
"label": "Birdseye Layout Config",
"properties": {
"scaling_factor": {
"label": "Birdseye Scaling Factor"
},
"max_cameras": {
"label": "Max cameras"
}
}
}
}
}
@@ -1,14 +0,0 @@
{
"label": "Camera group configuration",
"properties": {
"cameras": {
"label": "List of cameras in this group."
},
"icon": {
"label": "Icon that represents camera group."
},
"order": {
"label": "Sort order for group."
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,58 +0,0 @@
{
"label": "Object classification config.",
"properties": {
"bird": {
"label": "Bird classification config.",
"properties": {
"enabled": {
"label": "Enable bird classification."
},
"threshold": {
"label": "Minimum classification score required to be considered a match."
}
}
},
"custom": {
"label": "Custom Classification Model Configs.",
"properties": {
"enabled": {
"label": "Enable running the model."
},
"name": {
"label": "Name of classification model."
},
"threshold": {
"label": "Classification score threshold to change the state."
},
"object_config": {
"properties": {
"objects": {
"label": "Object types to classify."
},
"classification_type": {
"label": "Type of classification that is applied."
}
}
},
"state_config": {
"properties": {
"cameras": {
"label": "Cameras to run classification on.",
"properties": {
"crop": {
"label": "Crop of image frame on this camera to run classification on."
}
}
},
"motion": {
"label": "If classification should be run when motion is detected in the crop."
},
"interval": {
"label": "Interval to run classification on in seconds."
}
}
}
}
}
}
}
@@ -1,8 +0,0 @@
{
"label": "Database configuration.",
"properties": {
"path": {
"label": "Database path."
}
}
}
-51
View File
@@ -1,51 +0,0 @@
{
"label": "Global object tracking configuration.",
"properties": {
"enabled": {
"label": "Detection Enabled."
},
"height": {
"label": "Height of the stream for the detect role."
},
"width": {
"label": "Width of the stream for the detect role."
},
"fps": {
"label": "Number of frames per second to process through detection."
},
"min_initialized": {
"label": "Minimum number of consecutive hits for an object to be initialized by the tracker."
},
"max_disappeared": {
"label": "Maximum number of frames the object can disappear before detection ends."
},
"stationary": {
"label": "Stationary objects config.",
"properties": {
"interval": {
"label": "Frame interval for checking stationary objects."
},
"threshold": {
"label": "Number of frames without a position change for an object to be considered stationary"
},
"max_frames": {
"label": "Max frames for stationary objects.",
"properties": {
"default": {
"label": "Default max frames."
},
"objects": {
"label": "Object specific max frames."
}
}
},
"classifier": {
"label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary."
}
}
},
"annotation_offset": {
"label": "Milliseconds to offset detect annotations by."
}
}
}
@@ -1,14 +0,0 @@
{
"label": "Detector hardware configuration.",
"properties": {
"type": {
"label": "Detector Type"
},
"model": {
"label": "Detector specific model configuration."
},
"model_path": {
"label": "Detector specific model path."
}
}
}
@@ -1,3 +0,0 @@
{
"label": "Frigate environment variables."
}
@@ -1,36 +0,0 @@
{
"label": "Face recognition config.",
"properties": {
"enabled": {
"label": "Enable face recognition."
},
"model_size": {
"label": "The size of the embeddings model used."
},
"unknown_score": {
"label": "Minimum face distance score required to be marked as a potential match."
},
"detection_threshold": {
"label": "Minimum face detection score required to be considered a face."
},
"recognition_threshold": {
"label": "Minimum face distance score required to be considered a match."
},
"min_area": {
"label": "Min area of face box to consider running face recognition."
},
"min_faces": {
"label": "Min face recognitions for the sub label to be applied to the person object."
},
"save_attempts": {
"label": "Number of face attempts to save in the recent recognitions tab."
},
"blur_confidence_filter": {
"label": "Apply blur quality filter to face confidence."
},
"device": {
"label": "The device key to use for face recognition.",
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
}
}
}
-34
View File
@@ -1,34 +0,0 @@
{
"label": "Global FFmpeg configuration.",
"properties": {
"path": {
"label": "FFmpeg path"
},
"global_args": {
"label": "Global FFmpeg arguments."
},
"hwaccel_args": {
"label": "FFmpeg hardware acceleration arguments."
},
"input_args": {
"label": "FFmpeg input arguments."
},
"output_args": {
"label": "FFmpeg output arguments per role.",
"properties": {
"detect": {
"label": "Detect role FFmpeg output arguments."
},
"record": {
"label": "Record role FFmpeg output arguments."
}
}
},
"retry_interval": {
"label": "Time in seconds to wait before FFmpeg retries connecting to the camera."
},
"apple_compatibility": {
"label": "Set tag on HEVC (H.265) recording stream to improve compatibility with Apple players."
}
}
}
-23
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."
}
}
}
File diff suppressed because it is too large Load Diff
-3
View File
@@ -1,3 +0,0 @@
{
"label": "Global restream configuration."
}
+73
View File
@@ -0,0 +1,73 @@
{
"audio": {
"global": {
"detection": "Global Detection",
"sensitivity": "Global Sensitivity"
},
"cameras": {
"detection": "Detection",
"sensitivity": "Sensitivity"
}
},
"timestamp_style": {
"global": {
"appearance": "Global Appearance"
},
"cameras": {
"appearance": "Appearance"
}
},
"motion": {
"global": {
"sensitivity": "Global Sensitivity",
"algorithm": "Global Algorithm"
},
"cameras": {
"sensitivity": "Sensitivity",
"algorithm": "Algorithm"
}
},
"snapshots": {
"global": {
"display": "Global Display"
},
"cameras": {
"display": "Display"
}
},
"detect": {
"global": {
"resolution": "Global Resolution",
"tracking": "Global Tracking"
},
"cameras": {
"resolution": "Resolution",
"tracking": "Tracking"
}
},
"objects": {
"global": {
"tracking": "Global Tracking",
"filtering": "Global Filtering"
},
"cameras": {
"tracking": "Tracking",
"filtering": "Filtering"
}
},
"record": {
"global": {
"retention": "Global Retention",
"events": "Global Events"
},
"cameras": {
"retention": "Retention",
"events": "Events"
}
},
"ffmpeg": {
"cameras": {
"cameraFfmpeg": "Camera-specific FFmpeg arguments"
}
}
}
-14
View File
@@ -1,14 +0,0 @@
{
"label": "Live playback settings.",
"properties": {
"streams": {
"label": "Friendly names and restream names to use for live view."
},
"height": {
"label": "Live camera view height"
},
"quality": {
"label": "Live camera view quality"
}
}
}
-11
View File
@@ -1,11 +0,0 @@
{
"label": "Logging configuration.",
"properties": {
"default": {
"label": "Default logging level."
},
"logs": {
"label": "Log level for specified processes."
}
}
}
-45
View File
@@ -1,45 +0,0 @@
{
"label": "License Plate recognition config.",
"properties": {
"enabled": {
"label": "Enable license plate recognition."
},
"model_size": {
"label": "The size of the embeddings model used."
},
"detection_threshold": {
"label": "License plate object confidence score required to begin running recognition."
},
"min_area": {
"label": "Minimum area of license plate to begin running recognition."
},
"recognition_threshold": {
"label": "Recognition confidence score required to add the plate to the object as a sub label."
},
"min_plate_length": {
"label": "Minimum number of characters a license plate must have to be added to the object as a sub label."
},
"format": {
"label": "Regular expression for the expected format of license plate."
},
"match_distance": {
"label": "Allow this number of missing/incorrect characters to still cause a detected plate to match a known plate."
},
"known_plates": {
"label": "Known plates to track (strings or regular expressions)."
},
"enhancement": {
"label": "Amount of contrast adjustment and denoising to apply to license plate images before recognition."
},
"debug_save_plates": {
"label": "Save plates captured for LPR for debugging purposes."
},
"device": {
"label": "The device key to use for LPR.",
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
},
"replace_rules": {
"label": "List of regex replacement rules for normalizing detected plates. Each rule has 'pattern' and 'replacement'."
}
}
}
-35
View File
@@ -1,35 +0,0 @@
{
"label": "Detection model configuration.",
"properties": {
"path": {
"label": "Custom Object detection model path."
},
"labelmap_path": {
"label": "Label map for custom object detector."
},
"width": {
"label": "Object detection model input width."
},
"height": {
"label": "Object detection model input height."
},
"labelmap": {
"label": "Labelmap customization."
},
"attributes_map": {
"label": "Map of object labels to their attribute labels."
},
"input_tensor": {
"label": "Model Input Tensor Shape"
},
"input_pixel_format": {
"label": "Model Input Pixel Color Format"
},
"input_dtype": {
"label": "Model Input D Type"
},
"model_type": {
"label": "Object Detection Model Type"
}
}
}
-3
View File
@@ -1,3 +0,0 @@
{
"label": "Global motion detection configuration."
}
-44
View File
@@ -1,44 +0,0 @@
{
"label": "MQTT configuration.",
"properties": {
"enabled": {
"label": "Enable MQTT Communication."
},
"host": {
"label": "MQTT Host"
},
"port": {
"label": "MQTT Port"
},
"topic_prefix": {
"label": "MQTT Topic Prefix"
},
"client_id": {
"label": "MQTT Client ID"
},
"stats_interval": {
"label": "MQTT Camera Stats Interval"
},
"user": {
"label": "MQTT Username"
},
"password": {
"label": "MQTT Password"
},
"tls_ca_certs": {
"label": "MQTT TLS CA Certificates"
},
"tls_client_cert": {
"label": "MQTT TLS Client Certificate"
},
"tls_client_key": {
"label": "MQTT TLS Client Key"
},
"tls_insecure": {
"label": "MQTT TLS Insecure"
},
"qos": {
"label": "MQTT QoS"
}
}
}
@@ -1,24 +0,0 @@
{
"label": "Networking configuration",
"properties": {
"ipv6": {
"label": "IPv6 configuration",
"properties": {
"enabled": {
"label": "Enable IPv6 for port 5000 and/or 8971"
}
}
},
"listen": {
"label": "Listening ports configuration",
"properties": {
"internal": {
"label": "Internal listening port for Frigate"
},
"external": {
"label": "External listening port for Frigate"
}
}
}
}
}
@@ -1,17 +0,0 @@
{
"label": "Global notification configuration.",
"properties": {
"enabled": {
"label": "Enable notifications"
},
"email": {
"label": "Email required for push."
},
"cooldown": {
"label": "Cooldown period for notifications (time in seconds)."
},
"enabled_in_config": {
"label": "Keep track of original state of notifications."
}
}
}
-77
View File
@@ -1,77 +0,0 @@
{
"label": "Global object configuration.",
"properties": {
"track": {
"label": "Objects to track."
},
"filters": {
"label": "Object filters.",
"properties": {
"min_area": {
"label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
},
"max_area": {
"label": "Maximum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
},
"min_ratio": {
"label": "Minimum ratio of bounding box's width/height for object to be counted."
},
"max_ratio": {
"label": "Maximum ratio of bounding box's width/height for object to be counted."
},
"threshold": {
"label": "Average detection confidence threshold for object to be counted."
},
"min_score": {
"label": "Minimum detection confidence for object to be counted."
},
"mask": {
"label": "Detection area polygon mask for this filter configuration."
}
}
},
"mask": {
"label": "Object mask."
},
"genai": {
"label": "Config for using genai to analyze objects.",
"properties": {
"enabled": {
"label": "Enable GenAI for camera."
},
"use_snapshot": {
"label": "Use snapshots for generating descriptions."
},
"prompt": {
"label": "Default caption prompt."
},
"object_prompts": {
"label": "Object specific prompts."
},
"objects": {
"label": "List of objects to run generative AI for."
},
"required_zones": {
"label": "List of required zones to be entered in order to run generative AI."
},
"debug_save_thumbnails": {
"label": "Save thumbnails sent to generative AI for debugging purposes."
},
"send_triggers": {
"label": "What triggers to use to send frames to generative AI for a tracked object.",
"properties": {
"tracked_object_end": {
"label": "Send once the object is no longer tracked."
},
"after_significant_updates": {
"label": "Send an early request to generative AI when X frames accumulated."
}
}
},
"enabled_in_config": {
"label": "Keep track of original state of generative AI."
}
}
}
}
}
-31
View File
@@ -1,31 +0,0 @@
{
"label": "Proxy configuration.",
"properties": {
"header_map": {
"label": "Header mapping definitions for proxy user passing.",
"properties": {
"user": {
"label": "Header name from upstream proxy to identify user."
},
"role": {
"label": "Header name from upstream proxy to identify user role."
},
"role_map": {
"label": "Mapping of Frigate roles to upstream group values. "
}
}
},
"logout_url": {
"label": "Redirect url for logging out with proxy."
},
"auth_secret": {
"label": "Secret value for proxy authentication."
},
"default_role": {
"label": "Default role for proxy users."
},
"separator": {
"label": "The character used to separate values in a mapped header."
}
}
}
-90
View File
@@ -1,90 +0,0 @@
{
"label": "Global record configuration.",
"properties": {
"enabled": {
"label": "Enable record on all cameras."
},
"expire_interval": {
"label": "Number of minutes to wait between cleanup runs."
},
"continuous": {
"label": "Continuous recording retention settings.",
"properties": {
"days": {
"label": "Default retention period."
}
}
},
"motion": {
"label": "Motion recording retention settings.",
"properties": {
"days": {
"label": "Default retention period."
}
}
},
"detections": {
"label": "Detection specific retention settings.",
"properties": {
"pre_capture": {
"label": "Seconds to retain before event starts."
},
"post_capture": {
"label": "Seconds to retain after event ends."
},
"retain": {
"label": "Event retention settings.",
"properties": {
"days": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
}
}
}
}
},
"alerts": {
"label": "Alert specific retention settings.",
"properties": {
"pre_capture": {
"label": "Seconds to retain before event starts."
},
"post_capture": {
"label": "Seconds to retain after event ends."
},
"retain": {
"label": "Event retention settings.",
"properties": {
"days": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
}
}
}
}
},
"export": {
"label": "Recording Export Config",
"properties": {
"timelapse_args": {
"label": "Timelapse Args"
}
}
},
"preview": {
"label": "Recording Preview Config",
"properties": {
"quality": {
"label": "Quality of recording preview."
}
}
},
"enabled_in_config": {
"label": "Keep track of original state of recording."
}
}
}
-74
View File
@@ -1,74 +0,0 @@
{
"label": "Review configuration.",
"properties": {
"alerts": {
"label": "Review alerts config.",
"properties": {
"enabled": {
"label": "Enable alerts."
},
"labels": {
"label": "Labels to create alerts for."
},
"required_zones": {
"label": "List of required zones to be entered in order to save the event as an alert."
},
"enabled_in_config": {
"label": "Keep track of original state of alerts."
},
"cutoff_time": {
"label": "Time to cutoff alerts after no alert-causing activity has occurred."
}
}
},
"detections": {
"label": "Review detections config.",
"properties": {
"enabled": {
"label": "Enable detections."
},
"labels": {
"label": "Labels to create detections for."
},
"required_zones": {
"label": "List of required zones to be entered in order to save the event as a detection."
},
"cutoff_time": {
"label": "Time to cutoff detection after no detection-causing activity has occurred."
},
"enabled_in_config": {
"label": "Keep track of original state of detections."
}
}
},
"genai": {
"label": "Review description genai config.",
"properties": {
"enabled": {
"label": "Enable GenAI descriptions for review items."
},
"alerts": {
"label": "Enable GenAI for alerts."
},
"detections": {
"label": "Enable GenAI for detections."
},
"additional_concerns": {
"label": "Additional concerns that GenAI should make note of on this camera."
},
"debug_save_thumbnails": {
"label": "Save thumbnails sent to generative AI for debugging purposes."
},
"enabled_in_config": {
"label": "Keep track of original state of generative AI."
},
"preferred_language": {
"label": "Preferred language for GenAI Response"
},
"activity_context_prompt": {
"label": "Custom activity context prompt defining normal activity patterns for this property."
}
}
}
}
}
@@ -1,3 +0,0 @@
{
"label": "If Frigate should be started in safe mode."
}
@@ -1,21 +0,0 @@
{
"label": "Semantic search configuration.",
"properties": {
"enabled": {
"label": "Enable semantic search."
},
"reindex": {
"label": "Reindex all tracked objects on startup."
},
"model": {
"label": "The CLIP model to use for semantic search."
},
"model_size": {
"label": "The size of the embeddings model used."
},
"device": {
"label": "The device key to use for semantic search.",
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
}
}
}
@@ -1,43 +0,0 @@
{
"label": "Global snapshots configuration.",
"properties": {
"enabled": {
"label": "Snapshots enabled."
},
"clean_copy": {
"label": "Create a clean copy of the snapshot image."
},
"timestamp": {
"label": "Add a timestamp overlay on the snapshot."
},
"bounding_box": {
"label": "Add a bounding box overlay on the snapshot."
},
"crop": {
"label": "Crop the snapshot to the detected object."
},
"required_zones": {
"label": "List of required zones to be entered in order to save a snapshot."
},
"height": {
"label": "Snapshot image height."
},
"retain": {
"label": "Snapshot retention.",
"properties": {
"default": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
},
"objects": {
"label": "Object retention period."
}
}
},
"quality": {
"label": "Quality of the encoded jpeg (0-100)."
}
}
}
@@ -1,28 +0,0 @@
{
"label": "Telemetry configuration.",
"properties": {
"network_interfaces": {
"label": "Enabled network interfaces for bandwidth calculation."
},
"stats": {
"label": "System Stats Configuration",
"properties": {
"amd_gpu_stats": {
"label": "Enable AMD GPU stats."
},
"intel_gpu_stats": {
"label": "Enable Intel GPU stats."
},
"network_bandwidth": {
"label": "Enable network bandwidth for ffmpeg processes."
},
"intel_gpu_device": {
"label": "Define the device to use when gathering SR-IOV stats."
}
}
},
"version_check": {
"label": "Enable latest version check."
}
}
}
@@ -1,31 +0,0 @@
{
"label": "Global timestamp style configuration.",
"properties": {
"position": {
"label": "Timestamp position."
},
"format": {
"label": "Timestamp format."
},
"color": {
"label": "Timestamp color.",
"properties": {
"red": {
"label": "Red"
},
"green": {
"label": "Green"
},
"blue": {
"label": "Blue"
}
}
},
"thickness": {
"label": "Timestamp thickness."
},
"effect": {
"label": "Timestamp effect."
}
}
}
-8
View File
@@ -1,8 +0,0 @@
{
"label": "TLS configuration.",
"properties": {
"enabled": {
"label": "Enable TLS for port 8971"
}
}
}
-20
View File
@@ -1,20 +0,0 @@
{
"label": "UI configuration.",
"properties": {
"timezone": {
"label": "Override UI timezone."
},
"time_format": {
"label": "Override UI time format."
},
"date_style": {
"label": "Override UI dateStyle."
},
"time_style": {
"label": "Override UI timeStyle."
},
"unit_system": {
"label": "The unit system to use for measurements."
}
}
}
@@ -0,0 +1,32 @@
{
"minimum": "Must be at least {{limit}}",
"maximum": "Must be at most {{limit}}",
"exclusiveMinimum": "Must be greater than {{limit}}",
"exclusiveMaximum": "Must be less than {{limit}}",
"minLength": "Must be at least {{limit}} character(s)",
"maxLength": "Must be at most {{limit}} character(s)",
"minItems": "Must have at least {{limit}} items",
"maxItems": "Must have at most {{limit}} items",
"pattern": "Invalid format",
"required": "This field is required",
"type": "Invalid value type",
"enum": "Must be one of the allowed values",
"const": "Value does not match expected constant",
"uniqueItems": "All items must be unique",
"format": "Invalid format",
"additionalProperties": "Unknown property is not allowed",
"oneOf": "Must match exactly one of the allowed schemas",
"anyOf": "Must match at least one of the allowed schemas",
"proxy": {
"header_map": {
"roleHeaderRequired": "Role header is required when role mappings are configured."
}
},
"ffmpeg": {
"inputs": {
"rolesUnique": "Each role can only be assigned to one input stream.",
"detectRequired": "At least one input stream must be assigned the 'detect' role.",
"hwaccelDetectOnly": "Only the input stream with the detect role can define hardware acceleration arguments."
}
}
}
@@ -1,3 +0,0 @@
{
"label": "Current config version."
}
+280 -11
View File
@@ -8,23 +8,82 @@
"masksAndZones": "Mask and Zone Editor - Frigate",
"motionTuner": "Motion Tuner - Frigate",
"object": "Debug - Frigate",
"general": "UI Settings - Frigate",
"general": "Profile Settings - Frigate",
"globalConfig": "Global Configuration - Frigate",
"cameraConfig": "Camera Configuration - Frigate",
"frigatePlus": "Frigate+ Settings - Frigate",
"notifications": "Notification Settings - Frigate"
"notifications": "Notification Settings - Frigate",
"maintenance": "Maintenance - Frigate"
},
"menu": {
"general": "General",
"globalConfig": "Global configuration",
"system": "System",
"integrations": "Integrations",
"cameras": "Camera configuration",
"ui": "UI",
"enrichments": "Enrichments",
"profileSettings": "Profile settings",
"globalDetect": "Object detection",
"globalRecording": "Recording",
"globalSnapshots": "Snapshots",
"globalFfmpeg": "FFmpeg",
"globalMotion": "Motion detection",
"globalObjects": "Objects",
"globalReview": "Review",
"globalAudioEvents": "Audio events",
"globalLivePlayback": "Live playback",
"globalTimestampStyle": "Timestamp style",
"systemDatabase": "Database",
"systemTls": "TLS",
"systemAuthentication": "Authentication",
"systemNetworking": "Networking",
"systemProxy": "Proxy",
"systemUi": "UI",
"systemLogging": "Logging",
"systemEnvironmentVariables": "Environment variables",
"systemTelemetry": "Telemetry",
"systemBirdseye": "Birdseye",
"systemFfmpeg": "FFmpeg",
"systemDetectorHardware": "Detector hardware",
"systemDetectionModel": "Detection model",
"systemMqtt": "MQTT",
"integrationSemanticSearch": "Semantic search",
"integrationGenerativeAi": "Generative AI",
"integrationFaceRecognition": "Face recognition",
"integrationLpr": "License plate recognition",
"integrationObjectClassification": "Object classification",
"integrationAudioTranscription": "Audio transcription",
"cameraDetect": "Object detection",
"cameraFfmpeg": "FFmpeg",
"cameraRecording": "Recording",
"cameraSnapshots": "Snapshots",
"cameraMotion": "Motion detection",
"cameraObjects": "Objects",
"cameraConfigReview": "Review",
"cameraAudioEvents": "Audio events",
"cameraAudioTranscription": "Audio transcription",
"cameraNotifications": "Notifications",
"cameraLivePlayback": "Live playback",
"cameraBirdseye": "Birdseye",
"cameraFaceRecognition": "Face recognition",
"cameraLpr": "License plate recognition",
"cameraMqttConfig": "MQTT",
"cameraOnvif": "ONVIF",
"cameraUi": "Camera UI",
"cameraTimestampStyle": "Timestamp style",
"cameraMqtt": "Camera MQTT",
"cameraManagement": "Management",
"cameraReview": "Review",
"masksAndZones": "Masks / Zones",
"motionTuner": "Motion Tuner",
"triggers": "Triggers",
"debug": "Debug",
"motionTuner": "Motion tuner",
"enrichments": "Enrichments",
"users": "Users",
"roles": "Roles",
"notifications": "Notifications",
"frigateplus": "Frigate+"
"triggers": "Triggers",
"debug": "Debug",
"frigateplus": "Frigate+",
"maintenance": "Maintenance"
},
"dialog": {
"unsavedChanges": {
@@ -32,12 +91,29 @@
"desc": "Do you want to save your changes before continuing?"
}
},
"saveAllPreview": {
"title": "Changes to be saved",
"triggerLabel": "Review pending changes",
"empty": "No pending changes.",
"scope": {
"label": "Scope",
"global": "Global",
"camera": "Camera: {{cameraName}}"
},
"field": {
"label": "Field"
},
"value": {
"label": "New value",
"reset": "Reset"
}
},
"cameraSetting": {
"camera": "Camera",
"noCamera": "No Camera"
},
"general": {
"title": "UI Settings",
"title": "Profile Settings",
"liveDashboard": {
"title": "Live Dashboard",
"automaticLiveView": {
@@ -106,7 +182,7 @@
"desc": "Semantic Search in Frigate allows you to find tracked objects within your review items using either the image itself, a user-defined text description, or an automatically generated one.",
"reindexNow": {
"label": "Reindex Now",
"desc": "Reindexing will regenerate embeddings for all tracked object. This process runs in the background and may max out your CPU and take a fair amount of time depending on the number of tracked objects you have.",
"desc": "Reindexing will regenerate embeddings for all tracked objects. This process runs in the background and may max out your CPU and take a fair amount of time depending on the number of tracked objects you have.",
"confirmTitle": "Confirm Reindexing",
"confirmDesc": "Are you sure you want to reindex all tracked object embeddings? This process will run in the background but it may max out your CPU and take a fair amount of time. You can watch the progress on the Explore page.",
"confirmButton": "Reindex",
@@ -350,7 +426,11 @@
"backToSettings": "Back to Camera Settings",
"streams": {
"title": "Enable / Disable Cameras",
"desc": "Temporarily disable a camera until Frigate restarts. Disabling a camera completely stops Frigate's processing of this camera's streams. Detection, recording, and debugging will be unavailable.<br /> <em>Note: This does not disable go2rtc restreams.</em>"
"enableLabel": "Enabled cameras",
"enableDesc": "Temporarily disable an enabled camera until Frigate restarts. Disabling a camera completely stops Frigate's processing of this camera's streams. Detection, recording, and debugging will be unavailable.<br /> <em>Note: This does not disable go2rtc restreams.</em>",
"disableLabel": "Disabled cameras",
"disableDesc": "Enable a camera that is currently not visible in the UI and disabled in the configuration. A restart of Frigate is required after enabling.",
"enableSuccess": "Enabled {{cameraName}} in configuration. Restart Frigate to apply the changes."
},
"cameraConfig": {
"add": "Add Camera",
@@ -906,6 +986,13 @@
},
"frigatePlus": {
"title": "Frigate+ Settings",
"description": "Frigate+ is a subscription service that provides access to additional features and capabilities for your Frigate instance, including the ability to use custom object detection models trained on your own data. You can manage your Frigate+ model settings here.",
"cardTitles": {
"api": "API",
"currentModel": "Current Model",
"otherModels": "Other Models",
"configuration": "Configuration"
},
"apiKey": {
"title": "Frigate+ API Key",
"validated": "Frigate+ API key is detected and validated",
@@ -947,6 +1034,15 @@
"error": "Failed to save config changes: {{errorMessage}}"
}
},
"detectionModel": {
"plusActive": {
"title": "Frigate+ model management",
"label": "Current model source",
"description": "This instance is running a Frigate+ model. Select or change your model in Frigate+ settings.",
"goToFrigatePlus": "Go to Frigate+ settings",
"showModelForm": "Manually configure a model"
}
},
"triggers": {
"documentTitle": "Triggers",
"semanticSearch": {
@@ -1115,5 +1211,178 @@
"exports": "Exports",
"recordings": "Recordings"
}
}
},
"configForm": {
"global": {
"title": "Global Settings",
"description": "These settings apply to all cameras unless overridden in the camera-specific settings."
},
"camera": {
"title": "Camera Settings",
"description": "These settings apply only to this camera and override the global settings."
},
"advancedSettingsCount": "Advanced Settings ({{count}})",
"advancedCount": "Advanced ({{count}})",
"showAdvanced": "Show Advanced Settings",
"tabs": {
"sharedDefaults": "Shared Defaults",
"system": "System",
"integrations": "Integrations"
},
"additionalProperties": {
"keyLabel": "Key",
"valueLabel": "Value",
"keyPlaceholder": "New key",
"remove": "Remove"
},
"timezone": {
"defaultOption": "Use browser timezone"
},
"roleMap": {
"empty": "No role mappings",
"roleLabel": "Role",
"groupsLabel": "Groups",
"addMapping": "Add role mapping",
"remove": "Remove"
},
"ffmpegArgs": {
"preset": "Preset",
"manual": "Manual arguments",
"inherit": "Inherit from camera setting",
"selectPreset": "Select preset",
"manualPlaceholder": "Enter FFmpeg arguments"
},
"cameraInputs": {
"itemTitle": "Stream {{index}}"
},
"restartRequiredField": "Restart required",
"restartRequiredFooter": "Configuration changed - Restart required",
"sections": {
"detect": "Detection",
"record": "Recording",
"snapshots": "Snapshots",
"motion": "Motion",
"objects": "Objects",
"review": "Review",
"audio": "Audio",
"notifications": "Notifications",
"live": "Live View",
"timestamp_style": "Timestamps",
"mqtt": "MQTT",
"database": "Database",
"telemetry": "Telemetry",
"auth": "Authentication",
"tls": "TLS",
"proxy": "Proxy",
"go2rtc": "go2rtc",
"ffmpeg": "FFmpeg",
"detectors": "Detectors",
"model": "Model",
"semantic_search": "Semantic Search",
"genai": "GenAI",
"face_recognition": "Face Recognition",
"lpr": "License Plate Recognition",
"birdseye": "Birdseye"
},
"detect": {
"title": "Detection Settings"
},
"detectors": {
"title": "Detector Settings",
"singleType": "Only one {{type}} detector is allowed.",
"keyRequired": "Detector name is required.",
"keyDuplicate": "Detector name already exists.",
"noSchema": "No detector schemas are available.",
"none": "No detector instances configured.",
"add": "Add detector"
},
"record": {
"title": "Recording Settings"
},
"snapshots": {
"title": "Snapshot Settings"
},
"motion": {
"title": "Motion Settings"
},
"objects": {
"title": "Object Settings"
},
"audioLabels": {
"summary": "{{count}} audio labels selected",
"empty": "No audio labels available"
},
"objectLabels": {
"summary": "{{count}} object types selected",
"empty": "No object labels available"
},
"filters": {
"objectFieldLabel": "{{field}} for {{label}}"
},
"zoneNames": {
"summary": "{{count}} selected",
"empty": "No zones available"
},
"inputRoles": {
"summary": "{{count}} roles selected",
"empty": "No roles available",
"options": {
"detect": "Detect",
"record": "Record",
"audio": "Audio"
}
},
"review": {
"title": "Review Settings"
},
"audio": {
"title": "Audio Settings"
},
"notifications": {
"title": "Notification Settings"
},
"live": {
"title": "Live View Settings"
},
"timestamp_style": {
"title": "Timestamp Settings"
},
"searchPlaceholder": "Search..."
},
"globalConfig": {
"title": "Global Configuration",
"description": "Configure global settings that apply to all cameras unless overridden.",
"toast": {
"success": "Global settings saved successfully",
"error": "Failed to save global settings",
"validationError": "Validation failed"
}
},
"cameraConfig": {
"title": "Camera Configuration",
"description": "Configure settings for individual cameras. Settings override global defaults.",
"overriddenBadge": "Overridden",
"resetToGlobal": "Reset to Global",
"toast": {
"success": "Camera settings saved successfully",
"error": "Failed to save camera settings"
}
},
"toast": {
"success": "Settings saved successfully",
"successRestartRequired": "Settings saved successfully. Restart Frigate to apply your changes.",
"error": "Failed to save settings",
"validationError": "Validation failed: {{message}}",
"resetSuccess": "Reset to global defaults",
"resetError": "Failed to reset settings",
"saveAllSuccess_one": "Saved {{count}} section successfully.",
"saveAllSuccess_other": "All {{count}} sections saved successfully.",
"saveAllPartial_one": "{{successCount}} of {{totalCount}} section saved. {{failCount}} failed.",
"saveAllPartial_other": "{{successCount}} of {{totalCount}} sections saved. {{failCount}} failed.",
"saveAllFailure": "Failed to save all sections."
},
"unsavedChanges": "You have unsaved changes",
"confirmReset": "Confirm Reset",
"resetToDefaultDescription": "This will reset all settings in this section to their default values. This action cannot be undone.",
"resetToGlobalDescription": "This will reset the settings in this section to the global defaults. This action cannot be undone."
}