NĀZER. GET ACCESS →
FACE MATCHING  ·  LOCAL PROCESSING  ·  512-D EMBEDDINGS  ·  CONTINUOUS OR SCHEDULED  ·  MADAR SYNC  ·  BIOMETRICS STAY ON THE VLAN  · FACE MATCHING  ·  LOCAL PROCESSING  ·  512-D EMBEDDINGS  ·  CONTINUOUS OR SCHEDULED  ·  MADAR SYNC  ·  BIOMETRICS STAY ON THE VLAN  · 
NĀZER
// AIR-GAPPED FACE MATCHING

Pooled camera workers read the feeds, match 512-d embeddings locally, and surface watchlist hits. Biometrics stay inside the camera VLAN.

SCALE
// ONE NODE PER SITE

TENS OF THOUSANDS
OF FEEDS. one model.

nāzer runs as an edge node, not one large central system. Each site drives its own cameras with a small pool of worker processes; Madar holds the only global face index, so edges never carry one.

0 CAMERAS ACROSS SITES
01
1
Face engine per pool, not per camera. That is what turns tens of streams into hundreds.
02
512
Dimension ArcFace embedding per face, normalized and indexed with HNSW cosine search.
03
0
Bytes of image data that cross the VLAN when Madar is source of truth: vectors only.
SYSTEM
// ARCHITECTURE

CORE.
POOLS. APP.

A FastAPI core supervises worker pools and owns every match. Pools never touch the database or the network. They decode, infer, and push. An Electron app is the control surface.

CORE
SUPERVISOR
Assigns cameras to the least-loaded pool, drains detections, matches, records, streams events, and trims retention. One process, one DB pool.
WORKERS
POOLS + SLOTS
Each pool is a subprocess with one model and many camera slots. A wedged stream kills only its own pool; the supervisor respawns it with backoff.
DESKTOP
CONTROL APP
Tray, native notifications, camera grid, live watch wall and a match queue. The renderer never holds the API key.
01
DECODE
RTSP, file, or a local device, with reconnect in place.
02
DETECT
SCRFD + ArcFace at the camera's detection rate.
03
TRACK
ByteTrack keeps one id per face, emits the best frame.
04
MATCH
Cosine top-1 locally, or Madar's global index.
05
PUSH
Watchlist hits stream to the app and on to Madar.
CYCLES
// DUTY CYCLES

ALWAYS-ON IS
THE EXCEPTION.

Compute is the hard ceiling. Most cameras only need to think when something moves; always-on detection is reserved for watchlist and high-risk zones.

CONTINUOUS
WATCHLIST ZONES
Detect every frame at the camera's rate, for the feeds that cannot miss a face.
DETECT @ FPS100% DUTY
SCHEDULED
THE FLEET DEFAULT
A cheap motion gate samples the frame; motion opens a short detection burst, then the slot drops back to near-zero idle.
MOTION GATEBURST ON MOVE
MATCHING
// 1 - COSINE DISTANCE

LOCAL.
OR MADAR. your call.

Every detection is persisted, then searched: against a local pgvector index of enrollments, or against Madar's entity_faces when it is the source of truth. Score above threshold, outside cooldown, becomes a match.

LOCAL
PGVECTOR
Self-contained. HNSW cosine index over 512-d enrollments, straight in Postgres. Nothing leaves the node.
MADAR
SOURCE OF TRUTH
Search the central index instead. A local identity row is cached for the returned entity so match records stay valid.
THRESHOLDRUNTIME-TUNABLE
score = 1 − distance. Tune it live from the app, with a per-identity, per-camera cooldown so the queue stays useful.
RUN IT ON
YOUR OWN SERVERS.

Running end to end: pools, duty cycles, matching, live wall. Access is limited while we ship betas to early teams.