* -1 so ensure indexes are correct
* Catch case of zero division
* Due to the -1, it may be negative
* Ignore source of error
The error is occurring due to a detections bounding box starting beyond the frame, this should be immediately ignored
* Formatting
* Check horizontal placement as well
* Remove original frame clamping
* Add tabs to show snapshot or thumbnail as part of event details,
even if event has a clip available.
* Add ability for TextTab to render as disabled.
* Fix VOD issues with longer keyframe intervals
* Move probe function to util
Update comment
* Use recording duration for keyFrameDurations
* Remove unused early return
* Avoid clipping first clip
* Adding configuration example for retain modes
Reading the documentation on its own didn't help me but when I found https://github.com/blakeblackshear/frigate/discussions/2447 I was able to understand how to add this to my configuration. I've added the example given in that discussion to help future readers of the page.
* Update record.md
Added suggested changes and have also added wording beneath the example mentioning the configuration can be added on a per camera basis.
Have also built on the example to add object specific retentions timings - Not sure if it would be preferred to have it all within one example to not complicate things?
Let me know your thoughts
* Update record.md
Created Object Specific Retention header
* Typo
Co-authored-by: Blake Blackshear <blake@frigate.video>
* Add log message when discarding recording segments in cache
Currently Frigate silently discards recording segments in cache if there's more than "keep_count" for a camera, which can happen on high load/busy/slow systems.
This results in recording segments being lost with no apparent cause in the logs (even when set to debug).
This PR adds a warning log entry when discarding segments, in the same way as discarding corrupted segments
* Add explanatory warning and properly format cache_path warning
* lint fixes
Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
* Set up for http tests
* Setup basics for testing and first test
* Add testing consts
* Cleanup db creation
* Add one more check to test
* Get event that does not exist
* Get events working with cleaner db
* Test retain / un-retain
* Test setting and deleting sub label
* Test getting list of sub labels
* Fix bug caught in tests
* Test deleting event
* Test geting list of events
* Expand test
* Test more event filters
* Write version module so tests don't fail on version import
* Test config
* Test recordings endpoint
* Formatting
* Remove unused imports
* Test stats
* Add cleanup files in const
* Add name to match other checks
* Use default names so filters are more clear
* Add endpoint to get list of sub labels inside DB
* Fix crash on no internet
* Cleanups for sub_label http
* Add sub label selector to events UI
* Add event filtering for sub label
* Formatting files
* Reduce size of filters to fit on one line
* Add handler for tests
* Remove unused imports
* Only show the sub labels filter when there are sub labels in the DB
* Fix tests
* Use distinct instead of group_by
* Formatting
* Cleanup event logic
* Send mqtt message when motion is detected
* Use object processing instead of passing mqtt client around
* Cleanup
* Formatting
* add comment
* Make off delay configurable.
* Handle updating each camera based on config off delay
* Formatting
* Update docker-compose.yml
* Fix processing issue
* Update mqtt docs
* Update main config docs
* Make sure multiple True values aren't published for the same motion
* Make sure multiple True values aren't published for the same motion
* Update payload to fit existing HA standard values
* Update docs to fit new values
* Update docs
* Update motion topic
* Use datetime.datetime and remove unused imports
* Cast to int
* Clarify motion detector behavior in docs
* Fix typo
Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
* Starting working on adding motion toggle
* Add all info to mqtt command
* Send motion to correct funs
* Update mqtt docs
* Fixes for contingencies
* format
* mypy
* Tweak behavior
* Fix motion breaking frames
* Fix bad logic in detect set
* Always set value for motion boxes
* __main__.py
* app.py
* models.py
* plus.py
* stats.py
In addition a new module was introduced: types
There all TypedDicts are included. Bitte geben Sie eine Commit-Beschreibung für Ihre Änderungen ein. Zeilen,
* Toggle improve_contrast for cameras via MQTT
* Process parameter to mqtt toggle improve_contrast
* Update mqtt docs for improve_contrast topic
* Spacing
* Add class variable and update in process_frames
* Pass to constructor
* pass by reference mistake
* remove parameter
* remove parameter
* Add options for reordering and hiding cameras selectively
* Add newline at end of camera file
* Make each camera for birdseye togglable as well
* Update names to be less ambiguous
* Update defaults
* Include sidebar change
* Remove birdseye toggle (will be added in separate PR)
* Remove birdseye toggle (will be added in separate PR)
* Remove birdseye toggle (will be added in separate PR)
* Update sidebar to only sort cameras once
* Simplify sorting logic
* Add camera level processing for birdseye
* Add camera level birdseye configruation
* Propogate birdseye from global
* Update docs to show that birdseye is overridable
* Fix incorrect default factory
* Update note to indicate values that can be overridden
* Cleanup config accessing
* Add tests for birdseye config behavior
* Fix mistake on test format
* Update tests
* Add docs to elaborate more on stationary tracking
* Add link to guide on avoiding stationary objects in driveway scenario
* Update wording in reference config
* Small cleanups
* Update with PR comments
* Add object ratio config parameters
Issue: #2948
* Add config test for object filter ratios
Issue: #2948
* Address review comments
- Accept `ratio` default
- Rename `bounds` to `box` for consistency
- Add migration for new field
Issue: #2948
* Fix logical errors
- field migrations require default values
- `clipped` referenced the wrong index for region, since it shifted
- missed an inclusion of `ratio` for detections in `process_frames`
- revert naming `o[2]` as `box` since it is out of scope!
This has now been test-run against a video, so I believe the kinks are
worked out.
Issue: #2948
* Update contributing notes for `make`
Issue: #2948
* Fix migration
- Ensure that defaults match between Event and migration script
- Deconflict migration script number (from rebase)
Issue: #2948
* Filter objects out of ratio bounds
Issue: #2948
* Update migration file to 009
Issue: #2948
* Add sub label to model and set / delete funs
* Add migrations for sub label
* Tweaks to API and model
* Show sublabel if available
* Cleanups
* Update docs
* Show person in UI title
* Fix typo and don't fail on no json
* Transfer sub labels for in progress events
* Remove sublabel reset
* Remove person only check
* Make default null
* Update docs and formatting
* Make default null
* Make nullable in migration
* Undo null
* Update model to accept null
* Update migration to accept null
* Don't set to default values
* Remove redundant defaults and update http logic
* Only need a single route
* Enforce 20 character limit in http
* Update docs to mention 20 character limit
* Cleanup
* Separate insert and update to make sure updated values are retained when event ends
* Use insert instead of replace
* Remove redundant if and have should_update_db include clip or snapshot requirement.
* Added object thumbnail def and made camera tracked objects use it.
* Add object snapshot def
* Remove documentation for best.jpg
* Update docs for label thumbnail and snapshot defs
* new datepicker
* dev
* dev
* dev
* fix for version 0.10
* added rounded corners for date range
* lint
* Commented out some Select.test.
* improved date range selection
* improved functions with useCallback
* improved Select.test.jsx
* keyboard navigation
* keyboard navigation
* added dropdown menu icon
* Hide filters on xs, Button to show
* check if to far left before right
* Filter button text
* improved local timezone
* Improve audio convert guide
* Mention faq in RTMP configuration
* Add example for audio conversion tip
* Change comma to period
* Explain why this is needed
Based on issue #1976 - specify explicitly that these fields can include environment variables to avoid interpretation that environment variables could be used anywhere.
I am participating in #hacktoberfest, so I would appreciate if you could add the 'hacktoberfest-accepted' label (or add #hacktoberfest topic to your repo). Thanks!
Hoped to investigate this with my dev board at some point. In the meantime, added a warning for others who may experience it when upgrading to the new stable release.
* rearrange event route and splitted into several components
* useIntersectionObserver
* re-arrange
* searchstring improvement
* added xs tailwind breakpoint
* useOuterClick hook
* cleaned up
* removed some video controls for mobile devices
* lint
* moved hooks to global folder
* moved buttons for small devices
* added button groups
Co-authored-by: Bernt Christian Egeland <cbegelan@gmail.com>
* :memo::white_check_mark:🔧 - Make RTMP config global
Fixes#1671
* :memo::white_check_mark:🔧 - Make timestamp style config global
Fixes#1656
* fix test function names
* formatter
Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
* fixed position for Dialog
* added eventId to deleted item
* removed page route redirect + New Close Button
* event component added to events list. New delete reducer
* removed event route
* moved delete reducer to event page
* removed redundant event details
* keep aspect ratio
* keep aspect ratio
* removed old buttons - repositioned to top
* removed console.log
* event view function
* removed clip header
* top position
* centered image if no clips avail
* comments
* linting
* lint
* added scrollIntoView when event has been mounted
* added Clip header
* added scrollIntoView to test
* lint
* useRef to scroll event into view
* removed unused functions
* reverted changes to event.test
* scroll into view
* moved delete reducer
* removed commented code
* styling
* moved close button to right side
* Added new close svg icon
Co-authored-by: Bernt Christian Egeland <cbegelan@gmail.com>
In the homeassistant app, the notification timestamp is generated when the push message is received by the app. Delays caused by servers, device load, or network latency/availability will delay those pushes - so in the following case:
1:00 - A dog is detected in the front
1:02 - It stops moving around or leaves view, last notification push sent
1:05 - The phone connects to the network
The user, seeing the alert at 1:05, will see that the notification occurred "a few seconds ago", since the timestamp the app sends to the OS was at 1:05. By adding the `when` parameter, it will instead correctly show that the event was triggered at 1:00.
This is exacerbated by the fact that the default behavior of android pushes won't wake the device from deep sleep - in order to receive it as a high priority notification, the additional parameters
```
data:
priority: high
ttl: 0
```
have to be added.
* Add FAQ section
Add FAQ section and verbiage about a finding with camera motion sensors in HomeKit.
* Changes made based on inputs
* Fix markdown
Co-authored-by: Blake Blackshear <blakeb@blakeshome.com>
Refs #1440
Indicate that width and height are only used for the detect role and so other streams for with other roles are passed through and resolution is not needed.
If jpg_bytes wasn't retrieved from either desk or a tracked object, respond with 404
Prevents uncaught error for unknown event ids sent to event_snapshot endpoint
Lock updates to tracked objects, current frame time, motion boxes, and
regions on `update()`.
Directly create Counters using counted values.
Don't convert removed_ids, new_ids, or updated_ids sets to lists.
Update defaultdict's to remove un-necessary lambdas when possible.
When possible, drop un-necessay list comprehensions, such as when
calling `any`.
Use set comprehension, rather than passing a list comprehension into
`set()`.
Do the slightly more pythonic `x not in y` rather than `not x in y` to
check list inclusion.
Use config data classes to eliminate some of the boilerplate associated
with setting up the configuration. In particular, using dataclasses
removes a lot of the boilerplate around assigning properties to the
object and allows these to be easily immutable by freezing them. In the
case of simple, non-nested dataclasses, this also provides more
convenient `asdict` helpers.
To set this up, where previously the objects would be parsed from the
config via the `__init__` method, create a `build` classmethod that does
this and calls the dataclass initializer.
Some of the objects are mutated at runtime, in particular some of the
zones are mutated to set the color (this might be able to be refactored
out) and some of the camera functionality can be enabled/disabled. Some
of the configs with `enabled` properties don't seem to have mqtt hooks
to be able to toggle this, in particular, the clips, snapshots, and
detect can be toggled but rtmp and record configs do not, but all of
these configs are still not frozen in case there is some other
functionality I am missing.
There are a couple other minor fixes here, one that was introduced
by me recently where `max_seconds` was not defined, the other to
properly `get()` the message payload when handling publishing mqtt
messages sent via websocket.
Use `np.unique` to determine the correct set of row/col pairs to iterate
over when doing the object matching without needing to track which rows
or columns have already been seen. Add to some of the accompanying
documentation to clarify this algorithm.
Also fix what looks to be an erroneous early return, and change this to
a continue.
Generally eliminate the `while True` loops while waiting for a stop
event and prefer to condition the loops on if the stop event is set,
blocking on that where it makes sense. This generally comes in 3
flavors. First and simplest, when there is a sleep and the stop event
is the only thing the loop blocks on, instead do a check using
`stop_event.wait(timeout)` to instead block on the stop event for the
designated amount of time. Second, when there is a different event that
is blocking in the loop, condition the loop on `stop_event.is_set()`
rather than breaking when it is set. Finally, when there is a separate
internal condition that requires a counter, have the loop iterate over
the counter and use `if stop_event.wait(timeout)` internal to the loop.
When running ffprobe, use `subprocess.run` rather than
`subprocess.Popen`. This simplifies the handling that is needed to run
and process the outputs. Here, filename parsing is also simplified by
explicitly removing the file extension with `os.path.splitext` and
forcing a single split into the camera name and the formatted date.
It is not possible--unless I'm totally overlooking something--to define the add-on's configuration in the GUI. The user must define the configuration in a frigate.yml file,
StatsEmitter thread to send stats to MQTT every 60 seconds by default, optional stats_interval config value.
New service stats attribute, containing uptime in seconds and version.
Frigate provides an HTTP server that can be used to detect if frigate is running or not. Using the docker-compose "healthcheck" feature we can set automations to restart the service if it stops working.
I have very little experience with Docker, but it seems the command in the README has two mistakes in it:
- unknown shorthand flag: 'n' in -name
- docker: Error response from daemon: Invalid container name (blakeblackshear/frigate:stable), only [a-zA-Z0-9][a-zA-Z0-9_.-] are allowed.
I am running Docker version 19.03.13-ce, build 4484c46d9d on Arch linux.
* Add object size to the bounding box
Remove script from Dockerfile
Fix framerate command
Move default value for framerate
update dockerfile
dockerfile changes
Add person_area label to surrounding box
Update dockerfile
ffmpeg config bug
Add `person_area` label to `best_person` frame
Resolve debug view showing area label for non-persons
Add object size to the bounding box
Add object size to the bounding box
* Move object area outside of conditional to work with all object types
# Warns and then closes issues and PRs that have had no activity for a specified amount of time.
# https://github.com/actions/stale
name:"Stalebot"
on:
schedule:
- cron:"0 0 * * *"# run stalebot once a day
jobs:
stale:
runs-on:ubuntu-latest
steps:
- uses:actions/stale@main
id:stale
with:
stale-issue-message:'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{117:function(e,t,a){"use strict";a.r(t);varn=a(0),o=a.n(n),l=a(110);t.default=function(){returno.a.createElement(l.a,{title:"Page Not Found"},o.a.createElement("main",{className:"container margin-vert--xl"},o.a.createElement("div",{className:"row"},o.a.createElement("div",{className:"col col--6 col--offset-3"},o.a.createElement("h1",{className:"hero__title"},"Page Not Found"),o.a.createElement("p",null,"We could not find what you were looking for."),o.a.createElement("p",null,"Please contact the owner of the site that linked you to the original URL and let them know their link is broken.")))))}}}]);
(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{75:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){returni})),r.d(t,"metadata",(function(){returnc})),r.d(t,"toc",(function(){returnu})),r.d(t,"default",(function(){returns}));varn=r(3),a=r(7),o=(r(0),r(99)),i={id:"web",title:"Web Interface"},c={unversionedId:"usage/web",id:"usage/web",isDocsHomePage:!1,title:"Web Interface",description:"Frigate comes bundled with a simple web ui that supports the following:",source:"@site/docs/usage/web.md",slug:"/usage/web",permalink:"/frigate/usage/web",editUrl:"https://github.com/blakeblackshear/frigate/edit/master/docs/docs/usage/web.md",version:"current",sidebar:"docs",previous:{title:"Integration with Home Assistant",permalink:"/frigate/usage/home-assistant"},next:{title:"HTTP API",permalink:"/frigate/usage/api"}},u=[],l={toc:u};functions(e){vart=e.components,r=Object(a.a)(e,["components"]);returnObject(o.b)("wrapper",Object(n.a)({},l,r,{components:t,mdxType:"MDXLayout"}),Object(o.b)("p",null,"Frigate comes bundled with a simple web ui that supports the following:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Show cameras"),Object(o.b)("li",{parentName:"ul"},"Browse events"),Object(o.b)("li",{parentName:"ul"},"Mask helper")))}s.isMDXComponent=!0},99:function(e,t,r){"use strict";r.d(t,"a",(function(){returnp})),r.d(t,"b",(function(){returnm}));varn=r(0),a=r.n(n);functiono(e,t,r){returntine?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}functioni(e,t){varr=Object.keys(e);if(Object.getOwnPropertySymbols){varn=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){returnObject.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}returnr}functionc(e){for(vart=1;t<arguments.length;t++){varr=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){o(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}returne}functionu(e,t){if(null==e)return{};varr,n,a=function(e,t){if(null==e)return{};varr,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);returna}(e,t);if(Object.getOwnPropertySymbols){varo=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}returna}varl=a.a.createContext({}),s=function(e){vart=a.a.useContext(l),r=t;returne&&(r="function"==typeofe?e(t):c(c({},t),e)),r},p=function(e){vart=s(e.components);returna.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){vart=e.children;returna.a.createElement(a.a.Fragment,{},t)}},f=a.a.forwardRef((function(e,t){varr=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,l=u(e,["components","mdxType","originalType","parentName"]),p=s(r),f=n,m=p["".concat(i,".").concat(f)]||p[f]||b[f]||o;returnr?a.a.createElement(m,c(c({ref:t},l),{},{components:r})):a.a.createElement(m,c({ref:t},l))}));functionm(e,t){varr=arguments,n=t&&t.mdxType;if("string"==typeofe||n){varo=r.length,i=newArray(o);i[0]=f;varc={};for(varuint)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c.mdxType="string"==typeofe?e:n,i[1]=c;for(varl=2;l<o;l++)i[l]=r[l];returna.a.createElement.apply(null,i)}returna.a.createElement.apply(null,r)}f.displayName="MDXCreateElement"}}]);
<linkrel="alternate"type="application/rss+xml"href="/frigate/blog/rss.xml"title="Frigate Blog RSS Feed">
<linkrel="alternate"type="application/atom+xml"href="/frigate/blog/atom.xml"title="Frigate Blog Atom Feed">
<linkrel="search"type="application/opensearchdescription+xml"title="Frigate"href="/frigate/opensearch.xml"><titledata-react-helmet="true">Page Not Found | Frigate</title><metadata-react-helmet="true"property="og:title"content="Page Not Found | Frigate"><metadata-react-helmet="true"name="twitter:card"content="summary_large_image"><metadata-react-helmet="true"name="docsearch:language"content="en"><metadata-react-helmet="true"name="docsearch:docusaurus_tag"content="default"><linkdata-react-helmet="true"rel="shortcut icon"href="/frigate/img/favicon.ico"><linkdata-react-helmet="true"rel="preconnect"href="https://BH4D9OD16A-dsn.algolia.net"crossorigin="anonymous"><linkrel="stylesheet"href="/frigate/styles.4dd8d972.css">
(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{159:function(e,t,r){"use strict";r.r(t),t.default=r.p+"assets/images/diagram-3101f1674015822e176773924caae31a.png"},81:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){returni})),r.d(t,"metadata",(function(){returnc})),r.d(t,"toc",(function(){returns})),r.d(t,"default",(function(){returnu}));varn=r(3),o=r(7),a=(r(0),r(99)),i={id:"how-it-works",title:"How Frigate Works",sidebar_label:"How it works"},c={unversionedId:"how-it-works",id:"how-it-works",isDocsHomePage:!1,title:"How Frigate Works",description:"Frigate is designed to minimize resource and maximize performance by only looking for objects when and where it is necessary",source:"@site/docs/how-it-works.md",slug:"/how-it-works",permalink:"/frigate/how-it-works",editUrl:"https://github.com/blakeblackshear/frigate/edit/master/docs/docs/how-it-works.md",version:"current",sidebar_label:"How it works",sidebar:"docs",previous:{title:"Frigate",permalink:"/frigate/"},next:{title:"Recommended hardware",permalink:"/frigate/hardware"}},s=[],l={toc:s};functionu(e){vart=e.components,i=Object(o.a)(e,["components"]);returnObject(a.b)("wrapper",Object(n.a)({},l,i,{components:t,mdxType:"MDXLayout"}),Object(a.b)("p",null,"Frigate is designed to minimize resource and maximize performance by only looking for objects when and where it is necessary"),Object(a.b)("p",null,Object(a.b)("img",{alt:"Diagram",src:r(159).default})),Object(a.b)("ol",null,Object(a.b)("li",{parentName:"ol"},"Look for Motion"),Object(a.b)("li",{parentName:"ol"},"Calculate Detection Regions"),Object(a.b)("li",{parentName:"ol"},"Run Object Detection")))}u.isMDXComponent=!0},99:function(e,t,r){"use strict";r.d(t,"a",(function(){returnp})),r.d(t,"b",(function(){returnm}));varn=r(0),o=r.n(n);functiona(e,t,r){returntine?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}functioni(e,t){varr=Object.keys(e);if(Object.getOwnPropertySymbols){varn=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){returnObject.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}returnr}functionc(e){for(vart=1;t<arguments.length;t++){varr=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}returne}functions(e,t){if(null==e)return{};varr,n,o=function(e,t){if(null==e)return{};varr,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);returno}(e,t);if(Object.getOwnPropertySymbols){vara=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}returno}varl=o.a.createContext({}),u=function(e){vart=o.a.useContext(l),r=t;returne&&(r="function"==typeofe?e(t):c(c({},t),e)),r},p=function(e){vart=u(e.components);returno.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){vart=e.children;returno.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){varr=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=u(r),b=n,m=p["".concat(i,".").concat(b)]||p[b]||f[b]||a;returnr?o.a.createElement(m,c(c({ref:t},l),{},{components:r})):o.a.createElement(m,c({ref:t},l))}));functionm(e,t){varr=arguments,n=t&&t.mdxType;if("string"==typeofe||n){vara=r.length,i=newArray(a);i[0]=b;varc={};for(varsint)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeofe?e:n,i[1]=c;for(varl=2;l<a;l++)i[l]=r[l];returno.a.createElement.apply(null,i)}returno.a.createElement.apply(null,r)}b.displayName="MDXCreateElement"}}]);
# Frigate - NVR With Realtime Object Detection for IP Cameras
A complete and local NVR designed for [Home Assistant](https://www.home-assistant.io) with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.
Use of a [Google Coral Accelerator](https://coral.ai/products/) is optional, but highly recommended. The Coral will outperform even the best CPUs and can process 100+ FPS with very little overhead.
- Tight integration with Home Assistant via a [custom component](https://github.com/blakeblackshear/frigate-hass-integration)
- Designed to minimize resource use and maximize performance by only looking for objects when and where it is necessary
- Leverages multiprocessing heavily with an emphasis on realtime over processing every frame
- Uses a very low overhead motion detection to determine where to run object detection
- Object detection with TensorFlow runs in separate processes for maximum FPS
- Communicates over MQTT for easy integration into other systems
- Records video with retention settings based on detected objects
- 24/7 recording
- Re-streaming via RTMP to reduce the number of connections to your camera
## Documentation
View the documentation at https://docs.frigate.video
## Donations
If you would like to make a donation to support development, please use [Github Sponsors](https://github.com/sponsors/blakeblackshear).
(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{92:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){returnc})),r.d(t,"metadata",(function(){returni})),r.d(t,"toc",(function(){returnu})),r.d(t,"Highlight",(function(){returnp})),r.d(t,"default",(function(){returnd}));varn=r(3),o=r(7),a=(r(0),r(99)),c={id:"mdx",title:"Powered by MDX"},i={unversionedId:"mdx",id:"mdx",isDocsHomePage:!1,title:"Powered by MDX",description:"You can write JSX and use React components within your Markdown thanks to MDX.",source:"@site/docs/mdx.md",slug:"/mdx",permalink:"/frigate/mdx",editUrl:"https://github.com/blakeblackshear/frigate/edit/master/docs/docs/mdx.md",version:"current"},u=[],p=function(e){vart=e.children,r=e.color;returnObject(a.b)("span",{style:{backgroundColor:r,borderRadius:"2px",color:"#fff",padding:"0.2rem"}},t)},l={toc:u,Highlight:p};functiond(e){vart=e.components,r=Object(o.a)(e,["components"]);returnObject(a.b)("wrapper",Object(n.a)({},l,r,{components:t,mdxType:"MDXLayout"}),Object(a.b)("p",null,"You can write JSX and use React components within your Markdown thanks to ",Object(a.b)("a",Object(n.a)({parentName:"p"},{href:"https://mdxjs.com/"}),"MDX"),"."),Object(a.b)(p,{color:"#25c2a0",mdxType:"Highlight"},"Docusaurus green")," and ",Object(a.b)(p,{color:"#1877F2",mdxType:"Highlight"},"Facebook blue")," are my favorite colors.",Object(a.b)("p",null,"I can write ",Object(a.b)("strong",{parentName:"p"},"Markdown")," alongside my ",Object(a.b)("em",{parentName:"p"},"JSX"),"!"))}d.isMDXComponent=!0},99:function(e,t,r){"use strict";r.d(t,"a",(function(){returnd})),r.d(t,"b",(function(){returnb}));varn=r(0),o=r.n(n);functiona(e,t,r){returntine?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}functionc(e,t){varr=Object.keys(e);if(Object.getOwnPropertySymbols){varn=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){returnObject.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}returnr}functioni(e){for(vart=1;t<arguments.length;t++){varr=null!=arguments[t]?arguments[t]:{};t%2?c(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):c(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}returne}functionu(e,t){if(null==e)return{};varr,n,o=function(e,t){if(null==e)return{};varr,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);returno}(e,t);if(Object.getOwnPropertySymbols){vara=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}returno}varp=o.a.createContext({}),l=function(e){vart=o.a.useContext(p),r=t;returne&&(r="function"==typeofe?e(t):i(i({},t),e)),r},d=function(e){vart=l(e.components);returno.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){vart=e.children;returno.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){varr=e.components,n=e.mdxType,a=e.originalType,c=e.parentName,p=u(e,["components","mdxType","originalType","parentName"]),d=l(r),f=n,b=d["".concat(c,".").concat(f)]||d[f]||s[f]||a;returnr?o.a.createElement(b,i(i({ref:t},p),{},{components:r})):o.a.createElement(b,i({ref:t},p))}));functionb(e,t){varr=arguments,n=t&&t.mdxType;if("string"==typeofe||n){vara=r.length,c=newArray(a);c[0]=f;vari={};for(varuint)hasOwnProperty.call(t,u)&&(i[u]=t[u]);i.originalType=e,i.mdxType="string"==typeofe?e:n,c[1]=i;for(varp=2;p<a;p++)c[p]=r[p];returno.a.createElement.apply(null,c)}returno.a.createElement.apply(null,r)}f.displayName="MDXCreateElement"}}]);
(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{93:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){returni})),r.d(t,"metadata",(function(){returnc})),r.d(t,"toc",(function(){returnu})),r.d(t,"default",(function(){returnl}));varn=r(3),o=r(7),a=(r(0),r(99)),i={id:"howtos",title:"Community Guides",sidebar_label:"Community Guides"},c={unversionedId:"usage/howtos",id:"usage/howtos",isDocsHomePage:!1,title:"Community Guides",description:"Communitiy Guides/How-To's",source:"@site/docs/usage/howtos.md",slug:"/usage/howtos",permalink:"/frigate/usage/howtos",editUrl:"https://github.com/blakeblackshear/frigate/edit/master/docs/docs/usage/howtos.md",version:"current",sidebar_label:"Community Guides"},u=[{value:"Communitiy Guides/How-To's",id:"communitiy-guideshow-tos",children:[]}],s={toc:u};functionl(e){vart=e.components,r=Object(o.a)(e,["components"]);returnObject(a.b)("wrapper",Object(n.a)({},s,r,{components:t,mdxType:"MDXLayout"}),Object(a.b)("h2",{id:"communitiy-guideshow-tos"},"Communitiy Guides/How-To's"),Object(a.b)("ul",null,Object(a.b)("li",{parentName:"ul"},"Best Camera AI Person & Object Detection - How to Setup Frigate w/ Home Assistant - digiblurDIY ",Object(a.b)("a",Object(n.a)({parentName:"li"},{href:"https://youtu.be/V8vGdoYO6-Y"}),"YouTube")," - ",Object(a.b)("a",Object(n.a)({parentName:"li"},{href:"https://www.digiblur.com/2021/05/how-to-setup-frigate-home-assistant.html"}),"Article")),Object(a.b)("li",{parentName:"ul"},"Even More Free Local Object Detection with Home Assistant - Frigate Install - Everything Smart Home ",Object(a.b)("a",Object(n.a)({parentName:"li"},{href:"https://youtu.be/pqDCEZSVeRk"}),"YouTube")),Object(a.b)("li",{parentName:"ul"},"Home Assistant Frigate integration for local image recognition - KPeyanski ",Object(a.b)("a",Object(n.a)({parentName:"li"},{href:"https://youtu.be/Q2UT78lFQpo"}),"YouTube")," - ",Object(a.b)("a",Object(n.a)({parentName:"li"},{href:"https://peyanski.com/home-assistant-frigate-integration/"}),"Article"))))}l.isMDXComponent=!0},99:function(e,t,r){"use strict";r.d(t,"a",(function(){returnp})),r.d(t,"b",(function(){returnf}));varn=r(0),o=r.n(n);functiona(e,t,r){returntine?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}functioni(e,t){varr=Object.keys(e);if(Object.getOwnPropertySymbols){varn=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){returnObject.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}returnr}functionc(e){for(vart=1;t<arguments.length;t++){varr=null!=arguments[t]?arguments[t]:{};t%2?i(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):i(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}returne}functionu(e,t){if(null==e)return{};varr,n,o=function(e,t){if(null==e)return{};varr,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);returno}(e,t);if(Object.getOwnPropertySymbols){vara=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}returno}vars=o.a.createContext({}),l=function(e){vart=o.a.useContext(s),r=t;returne&&(r="function"==typeofe?e(t):c(c({},t),e)),r},p=function(e){vart=l(e.components);returno.a.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){vart=e.children;returno.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){varr=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),p=l(r),b=n,f=p["".concat(i,".").concat(b)]||p[b]||m[b]||a;returnr?o.a.createElement(f,c(c({ref:t},s),{},{components:r})):o.a.createElement(f,c({ref:t},s))}));functionf(e,t){varr=arguments,n=t&&t.mdxType;if("string"==typeofe||n){vara=r.length,i=newArray(a);i[0]=b;varc={};for(varuint)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c.mdxType="string"==typeofe?e:n,i[1]=c;for(vars=2;s<a;s++)i[s]=r[s];returno.a.createElement.apply(null,i)}returno.a.createElement.apply(null,r)}b.displayName="MDXCreateElement"}}]);
<linkrel="alternate"type="application/rss+xml"href="/frigate/blog/rss.xml"title="Frigate Blog RSS Feed">
<linkrel="alternate"type="application/atom+xml"href="/frigate/blog/atom.xml"title="Frigate Blog Atom Feed">
<linkrel="search"type="application/opensearchdescription+xml"title="Frigate"href="/frigate/opensearch.xml"><titledata-react-helmet="true">nVidia hardware decoder | Frigate</title><metadata-react-helmet="true"name="twitter:card"content="summary_large_image"><metadata-react-helmet="true"name="docsearch:language"content="en"><metadata-react-helmet="true"name="docsearch:version"content="current"><metadata-react-helmet="true"name="docsearch:docusaurus_tag"content="docs-default-current"><metadata-react-helmet="true"property="og:title"content="nVidia hardware decoder | Frigate"><metadata-react-helmet="true"name="description"content="Certain nvidia cards include a hardware decoder, which can greatly improve the"><metadata-react-helmet="true"property="og:description"content="Certain nvidia cards include a hardware decoder, which can greatly improve the"><metadata-react-helmet="true"property="og:url"content="https://blakeblackshear.github.io/frigate/configuration/nvdec"><linkdata-react-helmet="true"rel="shortcut icon"href="/frigate/img/favicon.ico"><linkdata-react-helmet="true"rel="preconnect"href="https://BH4D9OD16A-dsn.algolia.net"crossorigin="anonymous"><linkdata-react-helmet="true"rel="canonical"href="https://blakeblackshear.github.io/frigate/configuration/nvdec"><linkrel="stylesheet"href="/frigate/styles.4dd8d972.css">
<navaria-label="Skip navigation links"><buttontype="button"tabindex="0"class="skipToContent_11B0">Skip to main content</button></nav><navclass="navbar navbar--fixed-top"><divclass="navbar__inner"><divclass="navbar__items"><divaria-label="Navigation bar toggle"class="navbar__toggle"role="button"tabindex="0"><svgaria-label="Menu"width="30"height="30"viewBox="0 0 30 30"role="img"focusable="false"><title>Menu</title><pathstroke="currentColor"stroke-linecap="round"stroke-miterlimit="10"stroke-width="2"d="M4 7h22M4 15h22M4 23h22"></path></svg></div><aclass="navbar__brand"href="/frigate/"><imgsrc="/frigate/img/logo.svg"alt="Frigate"class="themedImage_YANc themedImage--light_3CMI navbar__logo"><imgsrc="/frigate/img/logo-dark.svg"alt="Frigate"class="themedImage_YANc themedImage--dark_3ARp navbar__logo"><strongclass="navbar__title">Frigate</strong></a><aclass="navbar__item navbar__link"href="/frigate/">Docs</a></div><divclass="navbar__items navbar__items--right"><ahref="https://github.com/blakeblackshear/frigate"target="_blank"rel="noopener noreferrer"class="navbar__item navbar__link">GitHub</a><divclass="react-toggle react-toggle--disabled displayOnlyInLargeViewport_2N3Q"><divclass="react-toggle-track"><divclass="react-toggle-track-check"><spanclass="toggle_3NWk">🌜</span></div><divclass="react-toggle-track-x"><spanclass="toggle_3NWk">🌞</span></div></div><divclass="react-toggle-thumb"></div><inputtype="checkbox"disabled=""aria-label="Dark mode toggle"class="react-toggle-screenreader-only"></div><buttontype="button"class="DocSearch DocSearch-Button"aria-label="Search"><divclass="DocSearch-Button-Container"><svgwidth="20"height="20"class="DocSearch-Search-Icon"viewBox="0 0 20 20"><pathd="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z"stroke="currentColor"fill="none"fill-rule="evenodd"stroke-linecap="round"stroke-linejoin="round"></path></svg><spanclass="DocSearch-Button-Placeholder">Search</span></div></button></div></div><divrole="presentation"class="navbar-sidebar__backdrop"></div><divclass="navbar-sidebar"><divclass="navbar-sidebar__brand"><aclass="navbar__brand"href="/frigate/"><imgsrc="/frigate/img/logo.svg"alt="Frigate"class="themedImage_YANc themedImage--light_3CMI navbar__logo"><imgsrc="/frigate/img/logo-dark.svg"alt="Frigate"class="themedImage_YANc themedImage--dark_3ARp navbar__logo"><strongclass="navbar__title">Frigate</strong></a></div><divclass="navbar-sidebar__items"><divclass="menu"><ulclass="menu__list"><liclass="menu__list-item"><aclass="menu__link"href="/frigate/">Docs</a></li><liclass="menu__list-item"><ahref="https://github.com/blakeblackshear/frigate"target="_blank"rel="noopener noreferrer"class="menu__link">GitHub</a></li></ul></div></div></div></nav><divclass="main-wrapper"><divclass="docPage_vMrn"><mainclass="docMainContainer_2iGs"><divclass="container padding-vert--lg docItemWrapper_1bxp"><divclass="row"><divclass="col docItemCol_U38p"><divclass="docItemContainer_a7m4"><article><header><h1class="docTitle_Oumm">nVidia hardware decoder</h1></header><divclass="markdown"><p>Certain nvidia cards include a hardware decoder, which can greatly improve the
performance of video decoding. In order to use NVDEC, a special build of
ffmpeg with NVDEC support is required. The special docker architecture 'amd64nvidia'
includes this support for amd64 platforms. An aarch64 for the Jetson, which
also includes NVDEC may be added in the future.</p><h2><aaria-hidden="true"tabindex="-1"class="anchor enhancedAnchor_prK2"id="docker-setup"></a>Docker setup<aclass="hash-link"href="#docker-setup"title="Direct link to heading">#</a></h2><h3><aaria-hidden="true"tabindex="-1"class="anchor enhancedAnchor_prK2"id="requirements"></a>Requirements<aclass="hash-link"href="#requirements"title="Direct link to heading">#</a></h3><p><ahref="https://www.nvidia.com/en-us/drivers/unix/"target="_blank"rel="noopener noreferrer">nVidia closed source driver</a> required to access NVDEC.
<ahref="https://github.com/NVIDIA/nvidia-docker"target="_blank"rel="noopener noreferrer">nvidia-docker</a> required to pass NVDEC to docker.</p><h3><aaria-hidden="true"tabindex="-1"class="anchor enhancedAnchor_prK2"id="setting-up-docker-compose"></a>Setting up docker-compose<aclass="hash-link"href="#setting-up-docker-compose"title="Direct link to heading">#</a></h3><p>In order to pass NVDEC, the docker engine must be set to <code>nvidia</code> and the environment variables
<code>NVIDIA_VISIBLE_DEVICES=all</code> and <code>NVIDIA_DRIVER_CAPABILITIES=compute,utility,video</code> must be set.</p><p>In a docker compose file, these lines need to be set:</p><divclass="mdxCodeBlock_1zKU"><divclass="codeBlockContent_actS"><divtabindex="0"class="prism-code language-undefined codeBlock_tuNs thin-scrollbar"><divclass="codeBlockLines_3uvA"style="color:#bfc7d5;background-color:#292d3e"><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">services:</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> frigate:</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> ...</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> image: blakeblackshear/frigate:stable-amd64nvidia</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> runtime: nvidia</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> environment:</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> - NVIDIA_VISIBLE_DEVICES=all</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> - NVIDIA_DRIVER_CAPABILITIES=compute,utility,video</span></div></div></div><buttontype="button"aria-label="Copy code to clipboard"class="copyButton_2GIj">Copy</button></div></div><h3><aaria-hidden="true"tabindex="-1"class="anchor enhancedAnchor_prK2"id="setting-up-the-configuration-file"></a>Setting up the configuration file<aclass="hash-link"href="#setting-up-the-configuration-file"title="Direct link to heading">#</a></h3><p>In your frigate config.yml, you'll need to set ffmpeg to use the hardware decoder.
The decoder you choose will depend on the input video.</p><p>A list of supported codecs (you can use <code>ffmpeg -decoders | grep cuvid</code> in the container to get a list)</p><divclass="mdxCodeBlock_1zKU"><divclass="codeBlockContent_actS"><divtabindex="0"class="prism-code language-undefined codeBlock_tuNs thin-scrollbar"><divclass="codeBlockLines_3uvA"style="color:#bfc7d5;background-color:#292d3e"><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... h263_cuvid Nvidia CUVID H263 decoder (codec h263)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... hevc_cuvid Nvidia CUVID HEVC decoder (codec hevc)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... mjpeg_cuvid Nvidia CUVID MJPEG decoder (codec mjpeg)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... mpeg1_cuvid Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... mpeg4_cuvid Nvidia CUVID MPEG4 decoder (codec mpeg4)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... vc1_cuvid Nvidia CUVID VC1 decoder (codec vc1)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... vp8_cuvid Nvidia CUVID VP8 decoder (codec vp8)</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> V..... vp9_cuvid Nvidia CUVID VP9 decoder (codec vp9)</span></div></div></div><buttontype="button"aria-label="Copy code to clipboard"class="copyButton_2GIj">Copy</button></div></div><p>For example, for H265 video (hevc), you'll select <code>hevc_cuvid</code>. Add
<code>-c:v hevc_cuvid</code> to your ffmpeg input arguments:</p><divclass="mdxCodeBlock_1zKU"><divclass="codeBlockContent_actS"><divtabindex="0"class="prism-code language-undefined codeBlock_tuNs thin-scrollbar"><divclass="codeBlockLines_3uvA"style="color:#bfc7d5;background-color:#292d3e"><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">ffmpeg:</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> input_args:</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> ...</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> - -c:v</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> - hevc_cuvid</span></div></div></div><buttontype="button"aria-label="Copy code to clipboard"class="copyButton_2GIj">Copy</button></div></div><p>If everything is working correctly, you should see a significant improvement in performance.
Verify that hardware decoding is working by running <code>nvidia-smi</code>, which should show the ffmpeg
</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">+-----------------------------------------------------------------------------+</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| Processes: |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| GPU GI CI PID Type Process name GPU Memory |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| ID ID Usage |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">|=============================================================================|</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12737 C ffmpeg 249MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12751 C ffmpeg 249MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12772 C ffmpeg 249MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12775 C ffmpeg 249MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12800 C ffmpeg 249MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12811 C ffmpeg 417MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">| 0 N/A N/A 12827 C ffmpeg 417MiB |</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain">+-----------------------------------------------------------------------------+</span></div></div></div><buttontype="button"aria-label="Copy code to clipboard"class="copyButton_2GIj">Copy</button></div></div><p>To further improve performance, you can set ffmpeg to skip frames in the output,
using the fps filter:</p><divclass="mdxCodeBlock_1zKU"><divclass="codeBlockContent_actS"><divtabindex="0"class="prism-code language-undefined codeBlock_tuNs thin-scrollbar"><divclass="codeBlockLines_3uvA"style="color:#bfc7d5;background-color:#292d3e"><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> output_args:</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> - -filter:v</span></div><divclass="token-line"style="color:#bfc7d5"><spanclass="token plain"> - fps=fps=5</span></div></div></div><buttontype="button"aria-label="Copy code to clipboard"class="copyButton_2GIj">Copy</button></div></div><p>This setting, for example, allows Frigate to consume my 10-15fps camera streams on
# Optional: module by module log level configuration
logs:
frigate.mqtt:error
```
Available log levels are: `debug`, `info`, `warning`, `error`, `critical`
Examples of available modules are:
-`frigate.app`
-`frigate.mqtt`
-`frigate.edgetpu`
-`frigate.zeroconf`
-`detector.<detector_name>`
-`watchdog.<camera_name>`
-`ffmpeg.<camera_name>.<sorted_roles>` NOTE: All FFmpeg logs are sent as `error` level.
### `environment_vars`
This section can be used to set environment variables for those unable to modify the environment of the container (ie. within HassOS)
### `database`
Event and recording information is managed in a sqlite database at `/media/frigate/frigate.db`. If that database is deleted, recordings will be orphaned and will need to be cleaned up manually. They also won't show up in the Media Browser within Home Assistant.
If you are storing your database on a network share (SMB, NFS, etc), you may get a `database is locked` error message on startup. You can customize the location of the database in the config if necessary.
This may need to be in a custom location if network storage is used for the media folder.
```yaml
database:
path:/path/to/frigate.db
```
### `model`
If using a custom model, the width and height will need to be specified.
The labelmap can be customized to your needs. A common reason to do this is to combine multiple object types that are easily confused when you don't need to be as granular such as car/truck. By default, truck is renamed to car because they are often confused. You cannot add new object types, but you can change the names of existing objects in the model.
```yaml
model:
labelmap:
2:vehicle
3:vehicle
5:vehicle
7:vehicle
15:animal
16:animal
17:animal
```
Note that if you rename objects in the labelmap, you will also need to update your `objects -> track` list as well.
## Custom ffmpeg build
Included with Frigate is a build of ffmpeg that works for the vast majority of users. However, there exists some hardware setups which have incompatibilities with the included build. In this case, a docker volume mapping can be used to overwrite the included ffmpeg build with an ffmpeg build that works for your specific hardware setup.
To do this:
1. Download your ffmpeg build and uncompress to a folder on the host (let's use `/home/appdata/frigate/custom-ffmpeg` for this example).
2. Update your docker-compose or docker CLI to include `'/home/appdata/frigate/custom-ffmpeg':'/usr/lib/btbn-ffmpeg':'ro'` in the volume mappings.
3. Restart frigate and the custom version will be used if the mapping was done correctly.
NOTE: The folder that is mapped from the host needs to be the folder that contains `/bin`. So if the full structure is `/home/appdata/frigate/custom-ffmpeg/bin/ffmpeg` then `/home/appdata/frigate/custom-ffmpeg` needs to be mapped to `/usr/lib/btbn-ffmpeg`.
Birdseye allows a heads-up view of your cameras to see what is going on around your property / space without having to watch all cameras that may have nothing happening. Birdseye allows specific modes that intelligently show and disappear based on what you care about.
### Birdseye Modes
Birdseye offers different modes to customize which cameras show under which circumstances.
- **continuous:** All cameras are always included
- **motion:** Cameras that have detected motion within the last 30 seconds are included
- **objects:** Cameras that have tracked an active object within the last 30 seconds are included
### Custom Birdseye Icon
A custom icon can be added to the birdseye background by provided a file `custom.png` inside of the Frigate `media` folder. The file must be a png with the icon as transparent, any non-transparent pixels will be white when displayed in the birdseye view.
Note that mjpeg cameras require encoding the video into h264 for recording, and rtmp roles. This will use significantly more CPU than if the cameras supported h264 feeds directly.
According to [this discussion](https://github.com/blakeblackshear/frigate/issues/3235#issuecomment-1135876973), the http video streams seem to be the most reliable for Reolink.
In the Unifi 2.0 update Unifi Protect Cameras had a change in audio sample rate which causes issues for ffmpeg. The input rate needs to be set for record and rtmp.
Several inputs can be configured for each camera and the role of each input can be mixed and matched based on your needs. This allows you to use a lower resolution stream for object detection, but create recordings from a higher resolution stream, or vice versa.
Each role can only be assigned to one input per camera. The options for roles are as follows:
By default, Frigate will use a single CPU detector. If you have a Coral, you will need to configure your detector devices in the config file. When using multiple detectors, they run in dedicated processes, but pull from a common queue of requested detections across all cameras.
Frigate supports `edgetpu` and `cpu` as detector types. The device value should be specified according to the [Documentation for the TensorFlow Lite Python API](https://coral.ai/docs/edgetpu/multiple-edgetpu/#using-the-tensorflow-lite-python-api).
**Note**: There is no support for Nvidia GPUs to perform object detection with tensorflow. It can be used for ffmpeg decoding, but not object detection.
### Single USB Coral
```yaml
detectors:
coral:
type:edgetpu
device:usb
```
### Multiple USB Corals
```yaml
detectors:
coral1:
type:edgetpu
device:usb:0
coral2:
type:edgetpu
device:usb:1
```
### Native Coral (Dev Board)
_warning: may have [compatibility issues](https://github.com/blakeblackshear/frigate/issues/1706) after `v0.9.x`_
```yaml
detectors:
coral:
type:edgetpu
device:""
```
### Multiple PCIE/M.2 Corals
```yaml
detectors:
coral1:
type:edgetpu
device:pci:0
coral2:
type:edgetpu
device:pci:1
```
### Mixing Corals
```yaml
detectors:
coral_usb:
type:edgetpu
device:usb
coral_pci:
type:edgetpu
device:pci
```
### CPU Detectors (not recommended)
```yaml
detectors:
cpu1:
type:cpu
num_threads:3
cpu2:
type:cpu
num_threads:3
```
When using CPU detectors, you can add a CPU detector per camera. Adding more detectors than the number of cameras should not improve performance.
It is recommended to update your configuration to enable hardware accelerated decoding in ffmpeg. Depending on your system, these parameters may not be compatible. More information on hardware accelerated decoding for ffmpeg can be found here: https://trac.ffmpeg.org/wiki/HWAccelIntro
### Raspberry Pi 3/4
Ensure you increase the allocated RAM for your GPU to at least 128 (raspi-config > Performance Options > GPU Memory).
**NOTICE**: If you are using the addon, you may need to turn off `Protection mode` for hardware acceleration.
```yaml
ffmpeg:
hwaccel_args:-c:v h264_v4l2m2m
```
### Intel-based CPUs (<10th Generation) via Quicksync
**NOTICE**: With some of the processors, like the J4125, the default driver `iHD` doesn't seem to work correctly for hardware acceleration. You may need to change the driver to `i965` by adding the following environment variable `LIBVA_DRIVER_NAME=i965` to your docker-compose file.
### Intel-based CPUs (>=10th Generation) via Quicksync
```yaml
ffmpeg:
hwaccel_args:-c:v h264_qsv
```
### AMD/ATI GPUs (Radeon HD 2000 and newer GPUs) via libva-mesa-driver
**Note:** You also need to set `LIBVA_DRIVER_NAME=radeonsi` as an environment variable on the container.
[Supported Nvidia GPUs for Decoding](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new)
These instructions are based on the [jellyfin documentation](https://jellyfin.org/docs/general/administration/hardware-acceleration.html#nvidia-hardware-acceleration-on-docker-linux)
Add `--gpus all` to your docker run command or update your compose file.
```yaml
services:
frigate:
...
image:blakeblackshear/frigate:stable
deploy:# <------------- Add this section
resources:
reservations:
devices:
- driver:nvidia
count:1
capabilities:[gpu]
```
The decoder you need to pass in the `hwaccel_args` will depend on the input video.
A list of supported codecs (you can use `ffmpeg -decoders | grep cuvid` in the container to get a list)
For Home Assistant Addon installations, the config file needs to be in the root of your Home Assistant config directory (same location as `configuration.yaml`) and named `frigate.yml`.
For all other installation types, the config file should be mapped to `/config/config.yml` inside the container.
It is recommended to start with a minimal configuration and add to it as described in [this guide](/guides/getting_started):
VSCode (and VSCode addon) supports the JSON schemas which will automatically validate the config. This can be added by adding `# yaml-language-server: $schema=http://frigate_host:5000/api/config/schema` to the top of the config file. `frigate_host` being the IP address of frigate or `ccab4aaf-frigate` if running in the addon.
### Full configuration reference:
:::caution
It is not recommended to copy this full configuration file. Only specify values that are different from the defaults. Configuration options and default values may change in future versions.
:::
```yaml
mqtt:
# Required: host name
host:mqtt.server.com
# Optional: port (default: shown below)
port:1883
# Optional: topic prefix (default: shown below)
# NOTE: must be unique if you are running multiple instances
topic_prefix:frigate
# Optional: client id (default: shown below)
# NOTE: must be unique if you are running multiple instances
client_id:frigate
# Optional: user
user:mqtt_user
# Optional: password
# NOTE: MQTT password can be specified with an environment variables that must begin with 'FRIGATE_'.
# e.g. password: '{FRIGATE_MQTT_PASSWORD}'
password:password
# Optional: tls_ca_certs for enabling TLS using self-signed certs (default: None)
tls_ca_certs:/path/to/ca.crt
# Optional: tls_client_cert and tls_client key in order to use self-signed client
# certificates (default: None)
# NOTE: certificate must not be password-protected
# do not set user and password when using a client certificate
tls_client_cert:/path/to/client.crt
tls_client_key:/path/to/client.key
# Optional: tls_insecure (true/false) for enabling TLS verification of
# the server hostname in the server certificate (default: None)
tls_insecure:false
# Optional: interval in seconds for publishing stats (default: shown below)
stats_interval:60
# Optional: Detectors configuration. Defaults to a single CPU detector
detectors:
# Required: name of the detector
coral:
# Required: type of the detector
# Valid values are 'edgetpu' (requires device property below) and 'cpu'.
type:edgetpu
# Optional: device name as defined here: https://coral.ai/docs/edgetpu/multiple-edgetpu/#using-the-tensorflow-lite-python-api
device:usb
# Optional: num_threads value passed to the tflite.Interpreter (default: shown below)
# This value is only used for CPU types
num_threads:3
# Optional: Database configuration
database:
# The path to store the SQLite DB (default: shown below)
path:/media/frigate/frigate.db
# Optional: model modifications
model:
# Optional: path to the model (default: automatic based on detector)
path:/edgetpu_model.tflite
# Optional: path to the labelmap (default: shown below)
labelmap_path:/labelmap.txt
# Required: Object detection model input width (default: shown below)
width:320
# Required: Object detection model input height (default: shown below)
height:320
# Optional: Label name modifications. These are merged into the standard labelmap.
**Motion masks**: Motion masks are used to prevent unwanted types of motion from triggering detection. Try watching the debug feed with `Motion Boxes` enabled to see what may be regularly detected as motion. For example, you want to mask out your timestamp, the sky, rooftops, etc. Keep in mind that this mask only prevents motion from being detected and does not prevent objects from being detected if object detection was started due to motion in unmasked areas. Motion is also used during object tracking to refine the object detection area in the next frame. Over masking will make it more difficult for objects to be tracked. To see this effect, create a mask, and then watch the video feed with `Motion Boxes` enabled again.
**Object filter masks**: Object filter masks are used to filter out false positives for a given object type based on location. These should be used to filter any areas where it is not possible for an object of that type to be. The bottom center of the detected object's bounding box is evaluated against the mask. If it is in a masked area, it is assumed to be a false positive. For example, you may want to mask out rooftops, walls, the sky, treetops for people. For cars, masking locations other than the street or your driveway will tell frigate that anything in your yard is a false positive.
To create a poly mask:
1. Visit the Web UI
1. Click the camera you wish to create a mask for
1. Select "Debug" at the top
1. Expand the "Options" below the video feed
1. Click "Mask & Zone creator"
1. Click "Add" on the type of mask or zone you would like to create
1. Click on the camera's latest image to create a masked area. The yaml representation will be updated in real-time
1. When you've finished creating your mask, click "Copy" and paste the contents into your config file and restart Frigate
Example of a finished row corresponding to the below example image:
This is a response to a [question posed on reddit](https://www.reddit.com/r/homeautomation/comments/ppxdve/replacing_my_doorbell_with_a_security_camera_a_6/hd876w4?utm_source=share&utm_medium=web2x&context=3):
It is helpful to understand a bit about how Frigate uses motion detection and object detection together.
First, Frigate uses motion detection as a first line check to see if there is anything happening in the frame worth checking with object detection.
Once motion is detected, it tries to group up nearby areas of motion together in hopes of identifying a rectangle in the image that will capture the area worth inspecting. These are the red "motion boxes" you see in the debug viewer.
After the area with motion is identified, Frigate creates a "region" (the green boxes in the debug viewer) to run object detection on. The models are trained on square images, so these regions are always squares. It adds a margin around the motion area in hopes of capturing a cropped view of the object moving that fills most of the image passed to object detection, but doesn't cut anything off. It also takes into consideration the location of the bounding box from the previous frame if it is tracking an object.
After object detection runs, if there are detected objects that seem to be cut off, Frigate reframes the region and runs object detection again on the same frame to get a better look.
All of this happens for each area of motion and tracked object.
> Are you simply saying that INITIAL triggering of any kind of detection will only happen in un-masked areas, but that once this triggering happens, the masks become irrelevant and object detection takes precedence?
Essentially, yes. I wouldn't describe it as object detection taking precedence though. The motion masks just prevent those areas from being counted as motion. Those masks do not modify the regions passed to object detection in any way, so you can absolutely detect objects in areas masked for motion.
> If so, this is completely expected and intuitive behavior for me. Because obviously if a "foot" starts motion detection the camera should be able to check if it's an entire person before it fully crosses into the zone. The docs imply this is the behavior, so I also don't understand why this would be detrimental to object detection on the whole.
When just a foot is triggering motion, Frigate will zoom in and look only at the foot. If that even qualifies as a person, it will determine the object is being cut off and look again and again until it zooms back out enough to find the whole person.
It is also detrimental to how Frigate tracks a moving object. Motion nearby the bounding box from the previous frame is used to intelligently determine where the region should be in the next frame. With too much masking, tracking is hampered and if an object walks from an unmasked area into a fully masked area, they essentially disappear and will be picked up as a "new" object if they leave the masked area. This is important because Frigate uses the history of scores while tracking an object to determine if it is a false positive or not. It takes a minimum of 3 frames for Frigate to determine is the object type it thinks it is, and the median score must be greater than the threshold. If a person meets this threshold while on the sidewalk before they walk into your stoop, you will get an alert the instant they step a single foot into a zone.
> I thought the main point of this feature was to cut down on CPU use when motion is happening in unnecessary areas.
It is, but the definition of "unnecessary" varies. I want to ignore areas of motion that I know are definitely not being triggered by objects of interest. Timestamps, trees, sky, rooftops. I don't want to ignore motion from objects that I want to track and know where they go.
> For me, giving my masks ANY padding results in a lot of people detection I'm not interested in. I live in the city and catch a lot of the sidewalk on my camera. People walk by my front door all the time and the margin between the sidewalk and actually walking onto my stoop is very thin, so I basically have everything but the exact contours of my stoop masked out. This results in very tidy detections but this info keeps throwing me off. Am I just overthinking it?
This is what `required_zones` are for. You should define a zone (remember this is evaluated based on the bottom center of the bounding box) and make it required to save snapshots and clips (now events in 0.9.0). You can also use this in your conditions for a notification.
> Maybe my specific situation just warrants this. I've just been having a hard time understanding the relevance of this information - it seems to be that it's exactly what would be expected when "masking out" an area of ANY image.
That may be the case for you. Frigate will definitely work harder tracking people on the sidewalk to make sure it doesn't miss anyone who steps foot on your stoop. The trade off with the way you have it now is slower recognition of objects and potential misses. That may be acceptable based on your needs. Also, if your resolution is low enough on the detect stream, your regions may already be so big that they grab the entire object anyway.
Frigate includes the object models listed below from the Google Coral test data.
Please note:
- `car` is listed twice because `truck` has been renamed to `car` by default. These object types are frequently confused.
- `person` is the only tracked object by default. See the [full configuration reference](https://docs.frigate.video/configuration/index#full-configuration-reference) for an example of expanding the list of tracked objects.
<ul>
{labels.split("\n").map((label) => (
<li>{label.replace(/^\d+\s+/, "")}</li>
))}
</ul>
## Custom Models
Models for both CPU and EdgeTPU (Coral) are bundled in the image. You can use your own models with volume mounts:
- CPU Model: `/cpu_model.tflite`
- EdgeTPU Model: `/edgetpu_model.tflite`
- Labels: `/labelmap.txt`
You also need to update the [model config](/configuration/advanced#model) if they differ from the defaults.
Recordings can be enabled and are stored at `/media/frigate/recordings`. The folder structure for the recordings is `YYYY-MM/DD/HH/<camera_name>/MM.SS.mp4`. These recordings are written directly from your camera stream without re-encoding. Each camera supports a configurable retention policy in the config. Frigate chooses the largest matching retention value between the recording retention and the event retention when determining if a recording should be removed.
H265 recordings can be viewed in Edge and Safari only. All other browsers require recordings to be encoded with H264.
## What if I don't want 24/7 recordings?
If you only used clips in previous versions with recordings disabled, you can use the following config to get the same behavior. This is also the default behavior when recordings are enabled.
```yaml
record:
enabled:True
events:
retain:
default:10
```
This configuration will retain recording segments that overlap with events and have active tracked objects for 10 days. Because multiple events can reference the same recording segments, this avoids storing duplicate footage for overlapping events and reduces overall storage needs.
When `retain -> days` is set to `0`, segments will be deleted from the cache if no events are in progress.
## Can I have "24/7" recordings, but only at certain times?
Using Frigate UI, HomeAssistant, or MQTT, cameras can be automated to only record in certain situations or at certain times.
**WARNING**: Recordings still must be enabled in the config. If a camera has recordings disabled in the config, enabling via the methods listed above will have no effect.
## What do the different retain modes mean?
Frigate saves from the stream with the `record` role in 10 second segments. These options determine which recording segments are kept for 24/7 recording (but can also affect events).
Let's say you have frigate configured so that your doorbell camera would retain the last **2** days of 24/7 recording.
- With the `all` option all 48 hours of those two days would be kept and viewable.
- With the `motion` option the only parts of those 48 hours would be segments that frigate detected motion. This is the middle ground option that won't keep all 48 hours, but will likely keep all segments of interest along with the potential for some extra segments.
- With the `active_objects` option the only segments that would be kept are those where there was a true positive object that was not considered stationary.
The same options are available with events. Let's consider a scenario where you drive up and park in your driveway, go inside, then come back out 4 hours later.
- With the `all` option all segments for the duration of the event would be saved for the event. This event would have 4 hours of footage.
- With the `motion` option all segments for the duration of the event with motion would be saved. This means any segment where a car drove by in the street, person walked by, lighting changed, etc. would be saved.
- With the `active_objects` it would only keep segments where the object was active. In this case the only segments that would be saved would be the ones where the car was driving up, you going inside, you coming outside, and the car driving away. Essentially reducing the 4 hours to a minute or two of event footage.
A configuration example of the above retain modes where all `motion` segments are stored for 7 days and `active objects` are stored for 14 days would be as follows:
```yaml
record:
enabled:True
retain:
days:7
mode:motion
events:
retain:
default:14
mode:active_objects
```
The above configuration example can be added globally or on a per camera basis.
### Object Specific Retention
You can also set specific retention length for an object type. The below configuration example builds on from above but also specifies that recordings of dogs only need to be kept for 2 days and recordings of cars should be kept for 7 days.
Frigate can re-stream your video feed as a RTMP feed for other applications such as Home Assistant to utilize it at `rtmp://<frigate_host>/live/<camera_name>`. Port 1935 must be open. This allows you to use a video feed for detection in frigate and Home Assistant live view at the same time without having to make two separate connections to the camera. The video feed is copied from the original video feed directly to avoid re-encoding. This feed does not include any annotation by Frigate.
Some video feeds are not compatible with RTMP. If you are experiencing issues, check to make sure your camera feed is h264 with AAC audio. If your camera doesn't support a compatible format for RTMP, you can use the ffmpeg args to re-encode it on the fly at the expense of increased CPU utilization. Some more information about it can be found [here](/faqs#audio-in-recordings).
An object is considered stationary when it is being tracked and has been in a very similar position for a certain number of frames. This number is defined in the configuration under `detect -> stationary -> threshold`, and is 10x the frame rate (or 10 seconds) by default. Once an object is considered stationary, it will remain stationary until motion occurs near the object at which point object detection will start running again. If the object changes location, it will be considered active.
## Why does it matter if an object is stationary?
Once an object becomes stationary, object detection will not be continually run on that object. This serves to reduce resource usage and redundant detections when there has been no motion near the tracked object. This also means that Frigate is contextually aware, and can for example [filter out recording segments](record.md#what-do-the-different-retain-modes-mean) to only when the object is considered active. Motion alone does not determine if an object is "active" for active_objects segment retention. Lighting changes for a parked car won't make an object active.
## Tuning stationary behavior
The default config is:
```yaml
detect:
stationary:
interval:0
threshold:50
```
`interval` is defined as the frequency for running detection on stationary objects. This means that by default once an object is considered stationary, detection will not be run on it until motion is detected. With `interval > 0`, every nth frames detection will be run to make sure the object is still there.
NOTE: There is no way to disable stationary object tracking with this value.
`threshold` is the number of frames an object needs to remain relatively still before it is considered stationary.
## Avoiding stationary objects
In some cases, like a driveway, you may prefer to only have an event when a car is coming & going vs a constant event of it stationary in the driveway. [This docs sections](../guides/stationary_objects.md) explains how to approach that scenario.
While developing and testing new components, users may decide to opt-in to test potential new features on the front-end.
```yaml
ui:
use_experimental:true
```
Note that experimental changes may contain bugs or may be removed at any time in future releases of the software. Use of these features are presented as-is and with no functional guarantee.
Zones allow you to define a specific area of the frame and apply additional filters for object types so you can determine whether or not an object is within a particular area. Presence in a zone is evaluated based on the bottom center of the bounding box for the object. It does not matter how much of the bounding box overlaps with the zone.
Zones cannot have the same name as a camera. If desired, a single zone can include multiple cameras if you have multiple cameras covering the same area by configuring zones with the same name for each camera.
During testing, enable the Zones option for the debug feed so you can adjust as needed. The zone line will increase in thickness when any object enters the zone.
To create a zone, follow [the steps for a "Motion mask"](/configuration/masks), but use the section of the web UI for creating a zone instead.
### Restricting zones to specific objects
Sometimes you want to limit a zone to specific object types to have more granular control of when events/snapshots are saved. The following example will limit one zone to person objects and the other to cars.
```yaml
camera:
record:
events:
required_zones:
- entire_yard
- front_yard_street
snapshots:
required_zones:
- entire_yard
- front_yard_street
zones:
entire_yard:
coordinates:... (everywhere you want a person)
objects:
- person
front_yard_street:
coordinates:... (just the street)
objects:
- car
```
Only car objects can trigger the `front_yard_street` zone and only person can trigger the `entire_yard`. You will get events for person objects that enter anywhere in the yard, and events for cars only if they enter the street.
This repository holds the main Frigate application and all of its dependencies.
Fork [blakeblackshear/frigate](https://github.com/blakeblackshear/frigate.git) to your own GitHub profile, then clone the forked repo to your local machine.
From here, follow the guides for:
- [Core](#core)
- [Web Interface](#web-interface)
- [Documentation](#documentation)
### Frigate Home Assistant Addon
This repository holds the Home Assistant Addon, for use with Home Assistant OS and compatible installations. It is the piece that allows you to run Frigate from your Home Assistant Supervisor tab.
Fork [blakeblackshear/frigate-hass-addons](https://github.com/blakeblackshear/frigate-hass-addons) to your own Github profile, then clone the forked repo to your local machine.
### Frigate Home Assistant Integration
This repository holds the custom integration that allows your Home Assistant installation to automatically create entities for your Frigate instance, whether you run that with the [addon](#frigate-home-assistant-addon) or in a separate Docker instance.
Fork [blakeblackshear/frigate-hass-integration](https://github.com/blakeblackshear/frigate-hass-integration) to your own GitHub profile, then clone the forked repo to your local machine.
- Extra Coral device (optional, but very helpful to simulate real world performance)
### Setup
#### 1. Build the version information and docker container locally by running `make`
#### 2. Create a local config file for testing
Place the file at `config/config.yml` in the root of the repo.
Here is an example, but modify for your needs:
```yaml
mqtt:
host:mqtt
cameras:
test:
ffmpeg:
inputs:
- path:/media/frigate/car-stopping.mp4
input_args:-re -stream_loop -1 -fflags +genpts
roles:
- detect
- rtmp
detect:
height:1080
width:1920
fps:5
```
These input args tell ffmpeg to read the mp4 file in an infinite loop. You can use any valid ffmpeg input here.
#### 3. Gather some mp4 files for testing
Create and place these files in a `debug` folder in the root of the repo. This is also where recordings will be created if you enable them in your test config. Update your config from step 2 above to point at the right file. You can check the `docker-compose.yml` file in the repo to see how the volumes are mapped.
#### 4. Open the repo with Visual Studio Code
Upon opening, you should be prompted to open the project in a remote container. This will build a container on top of the base frigate container with all the development dependencies installed. This ensures everyone uses a consistent development environment without the need to install any dependencies on your host machine.
#### 5. Run frigate from the command line
VSCode will start the docker compose file for you and open a terminal window connected to `frigate-dev`.
- Run `python3 -m frigate` to start the backend.
- In a separate terminal window inside VS Code, change into the `web` directory and run `npm install && npm start` to start the frontend.
#### 6. Teardown
After closing VSCode, you may still have containers running. To close everything down, just run `docker-compose down -v` to cleanup all containers.
### Testing
#### FFMPEG Hardware Acceleration
The following commands are used inside the container to ensure hardware acceleration is working properly.
**Raspberry Pi (64bit)**
This should show <50% CPU in top, and ~80% CPU without `-c:v h264_v4l2m2m`.
- All [core](#core) prerequisites _or_ another running Frigate instance locally available
- Node.js 14
### Making changes
#### 1. Set up a Frigate instance
The Web UI requires an instance of Frigate to interact with for all of its data. You can either run an instance locally (recommended) or attach to a separate instance accessible on your network.
To run the local instance, follow the [core](#core) development instructions.
If you won't be making any changes to the Frigate HTTP API, you can attach the web development server to any Frigate instance on your network. Skip this step and go to [3a](#3a-run-the-development-server-against-a-non-local-instance).
#### 2. Install dependencies
```console
cd web && npm install
```
#### 3. Run the development server
```console
cd web && npm run dev
```
#### 3a. Run the development server against a non-local instance
To run the development server against a non-local instance, you will need to modify the API_HOST default return in `web/src/env.js`.
#### 4. Making changes
The Web UI is built using [Vite](https://vitejs.dev/), [Preact](https://preactjs.com), and [Tailwind CSS](https://tailwindcss.com).
Light guidelines and advice:
- Avoid adding more dependencies. The web UI intends to be lightweight and fast to load.
- Do not make large sweeping changes. [Open a discussion on GitHub](https://github.com/blakeblackshear/frigate/discussions/new) for any large or architectural ideas.
- Ensure `lint` passes. This command will ensure basic conformance to styles, applying as many automatic fixes as possible, including Prettier formatting.
```console
npm run lint
```
- Add to unit tests and ensure they pass. As much as possible, you should strive to _increase_ test coverage whenever making changes. This will help ensure features do not accidentally become broken in the future.
```console
npm run test
```
- Test in different browsers. Firefox, Chrome, and Safari all have different quirks that make them unique targets to interact with.
This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server.
The docs are built using [Docusaurus v2](https://v2.docusaurus.io). Please refer to the Docusaurus docs for more information on how to modify Frigate's documentation.
#### 3. Build (optional)
```console
npm run build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
This error message is due to a shm-size that is too small. Try updating your shm-size according to [this guide](/installation#calculating-required-shm-size).
### I am seeing a solid green image for my camera.
A solid green image means that frigate has not received any frames from ffmpeg. Check the logs to see why ffmpeg is exiting and adjust your ffmpeg args accordingly.
### How can I get sound or audio in my recordings? {#audio-in-recordings}
By default, Frigate removes audio from recordings to reduce the likelihood of failing for invalid data. If you would like to include audio, you need to override the output args to remove `-an` for where you want to include audio. The recommended audio codec is `aac`. Not all audio codecs are supported by RTMP, so you may need to re-encode your audio with `-c:a aac`. The default ffmpeg args are shown [here](/configuration/index/#full-configuration-reference).
:::tip
When using `-c:a aac`, do not forget to replace `-c copy` with `-c:v copy`. Example:
This is needed because the `-c` flag (without `:a` or `:v`) applies for both audio and video, thus making it conflicting with `-c:a aac`.
:::
### My mjpeg stream or snapshots look green and crazy
This almost always means that the width/height defined for your camera are not correct. Double check the resolution with vlc or another player. Also make sure you don't have the width and height values backwards.
### I can't view events or recordings in the Web UI.
Ensure your cameras send h264 encoded video
### "[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5639eeb6e140] moov atom not found"
These messages in the logs are expected in certain situations. Frigate checks the integrity of the recordings before storing. Occasionally these cached files will be invalid and cleaned up automatically.
### "On connect called"
If you see repeated "On connect called" messages in your config, check for another instance of frigate. This happens when multiple frigate containers are trying to connect to mqtt with the same client_id.
### Error: Database Is Locked
sqlite does not work well on a network share, if the `/media` folder is mapped to a network share then [this guide](/configuration/advanced#database) should be used to move the database to a location on the internal drive.
Cameras configured to output H.264 video and AAC audio will offer the most compatibility with all features of Frigate and Home Assistant. H.265 has better compression, but far less compatibility. Safari and Edge are the only browsers able to play H.265. Ideally, cameras should be configured directly for the desired resolutions and frame rates you want to use in Frigate. Reducing frame rates within Frigate will waste CPU resources decoding extra frames that are discarded. There are three different goals that you want to tune your stream configurations around.
- **Detection**: This is the only stream that Frigate will decode for processing. Also, this is the stream where snapshots will be generated from. The resolution for detection should be tuned for the size of the objects you want to detect. See [Choosing a detect resolution](#choosing-a-detect-resolution) for more details. The recommended frame rate is 5fps, but may need to be higher for very fast moving objects. Higher resolutions and frame rates will drive higher CPU usage on your server.
- **Recording**: This stream should be the resolution you wish to store for reference. Typically, this will be the highest resolution your camera supports. I recommend setting this feed to 15 fps.
- **Stream Viewing**: This stream will be rebroadcast as is to Home Assistant for viewing with the stream component. Setting this resolution too high will use significant bandwidth when viewing streams in Home Assistant, and they may not load reliably over slower connections.
### Choosing a detect resolution
The ideal resolution for detection is one where the objects you want to detect fit inside the dimensions of the model used by Frigate (320x320). Frigate does not pass the entire camera frame to object detection. It will crop an area of motion from the full frame and look in that portion of the frame. If the area being inspected is larger than 320x320, Frigate must resize it before running object detection. Higher resolutions do not improve the detection accuracy because the additional detail is lost in the resize. Below you can see a reference for how large a 320x320 area is against common resolutions.
Larger resolutions **do** improve performance if the objects are very small in the frame.

### Example Camera Configuration
For the Dahua/Loryta 5442 camera, I use the following settings:
[Snapshots](../configuration/snapshots.md) and/or [Recordings](../configuration/record.md) must be enabled for events to be created for detected objects.
## Limiting Events to Areas of Interest
The best way to limit events to areas of interest is to use [zones](../configuration/zones.md) along with `required_zones` for events and snapshots to only have events created in areas of interest.
Tune your object filters to adjust false positives: `min_area`, `max_area`, `min_ratio`, `max_ratio`, `min_score`, `threshold`.
The `min_area` and `max_area` values are compared against the area (number of pixels) from a given detected object. If the area is outside this range, the object will be ignored as a false positive. This allows objects that must be too small or too large to be ignored.
Similarly, the `min_ratio` and `max_ratio` values are compared against a given detected object's width/height ratio (in pixels). If the ratio is outside this range, the object will be ignored as a false positive. This allows objects that are proportionally too short-and-wide (higher ratio) or too tall-and-narrow (smaller ratio) to be ignored.
For object filters in your configuration, any single detection below `min_score` will be ignored as a false positive. `threshold` is based on the median of the history of scores (padded to 3 values) for a tracked object. Consider the following frames when `min_score` is set to 0.6 and threshold is set to 0.85:
| Frame | Current Score | Score History | Computed Score | Detected Object |
In frame 2, the score is below the `min_score` value, so frigate ignores it and it becomes a 0.0. The computed score is the median of the score history (padding to at least 3 values), and only when that computed score crosses the `threshold` is the object marked as a true positive. That happens in frame 4 in the example.
This guide walks through the steps to build a configuration file for Frigate. It assumes that you already have an environment setup as described in [Installation](/installation). You should also configure your cameras according to the [camera setup guide](/guides/camera_setup)
### Step 1: Configure the MQTT server
Frigate requires a functioning MQTT server. Start by adding the mqtt section at the top level in your config:
```yaml
mqtt:
host:<ip of your mqtt server>
```
If using the Mosquitto Addon in Home Assistant, a username and password is required. For example:
```yaml
mqtt:
host:<ip of your mqtt server>
user:<username>
password:<password>
```
Frigate supports many configuration options for mqtt. See the [configuration reference](/configuration/index#full-configuration-reference) for more info.
### Step 2: Configure detectors
By default, Frigate will use a single CPU detector. If you have a USB Coral, you will need to add a detectors section to your config.
```yaml
mqtt:
host:<ip of your mqtt server>
detectors:
coral:
type:edgetpu
device:usb
```
More details on available detectors can be found [here](/configuration/detectors).
### Step 3: Add a minimal camera configuration
Now let's add the first camera:
:::caution
Note that passwords that contain special characters often cause issues with ffmpeg connecting to the cameara. If recieving `end-of-file` or `unauthorized` errors with a verified correct password, try changing the password to something simple to rule out the possibility that the password is the issue.
:::
```yaml
mqtt:
host:<ip of your mqtt server>
detectors:
coral:
type:edgetpu
device:usb
cameras:
camera_1:# <------ Name the camera
ffmpeg:
inputs:
- path:rtsp://10.0.10.10:554/rtsp# <----- Update for your camera
roles:
- detect
- rtmp
rtmp:
enabled:False# <-- RTMP should be disabled if your stream is not H264
detect:
width:1280# <---- update for your camera's resolution
height:720# <---- update for your camera's resolution
```
### Step 4: Start Frigate
At this point you should be able to start Frigate and see the the video feed in the UI.
If you get a green image from the camera, this means ffmpeg was not able to get the video feed from your camera. Check the logs for error messages from ffmpeg. The default ffmpeg arguments are designed to work with H264 RTSP cameras that support TCP connections. If you do not have H264 cameras, make sure you have disabled RTMP. It is possible to enable it, but you must tell ffmpeg to re-encode the video with customized output args.
FFmpeg arguments for other types of cameras can be found [here](/configuration/camera_specific).
Now that you have a working camera configuration, you want to setup hardware acceleration to minimize the CPU required to decode your video streams. See the [hardware acceleration](/configuration/hardware_acceleration) config reference for examples applicable to your hardware.
In order to best evaluate the performance impact of hardware acceleration, it is recommended to temporarily disable detection.
```yaml
mqtt:...
detectors:...
cameras:
camera_1:
ffmpeg:...
detect:
enabled:False
...
```
Here is an example configuration with hardware acceleration configured:
```yaml
mqtt:...
detectors:...
cameras:
camera_1:
ffmpeg:
inputs:...
hwaccel_args:-c:v h264_v4l2m2m
detect:...
```
### Step 6: Setup motion masks
Now that you have optimized your configuration for decoding the video stream, you will want to check to see where to implement motion masks. To do this, navigate to the camera in the UI, select "Debug" at the top, and enable "Motion boxes" in the options below the video feed. Watch for areas that continuously trigger unwanted motion to be detected. Common areas to mask include camera timestamps and trees that frequently blow in the wind. The goal is to avoid wasting object detection cycles looking at these areas.
Now that you know where you need to mask, use the "Mask & Zone creator" in the options pane to generate the coordinates needed for your config file. More information about masks can be found [here](/configuration/masks).
:::caution
Note that motion masks should not be used to mark out areas where you do not want objects to be detected or to reduce false positives. They do not alter the image sent to object detection, so you can still get events and detections in areas with motion masks. These only prevent motion in these areas from initiating object detection.
:::
Your configuration should look similar to this now.
To enable recording video, add the `record` role to a stream and enable it in the config.
```yaml
mqtt:...
detectors:...
cameras:
camera_1:
ffmpeg:
inputs:
- path:rtsp://10.0.10.10:554/rtsp
roles:
- detect
- rtmp
- path:rtsp://10.0.10.10:554/high_res_stream# <----- Add high res stream
roles:
- record
detect:...
record:# <----- Enable recording
enabled:True
motion:...
```
If you don't have separate streams for detect and record, you would just add the record role to the list on the first input.
By default, Frigate will retain video of all events for 10 days. The full set of options for recording can be found [here](/configuration/index#full-configuration-reference).
### Step 8: Enable snapshots (optional)
To enable snapshots of your events, just enable it in the config.
```yaml
mqtt:...
detectors:...
cameras:
camera_1:...
detect:...
record:...
snapshots:# <----- Enable snapshots
enabled:True
motion:...
```
By default, Frigate will retain snapshots of all events for 10 days. The full set of options for snapshots can be found [here](/configuration/index#full-configuration-reference).
The best way to get started with notifications for Frigate is to use the [Blueprint](https://community.home-assistant.io/t/frigate-mobile-app-notifications/311091). You can use the yaml generated from the Blueprint as a starting point and customize from there.
It is generally recommended to trigger notifications based on the `frigate/events` mqtt topic. This provides the event_id needed to fetch [thumbnails/snapshots/clips](/integrations/home-assistant#notification-api) and other useful information to customize when and where you want to receive alerts. The data is published in the form of a change feed, which means you can reference the "previous state" of the object in the `before` section and the "current state" of the object in the `after` section. You can see an example [here](/integrations/mqtt#frigateevents).
Here is a simple example of a notification automation of events which will update the existing notification for each change. This means the image you see in the notification will update as frigate finds a "better" image.
```yaml
automation:
- alias:Notify of events
trigger:
platform:mqtt
topic:frigate/events
action:
- service:notify.mobile_app_pixel_3
data_template:
message:'A {{trigger.payload_json["after"]["label"]}} was detected.'
Many people use Frigate to detect cars entering their driveway, and they often run into an issue with repeated events of a parked car being repeatedly detected over the course of multiple days (for example if the car is lost at night and detected again the following morning.
You can use zones to restrict events and notifications to objects that have entered specific areas.
:::caution
It is not recommended to use masks to try and eliminate parked cars in your driveway. Masks are designed to prevent motion from triggering object detection and/or to indicate areas that are guaranteed false positives.
Frigate is designed to track objects as they move and over-masking can prevent it from knowing that an object in the current frame is the same as the previous frame. You want Frigate to detect objects everywhere and configure your events and alerts to be based on the location of the object with zones.
:::
To only be notified of cars that enter your driveway from the street, you could create multiple zones that cover your driveway. For cars, you would only notify if `entered_zones` from the events MQTT topic has more than 1 zone.
See [this example](/configuration/zones#restricting-zones-to-specific-objects) from the Zones documentation to see how to restrict zones to certain object types.

To limit snapshots and events, you can list the zone for the entrance of your driveway under `required_zones` in your configuration file. Example below.
Cameras that output H.264 video and AAC audio will offer the most compatibility with all features of Frigate and Home Assistant. It is also helpful if your camera supports multiple substreams to allow different resolutions to be used for detection, streaming, and recordings without re-encoding.
I recommend Dahua, Hikvision, and Amcrest in that order. Dahua edges out Hikvision because they are easier to find and order, not because they are better cameras. I personally use Dahua cameras because they are easier to purchase directly. In my experience Dahua and Hikvision both have multiple streams with configurable resolutions and frame rates and rock solid streams. They also both have models with large sensors well known for excellent image quality at night. Not all the models are equal. Larger sensors are better than higher resolutions; especially at night. Amcrest is the fallback recommendation because they are rebranded Dahuas. They are rebranding the lower end models with smaller sensors or less configuration options.
Many users have reported various issues with Reolink cameras, so I do not recommend them. If you are using Reolink, I suggest the [Reolink specific configuration](configuration/camera_specific#reolink-410520-possibly-others). Wifi cameras are also not recommended. Their streams are less reliable and cause connection loss and/or lost video data.
I may earn a small commission for my endorsement, recommendation, testimonial, or link to any products or services from this website.
## Server
My current favorite is the Minisforum GK41 because of the dual NICs that allow you to setup a dedicated private network for your cameras where they can be blocked from accessing the internet. There are many used workstation options on eBay that work very well. Anything with an Intel CPU and capable of running Debian should work fine. As a bonus, you may want to look for devices with a M.2 or PCIe express slot that is compatible with the Google Coral. I may earn a small commission for my endorsement, recommendation, testimonial, or link to any products or services from this website.
| Odyssey X86 Blue J4125 (<a href="https://amzn.to/3oH4BKi" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) (<a href="https://www.seeedstudio.com/Frigate-NVR-with-Odyssey-Blue-and-Coral-USB-Accelerator.html?utm_source=Frigate" target="_blank" rel="nofollow noopener sponsored">SeeedStudio</a>) | 9-10ms | M.2 B+M, USB | Dual gigabit NICs for easy isolated camera network. Easily handles several 1080p cameras. |
| Minisforum GK41 (<a href="https://amzn.to/3ptnb8D" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | 9-10ms | USB | Dual gigabit NICs for easy isolated camera network. Easily handles several 1080p cameras. |
| Beelink GK55 (<a href="https://amzn.to/35E79BC" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | 9-10ms | USB | Dual gigabit NICs for easy isolated camera network. Easily handles several 1080p cameras. |
| Intel NUC (<a href="https://amzn.to/3psFlHi" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | 8-10ms | USB | Overkill for most, but great performance. Can handle many cameras at 5fps depending on typical amounts of motion. Requires extra parts. |
| BMAX B2 Plus (<a href="https://amzn.to/3a6TBh8" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | 10-12ms | USB | Good balance of performance and cost. Also capable of running many other services at the same time as frigate. |
| Atomic Pi (<a href="https://amzn.to/2YjpY9m" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | 16ms | USB | Good option for a dedicated low power board with a small number of cameras. Can leverage Intel QuickSync for stream decoding. |
| Raspberry Pi 4 (64bit) (<a href="https://amzn.to/2YhSGHH" target="_blank" rel="nofollow noopener sponsored">Amazon</a>) | 10-15ms | USB | Can handle a small number of cameras. |
## Google Coral TPU
It is strongly recommended to use a Google Coral. Frigate is designed around the expectation that a Coral is used to achieve very low inference speeds. Offloading TensorFlow to the Google Coral is an order of magnitude faster and will reduce your CPU load dramatically. A $60 device will outperform $2000 CPU. Frigate should work with any supported Coral device from https://coral.ai
The USB version is compatible with the widest variety of hardware and does not require a driver on the host machine. However, it does lack the automatic throttling features of the other versions.
The PCIe and M.2 versions require installation of a driver on the host. Follow the instructions for your version from https://coral.ai
A single Coral can handle many cameras and will be sufficient for the majority of users. You can calculate the maximum performance of your Coral based on the inference speed reported by Frigate. With an inference speed of 10, your Coral will top out at `1000/10=100`, or 100 frames per second. If your detection fps is regularly getting close to that, you should first consider tuning motion masks. If those are already properly configured, a second Coral may be needed.
### What does Frigate use the CPU for and what does it use the Coral for? (ELI5 Version)
This is taken from a [user question on reddit](https://www.reddit.com/r/homeassistant/comments/q8mgau/comment/hgqbxh5/?utm_source=share&utm_medium=web2x&context=3). Modified slightly for clarity.
CPU Usage: I am a CPU, Mendel is a Google Coral
My buddy Mendel and I have been tasked with keeping the neighbor's red footed booby off my parent's yard. Now I'm really bad at identifying birds. It takes me forever, but my buddy Mendel is incredible at it.
Mendel however, struggles at pretty much anything else. So we make an agreement. I wait till I see something that moves, and snap a picture of it for Mendel. I then show him the picture and he tells me what it is. Most of the time it isn't anything. But eventually I see some movement and Mendel tells me it is the Booby. Score!
_What happens when I increase the resolution of my camera?_
However we realize that there is a problem. There is still booby poop all over the yard. How could we miss that! I've been watching all day! My parents check the window and realize its dirty and a bit small to see the entire yard so they clean it and put a bigger one in there. Now there is so much more to see! However I now have a much bigger area to scan for movement and have to work a lot harder! Even my buddy Mendel has to work harder, as now the pictures have a lot more detail in them that he has to look at to see if it is our sneaky booby.
Basically - When you increase the resolution and/or the frame rate of the stream there is now significantly more data for the CPU to parse. That takes additional computing power. The Google Coral is really good at doing object detection, but it doesn't have time to look everywhere all the time (especially when there are many windows to check). To balance it, Frigate uses the CPU to look for movement, then sends those frames to the Coral to do object detection. This allows the Coral to be available to a large number of cameras and not overload it.
### Do hwaccel args help if I am using a Coral?
YES! The Coral does not help with decoding video streams.
Decompressing video streams takes a significant amount of CPU power. Video compression uses key frames (also known as I-frames) to send a full frame in the video stream. The following frames only include the difference from the key frame, and the CPU has to compile each frame by merging the differences with the key frame. [More detailed explanation](https://blog.video.ibm.com/streaming-video-tips/keyframes-interframe-video-compression/). Higher resolutions and frame rates mean more processing power is needed to decode the video stream, so try and set them on the camera to avoid unnecessary decoding work.
A complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.
Use of a [Google Coral Accelerator](https://coral.ai/products/) is optional, but strongly recommended. CPU detection should only be used for testing purposes. The Coral will outperform even the best CPUs and can process 100+ FPS with very little overhead.
- Tight integration with Home Assistant via a [custom component](https://github.com/blakeblackshear/frigate-hass-integration)
- Designed to minimize resource use and maximize performance by only looking for objects when and where it is necessary
- Leverages multiprocessing heavily with an emphasis on realtime over processing every frame
- Uses a very low overhead motion detection to determine where to run object detection
- Object detection with TensorFlow runs in separate processes for maximum FPS
- Communicates over MQTT for easy integration into other systems
- Recording with retention based on detected objects
- Re-streaming via RTMP to reduce the number of connections to your camera
- A dynamic combined camera view of all tracked cameras.
## Screenshots


Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.