Open-source · self-hosted · AI you control

The AI video platform
you own — and build on.

Cameras, recording and AI on hardware you control — and a growing ecosystem on top of it: one-click apps, AI models from anyone, an assistant you can talk to, and SDKs so developers write the rule instead of the plumbing. Every layer watches its own health and says when something is wrong.

It is a new way to say what your cameras should watch for. Not the fixed feature list of a typical NVR: you define the use case — install an app, draw a zone and write a rule, or build on the SDKs over the wire — and the platform detects it.

Built on a peer-reviewed offline-first security architecture. Read the paper

git clone https://github.com/open-nvr/open-nvr.git && cd open-nvr && ./start.sh

Pre-built images · runs on a Pi 5, a laptop or a server · no cloud account, no API keys.

person 0.94
North gateLIVE
YardLIVE
truck 0.88
Loading dockREC
LobbyLIVE
no signal
Perimeter EOFFLINE
plate 0.91
Car parkLIVE

opennvr.inference.*

every detection is an event, on a bus you own

  • person · track 3 · stationary · cam1
  • N894JV read · cam1
  • Under-occupancy in zone 'drawn' · cam1
  • L605HZ read · cam1
  • car · track 7 · best frame · cam1
  • K884RS read · cam1

health

every layer reports — and alarms when it stops

  • Recording6 cameras · 0 stalled
  • Watchingkeeping up · every camera
  • Models9 registered · fingerprints match
  • Apps13 installed · all healthy
  • Storage1.4 TB free · 31 days kept

have an idea?

Something to build on vision or video streams — an app for your cameras, a use case for a camera sensor?

Talk to the team that built the platform. We scope it with you, build it on OpenNVR, and hand you a working solution in the shortest cycle — not a slide deck.

Talk to us
How a use case travels

From the lens to the answer, on one wire.

Everything between your camera and the alert already runs. The one thing you plug in is the model — and you can change your mind.

Your camerason a network with no way outRecordsalways, never gatedWatchesevery camera, all the time, cheaplyEventsone bus, everything listensApps & assistantthe use case you definedKAI-Cthe socketevery model plugs in here — and is checked before it is trustedadapterYOLOv8ships with itYour fine-tuned modelweights you cannot shareA plate readerfrom anyone, any licenceyour choiceSwap the model. Nothing else on the wire changes.An app asks for a task — never a model by name — so the plug is the only thing that moves.
Diagram of OpenNVR's data path and the pluggable model socket.
9
detectors out of the box
YOLO · BLIP · InsightFace · LPR · pose · more
~30
lines of Python per adapter
Apache-2.0 SDK · any model, any licence
13
one-click app-store apps
digest-pinned · manifest-driven UI
100%
offline-first by default
no cloud, no API keys, no per-camera fees
  • AGPLv3 core
  • Apache-2.0 SDKs
  • ONVIF · RTSP
  • Peer-reviewed architecture
  • Self-hosted forever
The OpenNVR Agent

Just ask your cameras.

Say it out loud — "is there a person at the front door?" — and a local LLM answers, grounded in a live frame from that camera, spoken back to you. No cloud. No API keys. No subscription. Running on the same box that records your footage.

OpenNVR Camera Agent — asking a camera about the lobby and getting a grounded answer with live detections
"anyone in the kitchen?"
"did a car pass in the last 10 min?"
"is the loading bay clear?"

How it works — entirely on your hardware

  1. 1

    You speak. Silero voice-activity detection catches the turn; Whisper transcribes it locally.

  2. 2

    A local LLM reasons. An Ollama-hosted model with tool-calling decides which skill to use — a scene caption, an object count, the event log, the footage index, a face match — and calls the adapter that serves it.

  3. 3

    It answers, grounded in a live frame — then Piper speaks the reply. The whole loop runs offline, on the box that records your cameras.

Cameras with agency — not just data.

Everything the agent can do
Events → the moment

One feed of alarms, watches, and app alerts. Click one and the camera opens at that timestamp — not just live.

Alarms with levels

