* add CameraProfileConfig model for named config overrides
* add profiles field to CameraConfig
* add active_profile field to FrigateConfig
Runtime-only field excluded from YAML serialization, tracks which
profile is currently active.
* add ProfileManager for profile activation and persistence
Handles snapshotting base configs, applying profile overrides via
deep_merge + apply_section_update, publishing ZMQ updates, and
persisting active profile to /config/.active_profile.
* add profile API endpoints (GET /profiles, GET/PUT /profile)
* add MQTT and dispatcher integration for profiles
- Subscribe to frigate/profile/set MQTT topic
- Publish profile/state and profiles/available on connect
- Add _on_profile_command handler to dispatcher
- Broadcast active profile state on WebSocket connect
* wire ProfileManager into app startup and FastAPI
- Create ProfileManager after dispatcher init
- Restore persisted profile on startup
- Pass dispatcher and profile_manager to FastAPI app
* add tests for invalid profile values and keys
Tests that Pydantic rejects: invalid field values (fps: "not_a_number"),
unknown section keys (ffmpeg in profile), invalid nested values, and
invalid profiles in full config parsing.
* formatting
* fix CameraLiveConfig JSON serialization error on profile activation
refactor _publish_updates to only publish ZMQ updates for
sections that actually changed, not all sections on affected cameras.
* consolidate
* add enabled field to camera profiles for enabling/disabling cameras
* add zones support to camera profiles
* add frontend profile types, color utility, and config save support
* add profile state management and save preview support
* add profileName prop to BaseSection for profile-aware config editing
* add profile section dropdown and wire into camera settings pages
* add per-profile camera enable/disable to Camera Management view
* add profiles summary page with card-based layout and fix backend zone comparison bug
* add active profile badge to settings toolbar
* i18n
* add red dot for any pending changes including profiles
* profile support for mask and zone editor
* fix hidden field validation errors caused by lodash wildcard and schema gaps
lodash unset does not support wildcard (*) segments, so hidden fields like
filters.*.mask were never stripped from form data, leaving null raw_coordinates
that fail RJSF anyOf validation. Add unsetWithWildcard helper and also strip
hidden fields from the JSON schema itself as defense-in-depth.
* add face_recognition and lpr to profile-eligible sections
* move profile dropdown from section panes to settings header
* add profiles enable toggle and improve empty state
* formatting
* tweaks
* tweak colors and switch
* fix profile save diff, masksAndZones delete, and config sync
* ui tweaks
* ensure profile manager gets updated config
* rename profile settings to ui settings
* refactor profilesview and add dots/border colors when overridden
* implement an update_config method for profile manager
* fix mask deletion
* more unique colors
* add top-level profiles config section with friendly names
* implement profile friendly names and improve profile UI
- Add ProfileDefinitionConfig type and profiles field to FrigateConfig
- Use ProfilesApiResponse type with friendly_name support throughout
- Replace Record<string, unknown> with proper JsonObject/JsonValue types
- Add profile creation form matching zone pattern (Zod + NameAndIdFields)
- Add pencil icon for renaming profile friendly names in ProfilesView
- Move Profiles menu item to first under Camera Configuration
- Add activity indicators on save/rename/delete buttons
- Display friendly names in CameraManagementView profile selector
- Fix duplicate colored dots in management profile dropdown
- Fix i18n namespace for overridden base config tooltips
- Move profile override deletion from dropdown trash icon to footer
button with confirmation dialog, matching Reset to Global pattern
- Remove Add Profile from section header dropdown to prevent saving
camera overrides before top-level profile definition exists
- Clean up newProfiles state after API profile deletion
- Refresh profiles SWR cache after saving profile definitions
* remove profile badge in settings and add profiles to main menu
* use icon only on mobile
* change color order
* docs
* show activity indicator on trash icon while deleting a profile
* tweak language
* immediately create profiles on backend instead of deferring to Save All
* hide restart-required fields when editing a profile section
fields that require a restart cannot take effect via profile switching,
so they are merged into hiddenFields when profileName is set
* show active profile indicator in desktop status bar
* fix profile config inheritance bug where Pydantic defaults override base values
The /config API was dumping profile overrides with model_dump() which included
all Pydantic defaults. When the frontend merged these over
the camera's base config, explicitly-set base values were
lost. Now profile overrides are re-dumped with exclude_unset=True so only
user-specified fields are returned.
Also fixes the Save All path generating spurious deletion markers for
restart-required fields that are hidden during profile
editing but not excluded from the raw data sanitization in
prepareSectionSavePayload.
* docs tweaks
* docs tweak
* formatting
* formatting
* fix typing
* fix test pollution
test_maintainer was injecting MagicMock() into sys.modules["frigate.config.camera.updater"] at module load time and never restoring it. When the profile tests later imported CameraConfigUpdateEnum and CameraConfigUpdateTopic from that module, they got mock objects instead of the real dataclass/enum, so equality comparisons always failed
* remove
* fix settings showing profile-merged values when editing base config
When a profile is active, the in-memory config contains effective
(profile-merged) values. The settings UI was displaying these merged
values even when the "Base Config" view was selected.
Backend: snapshot pre-profile base configs in ProfileManager and expose
them via a `base_config` key in the /api/config camera response when a
profile is active. The top-level sections continue to reflect the
effective running config.
Frontend: read from `base_config` when available in BaseSection,
useConfigOverride, useAllCameraOverrides, and prepareSectionSavePayload.
Include formData labels in Object/Audio switches widgets so that labels
added only by a profile override remain visible when editing that profile.
* use rasterized_mask as field
makes it easier to exclude from the schema with exclude=True
prevents leaking of the field when using model_dump for profiles
* fix zones
- Fix zone colors not matching across profiles by falling back to base zone color when profile zone data lacks a color field
- Use base_config for base-layer values in masks/zones view so profile-merged values don't pollute the base config editing view
- Handle zones separately in profile manager snapshot/restore since ZoneConfig requires special serialization (color as private attr, contour generation)
- Inherit base zone color and generate contours for profile zone overrides in profile manager
* formatting
* don't require restart for camera enabled change for profiles
* publish camera state when changing profiles
* formatting
* remove available profiles from mqtt
* improve typing
* face recognition dynamic config
* lpr dynamic config
* safe changes for birdseye dynamic config
* bird classification dynamic config
* always assign new config to stats emitter to make telemetry fields dynamic
* add wildcard support for camera config updates in config_set
* update restart required fields for global sections
* add test
* fix rebase issue
* collapsible settings sidebar
use the preexisting control available with shadcn's sidebar (cmd/ctrl-B) to give users more space to set masks/zones on smaller screens
* dynamic ffmpeg
* ensure previews dir exists
when ffmpeg processes restart, there's a brief window where the preview frame generation pipeline is torn down and restarted. before these changes, ffmpeg only restarted on crash/stall recovery or full Frigate restart. Now that ffmpeg restarts happen on-demand via config changes, there's a higher chance a frontend request hits the preview_mp4 or preview_gif endpoints during that brief restart window when the directory might not exist yet. The existing os.listdir() call would throw FileNotFoundError without a directory existence check. this fix just checks if the directory exists and returns 404 if not, exactly how preview_thumbnail already handles the same scenario a few lines below
* global ffmpeg section
* clean up
* tweak
* fix test
* 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
* tracking details tweaks
- fix 4:3 layout
- get and use aspect of record stream if different from detect stream
* aspect ratio docs tip
* spacing
* fix
* i18n fix
* additional logs on ffmpeg exit
* improve no camera view
instead of showing an "add camera" message, show a specific message for empty camera groups when frigate already has cameras added
* add note about separate onvif accounts in some camera firmware
* clarify review summary report docs
* review settings tweaks
- remove horizontal divider
- update description language for switches
- keep save button disabled until review classification settings change
* use correct Toaster component from shadcn
* clarify support for intel b-series (battlemage) gpus
* add clarifying comment to dummy camera docs
* fix wording in reference config
* spacing tweaks
* make live view settings drawer scrollable
* clarify audio transcription docs
* change audio transcription icon to activity indicator when transcription is in progress
the backend doesn't implement any kind of queueing for speech event transcription
* tracking details tweaks
- Add attribute box overlay and area
- Add score
- Throttle swr revalidation during video component rerendering
* add mse codecs to console debug on errors
* add camera name
* feat(player): always show camera names + add UI config toggle
* feat(settings): add toggle for displaying camera names in multi-camera views
* update label and description for camera name setting
* refactor with sidebar and mobile page
* sidebar spacing and color tweaks
* layout tweaks
* move camera switch button to header
* improve mobile
* remove back button on mobile page header
* mobile fixes
* remove debug
* don't use mobilepage
* more mobile tweaks
* use mobile page for components
* add optional actions to mobile page header for top right buttons
* fix alignment
* use page toggle
* tweaks
* sidebar inset tweaks
* move triggers to notifications sub menu
* consistency
* fix padding
* more padding fixes
* navigate history
* db migration
* db model
* assign admin role on password reset
* add role to jwt and api responses
* don't restrict api access for admins yet
* use json response
* frontend auth context
* update auth form for profile endpoint
* add access denied page
* add protected routes
* auth hook
* dialogs
* user settings view
* restrict viewer access to settings
* restrict camera functions for viewer role
* add password dialog to account menu
* spacing tweak
* migrator default to admin
* escape quotes in migrator
* ui tweaks
* tweaks
* colors
* colors
* fix merge conflict
* fix icons
* add api layer enforcement
* ui tweaks
* fix error message
* debug
* clean up
* remove print
* guard apis for admin only
* fix tests
* fix review tests
* use correct error responses from api in toasts
* add role to account menu
* config file changes
* config migrator
* stream selection on single camera live view
* camera streaming settings dialog
* manage persistent group streaming settings
* apply streaming settings in camera groups
* add ability to clear all streaming settings from settings
* docs
* update reference config
* fixes
* clarify docs
* use first stream as default in dialog
* ensure still image is visible after switching stream type to none
* docs
* clarify docs
* add ability to continue playing stream in background
* fix props
* put stream selection inside dropdown on desktop
* add capabilities to live mode hook
* live context menu component
* resize observer: only return new dimensions if they've actually changed
* pass volume prop to players
* fix slider bug, https://github.com/shadcn-ui/ui/issues/1448
* update react-grid-layout
* prevent animated transitions on draggable grid layout
* add context menu to dashboards
* use provider
* streaming dialog from context menu
* docs
* add jsmpeg warning to context menu
* audio and two way talk indicators in single camera view
* add link to debug view
* don't use hook
* create manual events from live camera view
* maintain grow classes on grid items
* fix initial volume state on default dashboard
* fix pointer events causing context menu to end up underneath image on iOS
* mobile drawer tweaks
* stream stats
* show settings menu for non-restreamed cameras
* consistent settings icon
* tweaks
* optional stats to fix birdseye player
* add toaster to live camera view
* fix crash on initial save in streaming dialog
* don't require restreaming for context menu streaming settings
* add debug view to context menu
* stats fixes
* update docs
* always show stream info when restreamed
* update camera streaming dialog
* make note of no h265 support for webrtc
* docs clarity
* ensure docs show streams as a dict
* docs clarity
* fix css file
* tweaks
* Handle Frigate+ submitted case
* Add search settings and rename general to ui settings
* Add platform aware sheet component
* use two columns on mobile view
* Add cameras page to more filters
* clean up search settings view
* Add time range to side filter
* better match with ui settings
* fix icon size
* use two columns on mobile view
* clean up search settings view
* Add zones and saving logic
* Add all filters to side panel
* better match with ui settings
* fix icon size
* Fix mobile fitler page
* Fix embeddings access
* Cleanup
* Fix scroll
* fix double scrollbars and add separators on mobile too
* two columns on mobile
* italics for emphasis
---------
Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>