Documentation

The App Store

The App Store is how detection logic ships on OpenNVR: ten apps install with one click from a curated, digest-pinned index — and apps you write get the same treatment.

What ships in the store

App Category What it does
Intrusion detection perimeter Person/vehicle in a drawn zone during restricted hours
Loitering detection perimeter Dwell-time alerts with a live “dwelling now” dashboard
Occupancy counting analytics Per-zone gauges against your limit; over/under/cleared alerts
Line crossing perimeter Directional tripwire drawn per camera, live in/out tallies
Abandoned object perimeter Unattended bags with owner-proximity suppression
Footage search forensics “Every red truck at the dock yesterday” — from the UI or by voice
License-plate recognition vehicle Plate OCR with allow/deny watchlists edited live
Smart doorbell doorstep Known vs. stranger faces, with in-UI face enrollment
Package delivery doorstep Arrival / linger / pickup with an on-the-porch dashboard
Home Assistant relay integration Alerts → HA entities via MQTT discovery

Every app gets a real product surface — for free

Declare a manifest and the platform renders the UI. No frontend code in any of the ten apps:

  • A full page at /app-catalog/<id>: status, uptime, enable/disable, configure, uninstall.
  • A live dashboard from state_schema — metric chips, tables, gauges (threshold-coloured), log feeds, and image galleries over the app’s GET /state.
  • Config forms from params — including polygon/tripwire zone drawing on the camera’s own frame, chip-list editors, time-window pickers. Edits reach the running app live; no restart.
  • Operator actions from actions — forms that POST through the server’s user-JWT-only proxy (enroll a face, search footage).
  • An agent skill — the voice agent lists installed apps, reads their live state, and relays their alerts. Read-only by design: the agent’s service key can never invoke an app’s actions.

Governance

  • One-click installs copy the image reference from the reviewed, digest-pinned index entry — never from the caller. A production deployment installs only digest-pinned entries.
  • App actions require a user JWT through the server proxy; the internal service key is rejected.

Ship your own

The app SDK is Apache-2.0 — your app, any license, including proprietary. Two distribution paths:

  1. Private (no review): a compose overlay + boot-time self-registration with the deployment’s internal key. Your app appears in the catalog with a status dot, dashboard, and config form.
  2. The curated store: publish your image, open a PR adding one digest-pinned entry to the index — the Homebrew-tap model.

Start with “Your first OpenNVR detector in 15 minutes” (docs/FIRST_DETECTOR.md in the main repo), then docs/CONTRIBUTING_APPS.md for the store submission.