Critical sirens that latch until silenced, urgent pulses that stand down, doorbell chimes, silent logs — defaults per target, per site.

Real-time video

Per-camera screens play the same WebRTC stream as the NVR, with scrub-back review and recorded playback inline.

Your roles, enforced

Signs in with your OpenNVR account. Viewers look, operators arm, admins govern — even the agent's chat tools obey the tier.

What is different

Not another recorder with AI bolted on.

Most systems sell you detections. OpenNVR is built so that the footage, the models, the decisions and the evidence all stay yours — and so that the system tells you when any part of it is not doing its job.

Sovereign

Nothing leaves the building

Your cameras sit on a network with no way out, your footage stays on your disks, and the AI runs beside it. Reaching a cloud — for storage or for a model — is a decision an administrator makes, not a default a vendor made for you.

What makes it true: Two default-deny gates, checked continuously; cloud routes answer 403 until you allow them.

Auditable

Every alert can explain itself

When an alarm fires, you can see the frame it fired on, the model that decided, and whether that model is still the one you approved. That is what a regulator, an insurer, or a court asks for — and what most systems cannot answer.

What makes it true: A correlation ID threads every inference into an append-only log; model weights are fingerprinted and re-checked.

Watches itself

You hear about problems before you need the footage

The worst NVR failure is a camera that quietly stopped recording three days ago. Every layer here — recording, disk, detection, models, apps — reports its own health, and the ones that matter raise an alarm rather than a log line.

What makes it true: A recording watchdog, disk-pressure alerts, model health polled every minute, app heartbeats, and a "keeping up" signal for the detector.

Any model, no lock-in

Your detectors are yours to choose

Object detection, plates, faces, body pose, scene captions, speech — nine ship, and any model from anyone can join them under any licence, including one you fine-tuned and cannot share. Swap one out and nothing that depended on it changes.

What makes it true: Apps ask for a task, never a model by name; any model serving that task is a drop-in.

Apps, not projects

Install a capability in one click

13 apps install from a catalog every deployment opens — plate watchlists, occupancy, guard-scan compliance, a smart doorbell — each with its own page, live dashboard and settings. And every one of them becomes something the assistant can answer about.

What makes it true: An app declares a manifest and the platform renders its UI, issues its credential, and scopes its cameras.

Talk to it

Ask, instead of scrubbing

"Is anyone at the back gate?" "Did a red truck come by this morning?" "Alarm me if someone is at the door after ten." Spoken or typed, answered from a live frame or the footage index, on your own hardware — and standing orders it keeps running.

What makes it true: Skills switch on as models register; every installed app becomes a skill too — and a standing order keeps running until you cancel it.

Build the rule, skip the plumbing

For the developers who extend it

A camera application is a small idea on top of a large amount of infrastructure nobody wants to build twice. Here the decoding, tracking, models, recording, settings forms, permissions and alerting already run. You write the rule; nine lines is a complete, catalog-listed app.

What makes it true: Two Apache-2.0 SDKs: one to build an app, one to publish a model. Your code stays under your licence, and there is no fee.

Yours to keep

No account, no per-camera fee, no expiry

Free under an open licence on hardware you already have — a Pi, a laptop, a rack server. Businesses that embed or resell it buy a commercial licence; everyone else owes nothing, forever, and the source is there to prove it.

What makes it true: AGPL-3.0 core, Apache-2.0 SDKs, pre-built images, a published architecture paper.

See it in action

A real product, not a demo repo.

Dashboard, live view, recordings, RBAC, BYO-AI, audit logs, and compliance reporting — all self-hosted, all yours.

OpenNVR dashboard — cameras, recordings, alerts, recordings-over-time and camera-status charts, and system monitoring, all on one screen
Compliance & §889 reports
Compliance & §889 reports
Covered-vendor detection and audit-ready evidence.
Bring your own AI keys
Bring your own AI keys
Local models by default, or your own provider — you choose.
Access control (RBAC)
Access control (RBAC)
Viewers look, operators arm, admins govern.
Audit logs & forensics
Audit logs & forensics
Every action traceable — hand it to a regulator.

