Like many here, I run Frigate and wanted reliable person recognition to drive automations (“notify me when the kids come home”, “stranger at the door at night”).
Why I built yet another tool
I looked hard at what exists before writing my own — and none of it fit:
-
Frigate’s built-in face recognition: the recognition itself is decent, but the workflow didn’t work for me. The train tab keeps refilling with already-known faces, there’s no grouping of unknowns, and strangers (hello, mailman) kept getting matched to family members because there’s no clean “unknown person” concept.
-
Double Take, the classic answer, is unmaintained (forks exist, but the ecosystem is fragmenting) — and it still needs a separate detector service behind it.
-
CompreFace is solid but heavyweight (a multi-container stack with its own DB), and it knows nothing about Frigate — you still need glue for sub_labels, sensors and review workflows.
So I built the missing piece as one small service, and I’m sharing it — open source (MIT), fully local, no cloud: GitHub - SkyTechNerds/faceid
What it does
-
Listens to Frigate person events via MQTT, grabs the snapshot crop and runs InsightFace/ArcFace on it — the same open model family Immich and CompreFace use (the ~300 MB model pack is downloaded once from the official InsightFace GitHub release; after that, everything is 100% offline).
-
Matching is nearest-neighbor over embeddings: every face you assign is a visible reference point, with no training cycles. Not immune to bad data — an imbalanced gallery biases borderline matches — but the failure mode is an image you can see and delete. There are knobs for this (a per-person photo cap, and how many reference photos a score averages over); see the measurement note below before touching them.
-
Unknown faces are auto-clustered (like your photo app does) and land in a review UI: one click assigns a whole cluster to a person. Regular strangers become their own “person” — and you can even automate on them.
-
One-click history scan: pull faces from your past Frigate events into the review queue, pre-clustered — you get a trained gallery on day one, no CLI needed.
-
Sharper reference photos: Frigate detects on a downscaled stream but records in full resolution. Faces heading for the review queue are re-fetched from the event clip — typically twice the pixel size. Live recognition keeps using the fast snapshot path.
-
Recognized names go back to Frigate as
sub_label— filter clips by person in Explore, including retroactively. -
Home Assistant sensors via MQTT discovery: one per camera with a presence window (“Alice, Bob” → “nobody”), plus an event topic for automations (example automation with snapshot notification ships in the repo).
-
Ignore list: people you simply don’t care about become negative anchors — never notified, never matched to your family, never resurfacing in review. New looks are auto-learned only on unambiguous matches (guarded, visible, reversible), and anchor groups can be merged, curated or released into a real person.
-
Measure instead of guess: two scripts report what each person is actually missing (viewing angles, cameras, day vs IR shots) and whether your last enrolling session helped — leave-one-out against your own gallery plus a probe on recent events.
Install
As a Home Assistant app (HAOS/Supervised — apps were formerly known as add-ons):
Add the repository to your Home Assistant with one click
— or manually: Settings → Apps → App Store → ⋮ → Repositories → add
https://github.com/SkyTechNerds/faceid. Then install the FaceID app, set your Frigate URL and MQTT broker in the options. The review UI shows up in the sidebar (ingress, behind your HA login).
Docker (for HA Container/Core, where apps aren’t available): docker compose up -d — compose file in the repo. Built locally; no prebuilt image on a registry yet.
Standalone (LXC/VM/bare metal): venv + systemd, ~5 minutes — step-by-step in the README.
Runs CPU-only (any AVX-capable x86, ~1.5 GB RAM; aarch64 builds too — no GPU, no Coral needed).
One gotcha I hit myself: if HAOS runs in a VM, set the CPU type to host (the default kvm64 hides AVX).
On the defaults — measure yours
I shipped cautious defaults and later measured them against my own 128-photo gallery, with ground truth. Two of them were costing me half my recognitions: the score averaged the 3 best-matching photos (which penalises exactly the people with many reference angles), and the 0.50 threshold sat precisely on the median of correct matches — while a different person never scored above 0.31 on my cameras.
Adjusting both took a held-out test set from 90% to 100% recognised, without a single misassignment. Your cameras are not mine, so please don’t copy my numbers — the scripts above exist so you can find yours. Details in the README.
Honest notes
-
Recognition quality stands and falls with your camera: faces need to be reasonably large and lit. Doorbell-height cameras work great; a wide parking-lot cam won’t identify anyone. Distance/DORI matters more than the model.
-
Biometric data stays 100% on your box. The standalone UI has optional Basic Auth — still, keep it LAN/ingress only.
-
Young project — I run it in production at home, but expect rough edges. Feedback, issues and PRs are very welcome!
Update (July 26): v0.6.8 — Docker image, sharper reference photos pulled from event clips, coverage/measurement scripts, and recovery of events MQTT never announces. See the changelog.







