Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
d24b96d
Early 0.18 work (#22138)
NickM-27 Feb 27, 2026
451d6f5
Revert "Early 0.18 work (#22138)" (#22142)
NickM-27 Feb 27, 2026
bc45774
Update version
NickM-27 Dec 11, 2025
48164f6
Create scaffolding for case management (#21293)
NickM-27 Dec 15, 2025
cffa54c
implement case management for export apis (#21295)
NickM-27 Dec 15, 2025
85feb4e
refactor vainfo to search for first GPU (#21296)
hawkeye217 Dec 15, 2025
004bb7d
Case management UI (#21299)
NickM-27 Dec 15, 2025
dde738c
Camera connection quality indicator (#21297)
hawkeye217 Dec 15, 2025
fc35453
Export filter UI (#21322)
NickM-27 Dec 16, 2025
3297cab
Refactor temperature reporting for detectors and implement Hailo temp…
NickM-27 Dec 22, 2025
3745f5f
Camera-specific hwaccel settings for timelapse exports (correct base)…
aroberts Dec 22, 2025
6b77952
Add support for GPU and NPU temperatures (#21495)
NickM-27 Dec 31, 2025
9ef8b70
Exports Improvements (#21521)
NickM-27 Jan 3, 2026
39ad565
Add API to handle deleting recordings (#21520)
NickM-27 Jan 3, 2026
63e7bf8
Add media sync API endpoint (#21526)
hawkeye217 Jan 4, 2026
b66e69e
Media sync API refactor and UI (#21542)
hawkeye217 Jan 6, 2026
88348bf
use same logging pattern in sync_recordings as the other sync functio…
hawkeye217 Jan 13, 2026
56c7a13
Fix incorrect counting in sync_recordings (#21626)
hawkeye217 Jan 13, 2026
542295d
Update go2rtc to v1.9.13 (#21648)
etulupov Jan 14, 2026
ee2c96c
Refactor Time-Lapse Export (#21668)
NickM-27 Jan 15, 2026
d3260e3
Optimize empty directory cleanup for recordings (#21695)
johnshaw Jan 17, 2026
9b7cee1
Implement llama.cpp GenAI Provider (#21690)
NickM-27 Jan 18, 2026
af2339b
Remove parents in remove_empty_directories (#21726)
johnshaw Jan 20, 2026
e76b48f
Implement LLM Chat API with tool calling support (#21731)
NickM-27 Jan 20, 2026
c78ab2d
Offline preview image (#21752)
hawkeye217 Jan 22, 2026
fa0feeb
Update to ROCm 7.2.0 (#21753)
NickM-27 Jan 22, 2026
a4362ca
Add live context tool to LLM (#21754)
NickM-27 Jan 22, 2026
2db0269
Add networking options for configuring listening ports (#21779)
zeroepoch Jan 28, 2026
fef1fb3
feat: add X-Frame-Time when returning snapshot (#21932)
fl42 Feb 8, 2026
12506f8
Improve jsmpeg player websocket handling (#21943)
hawkeye217 Feb 9, 2026
bb6e889
Allow API Events to be Detections or Alerts, depending on the Event L…
nulledy Feb 11, 2026
84760c4
ffmpeg Preview Segment Optimization for "high" and "very_high" (#21996)
nulledy Feb 15, 2026
5f02e33
Adapt to new Gemini format
NickM-27 Feb 25, 2026
e5087b0
Fix frame time access
NickM-27 Feb 26, 2026
91714b8
Remove exceptions
NickM-27 Feb 27, 2026
9c3a74b
Cleanup
NickM-27 Feb 27, 2026
b4eac11
Clean up trailing whitespaces in cpu stats process cmdline (#22089)
mweinelt Feb 27, 2026
b881869
Increase maximum stream timeout to 15s (#21936)
felipecrs Feb 27, 2026
e16763c
Fallback from tflite-runtime to ai-edge-litert (#21876)
mweinelt Feb 27, 2026
ba0e7bb
Remove redundant tensorflow import in BirdRealTimeProcessor (#22127)
mweinelt Feb 27, 2026
eeefbf2
Add support for multiple GenAI Providers (#22144)
NickM-27 Feb 27, 2026
e7250f2
Full UI configuration (#22151)
hawkeye217 Feb 27, 2026
fa1f9a1
Add GenAI Backend Streaming and Chat (#22152)
NickM-27 Feb 27, 2026
6a21b29
Masks and zones improvements (#22163)
hawkeye217 Feb 28, 2026
4232cc4
Genai docs refactor & fixes (#22175)
NickM-27 Feb 28, 2026
1f1d546
fix masks and zones layout issues at high browser zoom levels (#22181)
hawkeye217 Mar 1, 2026
c3c27d0
Hide hidden camera alerts (#22226)
michalsrb Mar 3, 2026
5e7d426
Add fullscreen controls to tracking details videos (#22252)
hawkeye217 Mar 4, 2026
95956a6
Debug replay (#22212)
hawkeye217 Mar 4, 2026
b211838
Various Fixes (#22263)
NickM-27 Mar 4, 2026
2782931
Update frontend to React 19 (#22275)
hawkeye217 Mar 5, 2026
65db9b0
Fixes (#22280)
hawkeye217 Mar 5, 2026
02678f4
show log when anonymous users log in (#22254)
hawkeye217 Mar 5, 2026
229436c
Add ability to clear region grids from the frontend (#22277)
hawkeye217 Mar 5, 2026
2babfd2
Improve motion review and add motion search (#22253)
hawkeye217 Mar 5, 2026
34cc120
Skip motion threshold configuration (#22255)
hawkeye217 Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .cspell/frigate-dictionary.txt
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ Reolink
restream
restreamed
restreaming
RJSF
rkmpp
rknn
rkrga
Expand Down
16 changes: 16 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,12 @@ try:
value = await sensor.read()
except Exception: # ❌ Too broad
logger.error("Failed")

# Returning exceptions in JSON responses
except ValueError as e:
return JSONResponse(
content={"success": False, "message": str(e)},
)
```

### ✅ Use These Instead
Expand Down Expand Up @@ -353,6 +359,16 @@ try:
value = await sensor.read()
except SensorException as err: # ✅ Specific
logger.exception("Failed to read sensor")

# Safe error responses
except ValueError:
logger.exception("Invalid parameters for API request")
return JSONResponse(
content={
"success": False,
"message": "Invalid request parameters",
},
)
```

## Project-Specific Conventions
Expand Down
5 changes: 3 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
default_target: local

COMMIT_HASH := $(shell git log -1 --pretty=format:"%h"|tail -1)
VERSION = 0.17.0
VERSION = 0.18.0
IMAGE_REPO ?= ghcr.io/blakeblackshear/frigate
GITHUB_REF_NAME ?= $(shell git rev-parse --abbrev-ref HEAD)
BOARDS= #Initialized empty
Expand Down Expand Up @@ -49,7 +49,8 @@ push: push-boards
--push

run: local
docker run --rm --publish=5000:5000 --volume=${PWD}/config:/config frigate:latest
docker run --rm --publish=5000:5000 --publish=8971:8971 \
--volume=${PWD}/config:/config frigate:latest

run_tests: local
docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest \
Expand Down
2 changes: 1 addition & 1 deletion docker/main/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ RUN --mount=type=tmpfs,target=/tmp --mount=type=tmpfs,target=/var/cache/apt \
FROM scratch AS go2rtc
ARG TARGETARCH
WORKDIR /rootfs/usr/local/go2rtc/bin
ADD --link --chmod=755 "https://github.com/AlexxIT/go2rtc/releases/download/v1.9.10/go2rtc_linux_${TARGETARCH}" go2rtc
ADD --link --chmod=755 "https://github.com/AlexxIT/go2rtc/releases/download/v1.9.13/go2rtc_linux_${TARGETARCH}" go2rtc

FROM wget AS tempio
ARG TARGETARCH
Expand Down
7 changes: 4 additions & 3 deletions docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync/run
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ echo "[INFO] Starting certsync..."

lefile="/etc/letsencrypt/live/frigate/fullchain.pem"

tls_enabled=`python3 /usr/local/nginx/get_listen_settings.py | jq -r .tls.enabled`
tls_enabled=`python3 /usr/local/nginx/get_nginx_settings.py | jq -r .tls.enabled`
listen_external_port=`python3 /usr/local/nginx/get_nginx_settings.py | jq -r .listen.external_port`

while true
do
Expand All @@ -34,7 +35,7 @@ do
;;
esac

liveprint=`echo | openssl s_client -showcerts -connect 127.0.0.1:8971 2>&1 | openssl x509 -fingerprint 2>&1 | grep -i fingerprint || echo 'failed'`
liveprint=`echo | openssl s_client -showcerts -connect 127.0.0.1:$listen_external_port 2>&1 | openssl x509 -fingerprint 2>&1 | grep -i fingerprint || echo 'failed'`

case "$liveprint" in
*Fingerprint*)
Expand All @@ -55,4 +56,4 @@ do

done

exit 0
exit 0
12 changes: 6 additions & 6 deletions docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,14 @@ if [ ! \( -f "$letsencrypt_path/privkey.pem" -a -f "$letsencrypt_path/fullchain.
fi

# build templates for optional FRIGATE_BASE_PATH environment variable
python3 /usr/local/nginx/get_base_path.py | \
python3 /usr/local/nginx/get_nginx_settings.py | \
tempio -template /usr/local/nginx/templates/base_path.gotmpl \
-out /usr/local/nginx/conf/base_path.conf
-out /usr/local/nginx/conf/base_path.conf

# build templates for optional TLS support
python3 /usr/local/nginx/get_listen_settings.py | \
tempio -template /usr/local/nginx/templates/listen.gotmpl \
-out /usr/local/nginx/conf/listen.conf
# build templates for additional network settings
python3 /usr/local/nginx/get_nginx_settings.py | \
tempio -template /usr/local/nginx/templates/listen.gotmpl \
-out /usr/local/nginx/conf/listen.conf

# Replace the bash process with the NGINX process, redirecting stderr to stdout
exec 2>&1
Expand Down
11 changes: 0 additions & 11 deletions docker/main/rootfs/usr/local/nginx/get_base_path.py

This file was deleted.

35 changes: 0 additions & 35 deletions docker/main/rootfs/usr/local/nginx/get_listen_settings.py

This file was deleted.

62 changes: 62 additions & 0 deletions docker/main/rootfs/usr/local/nginx/get_nginx_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
"""Prints the nginx settings as json to stdout."""

import json
import os
import sys
from typing import Any

from ruamel.yaml import YAML

sys.path.insert(0, "/opt/frigate")
from frigate.util.config import find_config_file

sys.path.remove("/opt/frigate")

yaml = YAML()

config_file = find_config_file()

try:
with open(config_file) as f:
raw_config = f.read()

if config_file.endswith((".yaml", ".yml")):
config: dict[str, Any] = yaml.load(raw_config)
elif config_file.endswith(".json"):
config: dict[str, Any] = json.loads(raw_config)
except FileNotFoundError:
config: dict[str, Any] = {}

tls_config: dict[str, Any] = config.get("tls", {})
tls_config.setdefault("enabled", True)

networking_config: dict[str, Any] = config.get("networking", {})
ipv6_config: dict[str, Any] = networking_config.get("ipv6", {})
ipv6_config.setdefault("enabled", False)

listen_config: dict[str, Any] = networking_config.get("listen", {})
listen_config.setdefault("internal", 5000)
listen_config.setdefault("external", 8971)

# handle case where internal port is a string with ip:port
internal_port = listen_config["internal"]
if type(internal_port) is str:
internal_port = int(internal_port.split(":")[-1])
listen_config["internal_port"] = internal_port

# handle case where external port is a string with ip:port
external_port = listen_config["external"]
if type(external_port) is str:
external_port = int(external_port.split(":")[-1])
listen_config["external_port"] = external_port

base_path = os.environ.get("FRIGATE_BASE_PATH", "")

result: dict[str, Any] = {
"tls": tls_config,
"ipv6": ipv6_config,
"listen": listen_config,
"base_path": base_path,
}

print(json.dumps(result))
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ location ^~ {{ .base_path }}/ {
# remove base_url from the path before passing upstream
rewrite ^{{ .base_path }}/(.*) /$1 break;

proxy_pass $scheme://127.0.0.1:8971;
proxy_pass $scheme://127.0.0.1:{{ .listen.external_port }};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Expand Down
71 changes: 31 additions & 40 deletions docker/main/rootfs/usr/local/nginx/templates/listen.gotmpl
Original file line number Diff line number Diff line change
@@ -1,45 +1,36 @@

# Internal (IPv4 always; IPv6 optional)
listen 5000;
{{ if .ipv6 }}{{ if .ipv6.enabled }}listen [::]:5000;{{ end }}{{ end }}

listen {{ .listen.internal }};
{{ if .ipv6.enabled }}listen [::]:{{ .listen.internal_port }};{{ end }}

# intended for external traffic, protected by auth
{{ if .tls }}
{{ if .tls.enabled }}
# external HTTPS (IPv4 always; IPv6 optional)
listen 8971 ssl;
{{ if .ipv6 }}{{ if .ipv6.enabled }}listen [::]:8971 ssl;{{ end }}{{ end }}

ssl_certificate /etc/letsencrypt/live/frigate/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frigate/privkey.pem;

# generated 2024-06-01, Mozilla Guideline v5.7, nginx 1.25.3, OpenSSL 1.1.1w, modern configuration, no OCSP
# https://ssl-config.mozilla.org/#server=nginx&version=1.25.3&config=modern&openssl=1.1.1w&ocsp=false&guideline=5.7
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;

# modern configuration
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;

# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;

# ACME challenge location
location /.well-known/acme-challenge/ {
default_type "text/plain";
root /etc/letsencrypt/www;
}
{{ else }}
# external HTTP (IPv4 always; IPv6 optional)
listen 8971;
{{ if .ipv6 }}{{ if .ipv6.enabled }}listen [::]:8971;{{ end }}{{ end }}
{{ end }}
{{ if .tls.enabled }}
# external HTTPS (IPv4 always; IPv6 optional)
listen {{ .listen.external }} ssl;
{{ if .ipv6.enabled }}listen [::]:{{ .listen.external_port }} ssl;{{ end }}

ssl_certificate /etc/letsencrypt/live/frigate/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/frigate/privkey.pem;

# generated 2024-06-01, Mozilla Guideline v5.7, nginx 1.25.3, OpenSSL 1.1.1w, modern configuration, no OCSP
# https://ssl-config.mozilla.org/#server=nginx&version=1.25.3&config=modern&openssl=1.1.1w&ocsp=false&guideline=5.7
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;

# modern configuration
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;

# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;

# ACME challenge location
location /.well-known/acme-challenge/ {
default_type "text/plain";
root /etc/letsencrypt/www;
}
{{ else }}
# (No tls section) default to HTTP (IPv4 always; IPv6 optional)
listen 8971;
{{ if .ipv6 }}{{ if .ipv6.enabled }}listen [::]:8971;{{ end }}{{ end }}
# (No tls) default to HTTP (IPv4 always; IPv6 optional)
listen {{ .listen.external }};
{{ if .ipv6.enabled }}listen [::]:{{ .listen.external_port }};{{ end }}
{{ end }}

4 changes: 3 additions & 1 deletion docker/rocm/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ ARG ROCM

RUN apt update -qq && \
apt install -y wget gpg && \
wget -O rocm.deb https://repo.radeon.com/amdgpu-install/7.1.1/ubuntu/jammy/amdgpu-install_7.1.1.70101-1_all.deb && \
wget -O rocm.deb https://repo.radeon.com/amdgpu-install/7.2/ubuntu/jammy/amdgpu-install_7.2.70200-1_all.deb && \
apt install -y ./rocm.deb && \
apt update && \
apt install -qq -y rocm
Expand Down Expand Up @@ -56,6 +56,8 @@ FROM scratch AS rocm-dist

ARG ROCM

# Copy HIP headers required for MIOpen JIT (BuildHip) / HIPRTC at runtime
COPY --from=rocm /opt/rocm-${ROCM}/include/ /opt/rocm-${ROCM}/include/
COPY --from=rocm /opt/rocm-$ROCM/bin/rocminfo /opt/rocm-$ROCM/bin/migraphx-driver /opt/rocm-$ROCM/bin/
# Copy MIOpen database files for gfx10xx and gfx11xx only (RDNA2/RDNA3)
COPY --from=rocm /opt/rocm-$ROCM/share/miopen/db/*gfx10* /opt/rocm-$ROCM/share/miopen/db/
Expand Down
2 changes: 1 addition & 1 deletion docker/rocm/requirements-wheels-rocm.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
onnxruntime-migraphx @ https://github.com/NickM-27/frigate-onnxruntime-rocm/releases/download/v7.1.0/onnxruntime_migraphx-1.23.1-cp311-cp311-linux_x86_64.whl
onnxruntime-migraphx @ https://github.com/NickM-27/frigate-onnxruntime-rocm/releases/download/v7.2.0/onnxruntime_migraphx-1.23.1-cp311-cp311-linux_x86_64.whl
2 changes: 1 addition & 1 deletion docker/rocm/rocm.hcl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
variable "ROCM" {
default = "7.1.1"
default = "7.2.0"
}
variable "HSA_OVERRIDE_GFX_VERSION" {
default = ""
Expand Down
Loading
Loading