Any model.
One open contract.

The AI Adapter Contract is what makes OpenNVR a platform, not a product. Any model behind a REST or WebSocket endpoint becomes a first-class detector — object detection, open-vocabulary detection, license-plate OCR, face recognition, scene captioning, tracking, speech, and more. The SDK to wrap your own is Apache-2.0 and runs around thirty lines of Python.

Everything runs on your hardware by default. Cloud providers like Hugging Face are an explicit opt-in — under the default local_only sovereignty policy, any adapter that tries to reach the network is refused registration. You decide what, if anything, leaves the building.

  • Bring your own model via ONNX, PyTorch, or any runtime
  • Ship adapters under any licence — including proprietary or classified
  • Audit chain, fingerprint drift detection, and fair-queuing for free
  • Fleet monitoring built in — latency, load, hardware, and drift per adapter, over time
Write an adapter
adapters/fall-detection/main.py
opennvr-adapter-sdk
# pip install opennvr-adapter-sdk
from opennvr_adapter_sdk import Adapter
adapter = Adapter(
"fall-detection", version="1.0.0", vendor="ACME",
license="Apache-2.0", tasks=["object_detection"],
framework="onnxruntime", weights="models/fall.onnx",
)
@adapter.load()
def load():
return ort.InferenceSession(adapter.weights)
@adapter.on_image()
def detect(call):
boxes = call.model.run(None, {"images": preprocess(call.image)})
return [call.detection("fallen", score, x, y, w, h)
for score, (x, y, w, h) in boxes]
app = adapter.app # uvicorn my_model:app
/health · /capabilities · /infer · /infer/stream · /metrics — generated, fingerprinted, conformance-tested
01For developers

Build the rule. Not the pipeline.

Almost nothing in a camera application is the idea you had. It is decoding, tracking, model plumbing, retention, a settings form and an audit trail — months of work that is identical for every app anyone will ever write, and wrong in the same ways each time.

OpenNVR already runs all of it. The app below is complete: nine lines, no broker, no model, no frontend.

from opennvr_app_sdk import App

app = App("driveway-watch", name="Driveway Watch",
          category="perimeter")
app.param("dwell_s", float, default=30.0)

@app.on_detection("person", zone="driveway",
                   dwell="$dwell_s")
def loitering(event):
    event.alert(f"Person loitering on {event.camera}",
                severity="high")

What those nine lines also did

  • Subscribed to the platform's detection stream
  • Registered itself in every deployment's App Catalog
  • Served the registry contract and its own OpenAPI
  • Turned dwell_s into an operator settings field
  • Turned zone into a polygon the operator draws on a still
  • Ran the dwell timer and latched once per episode, not per frame
  • Was issued its own credential, scoped to its cameras
  • Delivered alerts into the operator's inbox with severity
  • Exported its own Prometheus metrics

The six layers you would otherwise own

Every one of them is already running, tested, and someone else's problem.

LayerWhat owning it costs youWhat OpenNVR runs
Video inONVIF discovery, RTSP credentials, substreams, reconnect storms, hardware decode, resolution probing.Cameras are provisioned once and served through MediaMTX. Your app never opens a socket to a camera.nvr.cameras()
DetectionA motion mask, region selection, a detector loop, a tracker, best-frame selection — then tuning all of it per camera.Tier-0 runs that chain continuously on every camera and publishes tracks to the bus. One config flag and your rule receives them.opennvr.inference.tier0.>
ModelsPackaging a model, a GPU loop, warm-up, queueing, timeouts, and a rewrite when you swap the model.Declare the task you need. Any adapter advertising it satisfies it — swapping a plate reader touches no app code.requires_tasks
RecordingSegmenting, retention, an index, and a player that can seek to the moment an event fired.Recording is the platform's and always was. Ask it for the clip, the URL, or the frame at a timestamp.nvr.recordings(cam).frame_at()
Operator UIA settings form, a zone editor drawn over live video, an alert inbox, acknowledgement state.Declare a parameter and it becomes a form field. Declare a zone and the operator draws it on a camera still.app.param() · zone=
GovernanceCredentials, per-camera permissions, an audit trail, egress control, Prometheus metrics.Your app is issued its own credential, scoped to the cameras it was given, on a network with no route out unless a host is allowed.correlation_id

