* add prop to disable id field
* disable id field when editing profile mask/zone
also, disable if the zone name already exists in required_zones or the base config is being edited and the id already exists on a profile
* add backend validation to reject profile-omly masks/zones
* add tests
* update docs
* tweak
* restructure camera enable/disable pane
* remove obsolete camera edit form
* change terminology to off/on instead of disabled/enabled
* docs
* move menu options and add current camera name badge
* docs
* tweaks
* use monotonic clock for detector inference duration to prevent negative values from wall clock steps
* add ability to set camera's webui_url from camera management pane
* Gemini send thought signature
* Update docs
* copy face and lpr configs from source camera to replay camera
* add guard
* improve dummy camera docs
* remove version number
* fix stale field message after reverting a conditional form field
Routes field-level conditional messages through a dedicated React Context instead of merging them into uiSchema. RJSF's Form keeps state.uiSchema sticky across renders during processPendingChange (formData is updated, uiSchema is not), so a previously injected ui:messages array stays attached to a field even after the triggering condition flips back to false. Context propagation re-runs FieldTemplate directly on every provider value change, sidestepping that staleness.
* add semantic search field message to note that model_size is irrelevant when embeddings provider is selected
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* render orphaned filter entries as collapsibles instead of the Key/Value editor
* Symlink for various AI files
* change replay confg dialog to platform aware sheet
* change agents title
* fix test
* tweak collapsible
* remove camera ui section in settings
no point to having it anymore with profiles and camera management settings
* fix admin response cache leak to non-admin users via nginx proxy_cache
* add model fetcher endpoint for genai config ui
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* start audio transcription post processor when enabled on any camera
* Fetch embed key whenever an error occurs in case the llama server was restarted
* mypy
* add tooltips for colored dots in settings menu
* add ability to reorder cameras from management pane
* add ability to reorder birdseye
* add reordering save text to camera management view
* Include NPU in latency performance hint
* Implement turbo for NPU on object detection
* hide order fields
* drop auto-derived field paths from camera value when unset globally
* use correct field type for export hwaccel args
* add debug replay to detail actions menu
* clarify debug replay in docs
* guard get_current_frame_time against missing camera state
* Implement debug reply from export
* Refactor debug replay to use sources for dynamic playback
* Mypy
* fix debug export replay source timestamp handling
* skip replay cameras in stats immediately
* broadcast debug replay state over ws and buffer pre-OPEN sends
- push debug replay session state over the job_state ws topic so the status bar reacts instantly to start/stop without polling
- fix child-effect-before-parent-effect race in WsProvider that silently dropped initial snapshot requests on cold load
* fix debug replay test hang
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* add embedded mode to BaseSection so parents can host the save action
* add optional action slot to current Frigate+ model summary
* add w-full to action slot flex wrapper for explicit width contract
* i18n
* merged detectors and model settings view
* fix document title
* Embed detector form in merged settings view
* add detection model card with tabs and custom model embed
* add Frigate+ model selector with filter popover to merged page
* Add mismatch banner and gate save on detector and model compatibility
* Wire atomic save, restart toast, and undo on detectors and model page
* Clear child pending data on undo
* route merged detectors and model view in settings
* trim Frigate+ page to account-only and remove old detection model view
* basic e2e
* Fix unsaved-changes guard, custom path leak, and post-failure cache resync
* Rename to Detectors and model, float Modified badge, use ConfigMessageBanner for mismatch
* Hide Plus/Custom tabs when Frigate+ is not enabled
* Detect active Plus model via model.plus.id instead of path prefix
* Sync state back to snapshot when child form un-modifies and remount on undo
* Always require restart on save since model changes also need one
* Wrap Frigate+ model selector in SplitCardRow with label and description
* rename tab
* update docs
* sync top-level model with default detector's resolved model
when the user doesn't define a top-level `model:` block, `FrigateConfig.model` stayed at pydantic field defaults (320×320, /labelmap.txt) while the per-detector model picked up `DEFAULT_MODEL` for openvino on cpu (300×300, coco_91cl_bkgr.txt introduced in #23127), causing `RemoteObjectDetector` to fail with "buffer is too small for requested array" because the SHM was sized from the per-detector model but mapped using the top-level one. After the detector loop, copy the first detector's resolved model up to `self.model` so both sides agree on dimensions and labelmap
* revert to cpu detector by default
use openvino cpu for new configs only
* add defaults
* hide camera overrides badge from system sections
* show empty card on camera metrics page when no cameras are defined
* fix enabled camera state switch after adding via wizard
Cameras added mid-session have no WS state until the dispatcher publishes camera_activity (which only happens on a fresh onConnect). Fall back to the config's enabled value so the switch reflects reality immediately after the wizard closes.
* guard camera enabled access
console would throw errors after adding via camera wizard
* fix useOptimisticState dropping debounced setState under StrictMode
* use openvino on cpu as default model
- faster than tflite on cpu
- add to default generated config
* use an enum for model_size
the frontend will then render this as a select dropdown because of the changes in the json schema
* i18n
* sync object filter entries with tracked labels in camera config form
Filter sub-collapsibles in the camera Objects section are driven by `filters` dict keys, but profile merges and live track-switch edits don't add matching entries, so newly tracked labels (like from a profile override) had no collapsible. Synthesize default filter entries from `track` in the form data so every tracked label renders a collapsible; baseline data also gets the synthesized entries, so save payloads are unchanged.
* revalidate raw paths cache after config save so CameraPathWidget shows fresh credentials
* fix test
* restore masked ffmpeg credentials when persisting camera config
* formatting
* rebuild ffmpeg commands when enabling recording for the first time
Toggling record.enabled from the config UI updated the in-memory config but left ffmpeg running with its original command, so the record output args were never wired in and nothing landed in the cache for the maintainer to move. The record config update now rebuilds ffmpeg_cmds when enabled_in_config transitions, and the camera watchdog restarts ffmpeg on a false to true transition so the record output gets wired in. MQTT toggles, which only flip record.enabled at runtime, are unaffected and continue to work via the maintainer's drop/keep gate.
* keep record toggle switch in single camera view disabled until enabled in config
* fix override detection for sections unset in the global config
Override badges and the blue dot now compare against schema defaults for sections like motion that the API serializes as null when omitted from the global YAML, instead of treating any populated camera config as an override
* add support for config-aware patterns in section hiddenFields
Section configs can now declare dynamic hidden-field entries as functions of the loaded config; objects.ts uses this to hide auto-populated attribute filters (DHL, face, license_plate, etc.) from the form, save flow, and override popover when those labels aren't user-settable
* siimplify object filters handling
live updating was getting very messy. users will just need to save once they enable a new object in order to see filters for that object
* tweaks
* update docs for new detector default
* make genai provider required and add special case for UI
prevent validation errors from appearing on initial creation of genai provider by setting the first option in the select dropdown as default
* Update to ROCm 7.2.3
* Add inference time for 9060XT
* Update times
* Update hardware info for latest ROCm
* Add env vars to save kernels and miopen database
* re-enable face recognition for ROCm
* Update
* Save LLVM cache
* Rewrite intel GPU stats to use file descriptors instead of intel_gpu_top, leading to significantly better API for interaction and more accurate results
* Update tests
* Update docs
* Adjust approach
* Update strings
* use ReplayState enum
* extract shared ffmpeg progress helper
* make start call non-blocking with worker thread
* expose replay state on status endpoint and return 202 from start
* cancel in-flight ffmpeg when stop is called during preparation
* add replay i18n strings for preparing and error states
* show status in replay UI
* navigate immediately on 202 from debug replay menus and dialog
* remove unused
* simplify to use Job infrastructure
* tests
* cleanup and tweaks
* fetch schema
* update api spec
* formatting
* fix e2e test
* mypy
* clean up
* formatting
* fix
* fix test
* don't try to show camera image until status reports ready
* simplify loading logic
* fix race in latest_frame on debug replay shutdown
* remove toast when successfully stopping
it gets hidden almost immediately
- Add _auth_headers() helper to pass Bearer token when api_key is set
- Wire headers into all Ollama client instantiations (sync + async)
- Update docs with Ollama Cloud direct connection example and yaml config
* ensure embeddings process restarts after maintainer thread crash
* add docs link to media sync settings
* fix color
Co-authored-by: Copilot <copilot@github.com>
* match link color with other sections
* ensure recording staleness threshold scales with segment_time
* docs tweak
* Fix llama.cpp media marker
* Fix gemini tools call
---------
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* use ffmpeg to probe rtsp urls instead of cv2
cv2 is faster (no subprocess launch) and will continue to be used for recording segments
* tweak faq
* change unsaved color to orange
avoids confusion with validation errors (red)
* don't use any variant of orange as a profile color
avoids confusion with unsaved changes
* more unsaved color tweaks
* add log when probing detect stream on startup
when users don't explicitly set detect.width and detect.height, we probe for them. sometimes the probe hangs (camera doesn't support UDP, like some Reolinks), so this log message will make that clearer
* add faq about probing detect stream
* fix stuck activity ring when tracked object transitions to stationary
* drop cache segments past retain cutoff regardless of retention mode
* add maintainer test
* only link to profile settings in status bar for admin users
* use hasFullCameraAccess for group filtering
* add custom export args to record docs
* update recordings docs
* prevent review WS handler from poisoning SWR cache before initial fetch completes
* backend
* frontend + i18n
* tests + api spec
* tweak backend to use Job infrastructure for exports
* frontend tweaks and Job infrastructure
* tests
* tweaks
- add ability to remove from case
- change location of counts in case card
* add stale export reaper on startup
* fix toaster close button color
* improve add dialog
* formatting
* hide max_concurrent from camera config export settings
* remove border
* refactor batch endpoint for multiple review items
* frontend
* tests and fastapi spec
* fix deletion of in-progress exports in a case
* tweaks
- hide cases when filtering cameras that have no exports from those cameras
- remove description from case card
- use textarea instead of input for case description in add new case dialog
* add auth exceptions for exports
* add e2e test for deleting cases with exports
* refactor delete and case endpoints
allow bulk deleting and reassigning
* frontend
- bulk selection like Review
- gate admin-only actions
- consolidate dialogs
- spacing/padding tweaks
* i18n and tests
* update openapi spec
* tweaks
- add None to case selection list
- allow new case creation from single cam export dialog
* fix codeql
* fix i18n
* remove unused
* fix frontend tests
* fix mobile export crash by removing stale iOS non-modal drawer workaround
* Remove titlecase to avoid Gemma4 handling plain labels as proper nouns
* Improve titling:
* Make directions more clear
* Properly capitalize delivery services
* update dispatcher config reference on save
* subscribe to review topic so ReviewDescriptionProcessor knows genai is enabled
* auto-send ON genai review WS message when enabled_in_config transitions to true
* remove unused object level
* update docs to clarify pre/post capture settings
* add ui docs links
* improve known_plates field in settings UI
* only show save all when multiple sections are changed
or if the section being changed is not currently being viewed
* fix docs
---------
Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
* add guards to reject missing sub commands
* mask/zone bugfixes
- fix websocket crash when creating a new mask or zone before a name is assigned
- fix deleted masks and zones not disappearing from the list until navigating away
- fix deleting profile override not reverting to the base mask in the list
- fix inertia defaulting to nan
* disable save button on invalid form state
* fix validation for speed estimation
* ensure polygon is closed before allowing save
* require all masks and zones to be on the base config
* clarify dialog message and tooltip when removing an override
* clarify docs
* set edgetpu for multi-instance
* improve error messages when mixing/matching detectors
* allow custom add button text via uiSchema
* clarify language in docs for configuring detectors via the UI
* add generation script
a script to read yaml code blocks from docs markdown files and generate corresponding "Frigate UI" tab instructions based on the json schema, i18n, section configs (hidden fields), and nav mappings
* first pass
* components
* add to gitignore
* second pass
* fix broken anchors
* fixes
* clean up tabs
* version bump
* tweaks
* remove role mapping config from ui