AI workflow
A visible firearm becomes a frame, a band, and a phone ringing.
The whole path, from a camera already on the wall to a dispatcher on the phone. Ten stages, and the module behind each one.

The problem
What this is for
Most buildings already have the cameras. What they do not have is anybody watching them at two in the afternoon. No camera calls for help on its own. The gap is between a weapon being visible and the right people knowing it.
The workflow
10 stages, and what runs where
Each stage names the module behind it. The chip says whether it runs on your network or ours.
- On the camera
- 1 stage
- On the appliance
- 3 stages
- In the cloud
- 5 stages
- With a person
- 1 stage
- On the camera
Rate every camera before it is trusted
Each camera is measured against its own lens, resolution, and working distance. One that cannot resolve a firearm is refused rather than sold.
coverage-advisor.ts. The floors come from sweeping a corpus across inference sizes, not from a sales conversation.
- On the appliance
Analyse on your own network
An appliance on site opens the streams and runs the detector there. Raw video never leaves the building.
appliance/supervisor/main.ts. One process, one heartbeat, a child per camera.
- On the appliance
Two looks at every frame
The detector runs at two inference scales and folds the boxes that agree. A checkpoint is verified by sha256 before it loads.
detector.py against models/MANIFEST.json. One pass may agree with itself at most once.
- On the appliance
One subject, one track
Boxes are associated across frames by overlap, so somebody walking a corridor stays one subject. A track reports its first frame at once.
tracker.py and pipeline.py. Every later frame that beats the track's own peak is reported too.
- In the cloud
Record everything, including what is refused
Gates run cheapest first. A frame that trips one is written down with the reason. A quiet camera and a suppressed one look different.
intakeDetection in alerts/engine.ts. Every refusal is a disposition on the row.
- In the cloud
Evidence rises, and repetition is discounted
Sightings accumulate and decay with time. A repeat look at one lens is worth half the last, so a recurring confuser cannot walk to certainty.
EVIDENCE_CORRELATION_KAPPA is 0.5 in evidence.ts. A single frame still yields its own value in full.
- In the cloud
A band anybody can recompute
Possible, probable, or critical, against this camera's own thresholds. Day and night are read from the pixels rather than from a clock.
bands.ts and lighting.py. check:detection re-derives a whole incident by hand and asserts the code agrees.
- In the cloud
Two cameras, one incident
A second lens inside the join window joins the open incident instead of paging the site twice. Pooled evidence only ever rises.
fusion.ts. Association is time, site, and weapon class. Never appearance, never an embedding.
- With a person
A person decides before police are called
Your response mode chooses who looks first: a monitoring agent, your own reviewer, or your staff. A dispatch follows a human verdict.
alert.verifiedEscalate. No clock in this system decides on its own to send police.
- In the cloud
Reach the roster, and keep climbing
Push, SMS, email, and voice, in the order each person set. An alert nobody answers widens to the whole roster, then asks an agent to look.
ackStage and ackDeadlineAt on the alert row. Only a real acknowledgement stops the ladder.

What it runs on
A school or district campus, running the Schools configuration. Segments are settings over one codebase, never separate products.
Your cameras
IP cameras over RTSP or ONVIF, or channels on an existing recorder. Each is rated per weapon class before it is analysed or billed.
One appliance per site
A small box on your network. It holds the detector, the camera credentials, and a spool that survives the uplink going down.
Your roster
The people who are told, the channels they take, and the rota deciding who is first. A rota can never page nobody.
A response mode
Four modes, from staff-only to a monitoring agent reviewing every frame before dispatch. Set per site, changed by an administrator.
Why this shape
What the design buys
Runs on the cameras you own
RTSP, ONVIF, and channels behind a recorder. The appliance reads what is already installed, and the advisor says which of it works.
Every band is reconstructible
Given the rows and the published constants, anybody can recompute how a band was reached. These timelines are exported into police reports.
Fails toward telling somebody
A review nobody opened escalates. A verification that times out escalates. An alert that dies silently is the failure being designed against.
Limits
What it refuses
Stated here rather than found later. Each of these is enforced somewhere in the code, not only written on a page.
A concealed weapon cannot be detected
This sees what a camera sees. A firearm in a bag, under a coat, or out of frame is not visible, so it is not detected.
Your own false-alert rate
Counted from the dismissals your people recorded, in place of a published accuracy figure.
A camera can be refused
Working distance and resolution decide what a lens resolves. A camera that cannot is not analysed, and it is not billed either.
Doors fail secure
A lockdown secures doors and can send no other signal. Releasing them is done on site, by a person.
Read next
Where to go from here
Firearm detection for schools
Arming, drills, an incident desk, and the law-enforcement portal.
Firearm detection for business
Arming schedules for a building that is empty most of the week.
Questions and answers
What a camera sees, what it misses, and who hears about it.
Pricing
Per analysed camera, per month. A camera is billed once it has streamed.
The other analyzers
Loss prevention and Home visual alarm, on the same appliance and the same pipeline.