Your app stays yours

The SDK is Apache-2.0. Ship under any licence you like, closed included, even though the platform core is AGPL.

No fee, no cut

OpenNVR takes nothing on app sales. You get the licence hook; the platform stays out of the transaction entirely.

Distribution is built in

Every deployment opens the same App Catalog. Getting listed is a pull request against a public index, not a partnership call.

Built for people who can't outsource trust.

From an air-gapped government site to a homelab doorbell — one architecture, entirely on your hardware.

Government & defence

Air-gapped sites that legally cannot use covered-vendor or cloud cameras. §889-clean, sovereign, auditable.

Critical infrastructure

Utilities, ports, transport — surveillance that stays inside the perimeter, with an audit trail for the regulator.

Regulated: health, finance, education

Where footage was never allowed to leave the building. Local recording, local AI, RBAC, retention you control.

Homelab & prosumer

A doorbell that never phones home, spun up on a Pi or an old laptop in minutes. No account, no subscription.

One-click app store

Not just examples.
An App Store.

13 apps install with one click from a curated, digest-pinned index. Each one gets a full page in the shell — a live dashboard, config forms with zone-drawing on your camera's own frame, operator actions — and registers itself as a skill the voice agent can answer from. Declare a manifest, and the UI builds itself.

perimeter

Loitering Detection

Someone lingering longer than they should. Live dwell dashboard shows every object accruing time and which ones have fired.

analytics

Occupancy Counting

Live per-zone gauges against your limit — green to red as the room fills. Alerts on over, under, and back-to-normal.

perimeter

Line Crossing

Draw a directional tripwire per camera; live tallies and a recent-crossings feed on the app's page. Fences, one-way doors, gates.

perimeter

Abandoned Object

Unattended-bag detection with owner-proximity suppression, and a settling-now table showing every candidate and its dwell.

perimeter

Intrusion Detection

Draw the restricted zone on your camera's own frame, set the hours, and it alerts on entry — with an armed-right-now dashboard on its app page.

safety

Guard Scan Compliance

Did the guard actually wand every person — left arm, right arm, front, back? Rules on each screening from body keypoints, keeps the record, and flags what the scanner found.

vehicle

License Plate Recognition

YOLOv8 finds the plate, fast-plate-ocr reads it. Edit the allow/deny watchlists in the UI and they apply live — no restart.

automation

Gate Controller

Opens the barrier for allowed plates on the ANPR app's decisions — one HTTP relay pulse per gate camera. Deny and unknown fail closed.

notifications

Alert Notifier

The guard's phone. Alerts at or above your severity bar go to Telegram or any webhook — SMS gateways, Slack, sirens — one alarm, one push, flood-safe.

doorstep

Smart Doorbell

Family vs. stranger with InsightFace — and a face-enrollment form right on the app's page: name, photo, done.

doorstep

Package Delivery

Arrival, linger, and pickup per package, with an on-the-porch dashboard. Turn it inside out and it's porch-pirate detection.

forensics

Footage Search

Ask "every red truck at the dock yesterday" — from the app's own page, or by voice through the agent. Fully on your hardware.

integration

Home Assistant Relay

Bridge OpenNVR alerts into Home Assistant via MQTT discovery, with live forwarded/failed counters on its dashboard.

…or build your own

The app SDK is Apache-2.0 — your app ships under any license, even proprietary. Declare params, state, and actions in a manifest and the platform renders the config forms, live dashboard, and agent skill for free. Sell it privately or PR it into the store.

Start in the developer corner
Answers

Frequently asked questions

Everything people ask before they try OpenNVR.

Is OpenNVR free and open source?

Yes. OpenNVR is fully open source under the AGPLv3 licence, and the AI adapter SDK is Apache-2.0. There are no per-camera fees, no per-seat licences, and no cloud subscription — you run it on your own hardware.

What is an open-source NVR?

An NVR (network video recorder) ingests, records, and serves video from IP cameras. An open-source NVR is one whose code you can read, audit, self-host, and modify — so your footage and analytics stay on hardware you control instead of a vendor's cloud. OpenNVR is an offline-first open-source NVR with an open AI platform on top.

How is OpenNVR different from Frigate, ZoneMinder, or Verkada?

OpenNVR adds a published open AI adapter contract (any model becomes a detector under any licence), an end-to-end audit chain with model-fingerprint drift detection, two default-deny sovereignty gates, a peer-reviewed architecture paper, and a voice agent you can talk to. See the full side-by-side on the OpenNVR vs Frigate, ZoneMinder and Shinobi comparison.

Can OpenNVR run completely offline?

Yes — offline-first is the default. Cameras sit on an isolated network with no route to the internet, recording and AI run locally, and cloud connectivity is off unless you explicitly enable it (and that opt-in is audit-logged).

Can I run my own AI models on my cameras?

Yes. Bring Your Own Model (BYOM): wrap any model — ONNX, PyTorch, a fine-tuned model, or a cloud endpoint — in about thirty lines of Python with the Apache-2.0 SDK, and OpenNVR treats it as a first-class detector. Eight adapters ship out of the box, including an open-vocabulary detector you can query with free text like "red truck".

Can I search my recorded footage in plain language?

Yes. The footage-search example indexes your recorded inference (object labels plus scene captions) and lets you ask "show me every red truck at the dock yesterday" — object classes come from the detector, attributes like colour from the captioner or the open-vocabulary adapter. Fully on your hardware, no cloud, no API keys.

Can I really talk to my cameras?

Yes. The camera-agent example lets you ask a question out loud — "is there a person at the front door?" or "did a red truck come by the dock earlier?" — and a local LLM answers, grounded in a live frame or your recorded-footage index, spoken back to you. Whisper, an Ollama LLM with tool-calling, and Piper, all running on your hardware. No cloud, no API keys.

Who needs the OpenNVR Commercial License?

Businesses doing what the AGPL doesn't allow: selling hardware with OpenNVR pre-installed under their own brand (with proprietary changes or locked firmware), embedding OpenNVR inside proprietary software, or hosting a modified OpenNVR as a closed service. Self-hosting is free forever on any hardware. It's the Qt/Linphone dual-licensing model — see the license matrix.

Can the apps and adapters I build be proprietary?

Yes — deliberately. The app SDK and the AI adapter SDK are Apache-2.0, so anything you build on them ships under any license you choose, including closed source. Only the platform core is AGPL. Building on OpenNVR never requires a lawyer.

What is "Powered by OpenNVR"?

The trademark badge. Anyone shipping substantially unmodified OpenNVR under the AGPL may use it for free; commercial licensees are required to display it (unless they purchase the white-label tier). The code license and the trademark are separate on purpose — the code stays genuinely open while the name stays trustworthy.

Where are the API references?

Three, all generated from the code rather than written beside it: the App SDK reference for building apps, the Adapter SDK reference for publishing a model, and the operator API — the same OpenAPI document a running install serves at /docs. Start at the developer corner if you are not sure which you need.

What cameras does OpenNVR work with?

Any camera that speaks ONVIF or RTSP — which covers virtually all modern IP cameras (Hikvision, Dahua, Axis, Reolink, and generic ONVIF/RTSP). No proprietary hardware to buy; reuse the cameras you already own.

Run it in five minutes. Build on it for good.

Pull the pre-built images, point it at a camera, and watch detections appear. Then write an adapter, fork an example, and make it solve your problem — the contract is the front door, and it's open.

Free and open forever under AGPLv3 — self-host it, fork it,write an adapter, oropen a PR.

Deploying for a government, critical-infrastructure, or regulated environment?Talk to us about a pilot or security assessment →