Skip to content

Eshpelin/nurby

Repository files navigation

Nurby

An open-source AI layer for your security cameras. Nurby turns raw video into people, journeys, events, and answers, on hardware you own. Use it as a self-hosted NVR with built-in vision intelligence, or as an AI-native companion to Frigate, Blue Iris, and Scrypted.

Point it at any IP camera and a vision model of your choice (local or cloud). Ask "where was the dog last night" in plain language, wire a rule that flashes a siren when a stranger appears after 10pm, and keep every frame on your own hardware.

Privacy first. Provider agnostic. CPU friendly. Yours to run and modify.

"Where was Mom last seen?"  ->  Kitchen, today at 7:42pm (cross-camera journey)
"Anything unusual today?"   ->  Summary of every camera, grouped by what matters
Stranger at the door 2am    ->  Email you + record a clip + sound an ESP32 buzzer

Screenshots

Dashboard: live cameras and AI digests of what happened at home

Live camera tiles, recognized people, hourly and daily AI digests, and a running timeline of detections you can ask questions about.

Nurby dashboard

People: faces grouped into named identities

Every recognized person, with relationships, last-seen, follow toggles, and per-person privacy controls. Unknown faces cluster into suggestions you can name in one click.

People page

Vehicles: identified by plate, with enter and leave history

Every vehicle keyed by its license plate, with a vision-model description of what was actually seen, sighting counts, and traceable footage.

Vehicles page

Rules: plain-language automation

Card-based triggers, conditions, and a chain of real-world actions. Every rule reads back as a plain sentence.

Rules page

Settings: one-click local AI and deep control

Deploy a local vision model through Ollama with a RAM-aware picker, or bring your own provider. Per-person privacy blur, nudity blur, retention policy, and the morning digest all live here.

Settings page

Guardian by Nurby: follow one person, blur everyone else

The Guardian Panel lets a parent or carer follow one specific dependant in a facility, and nobody else. A calm presence check, a verified-pickup moment, a blurred image where every other face is hidden, and a facility admin that grants, revokes, and audits access. See Guardian by Nurby for the full write-up.

A parent's view. Each dependant shows as present, away, or not seen.

Guardian panel showing a parent's dependants

One dependant. Present at a named zone, a "picked up by Mom" moment, and the latest snapshot blurred so no face is identifiable.

Guardian dependant detail with a blurred snapshot

The facility side. Grant a guardian or invite one by email, set the tier and entitlements, revoke instantly, and read a full access log.

Guardian facility admin: grant, revoke, and audit access

Mobile app: the same brain in your pocket

A Flutter companion app mirrors the web dashboard with the same dark-first design language. Five tabs cover the daily loop. Cameras shows live tiles with detection boxes and a plain-language activity line under each feed. Timeline is the AI-captioned history of what happened, filterable by camera. Ask is the same agentic Q&A as the web app, so you can ask "when did the package arrive today" from the couch. Alerts lists rule firings with severity and one-tap acknowledge. More holds rules, people, vehicles, recordings, and Guardian. The mockups below show the UI direction the app follows.

Cameras Timeline Ask Nurby
Mobile cameras tab with live tiles and detection boxes Mobile timeline of AI-captioned events Ask Nurby chat answering questions about footage
Alerts Rule editor Camera detail
Mobile alerts with severity and acknowledge Mobile rule editor with when-and-then cards and plain-language preview Camera detail with PTZ, detection and recording settings

More tab with rules, people, vehicles, recordings, and Guardian

What is Nurby?

Nurby is free, open-source software for recording and understanding your security cameras on your own server. It is a self-hosted network video recorder (NVR) and AI surveillance platform. It ingests RTSP and ONVIF IP cameras, detects objects and recognizes faces locally, captions scenes with a vision-language model, and lets you ask questions about your footage in plain language. Everything runs on hardware you control with Docker, so with a local model no video ever leaves your network. People use it as a private home-security camera system, a small-business CCTV setup, and a programmable surveillance platform with a REST API, webhooks, and physical alarm integrations.

Why Nurby

  • You own the data. Runs entirely on your hardware via Docker Compose. With a local model nothing ever leaves your network.
  • Bring your own brain. Use a free local model through Ollama, or OpenAI, Anthropic, or Gemini. Swap them per camera with no restart.
  • It understands, not just detects. YOLO finds objects, faces are recognized and grouped into people, and a vision model captions scenes. A built-in agent answers questions over all of it.
  • FindAnything: search beyond the ~80 COCO classes. YOLO only knows a fixed handful of object types. When you look for something it never detects, a chicken, a red ladder, a child in a blue jacket, Nurby falls back to NVIDIA's open-vocabulary LocateAnything grounding model and points at it in your footage anyway, drawing boxes on what it finds. Describe anything in plain words and Nurby locates it, an open-world dictionary instead of a fixed label set, which makes search genuinely intelligent. It runs locally on an NVIDIA GPU or Apple Silicon (no account or token), and the same capability is available as a Rules "visual condition" ("when a chicken is in the coop, do X"). Off by default; one toggle enables it.
  • Automation that reaches the real world. Rules can notify, email, call webhooks, sound physical alarms, and gate on a second AI confirmation before firing.
  • Programmable. A documented REST API, long-lived API keys, signed webhooks, and an MCP server let you build on top of it.

Real-world use cases

What people actually run Nurby for:

  • Front door and porch. Know when a package is dropped, when a stranger lingers, or when a known face (a family member, a dog walker) arrives. Get an email with a clip and a link to the footage.
  • Baby and elder care. A gentle "still moving" check on a crib or a room, and passive check-ins that do not spam you with alerts. Audio triggers catch a baby cry or a smoke alarm.
  • Pets and wildlife. Recognize your own animals, log their activity, and trigger a deterrent (a siren or lights) when an unwanted animal shows up.
  • Intrusion and loitering. Draw a zone on the live feed and alert when someone stays too long, or when an unknown face appears after hours. Chain a verify step so a second AI confirmation fires the siren only when it is real.
  • Find anything later. Ask in plain language: "where was the dog last night", "show me the white van on the driveway this week", "anything unusual today". No scrubbing timelines. And with FindAnything, search the raw footage for things the detector was never trained on, open-vocabulary, and Nurby boxes them for you.
  • Small business and farm. Multi-camera coverage, license-plate reads on vehicles, daily digests of who and what was seen, and event logging you can export.
  • Build your own automations. Every event can hit a webhook, so you can push alerts into your home automation, a chat app, a spreadsheet, or a tool like n8n. See Automate with n8n.

Guardian by Nurby

Guardian by Nurby turns the same engine into a privacy-first way for a family to follow one specific person inside a facility, and nobody else. A daycare, a preschool, a coaching center, or an eldercare home runs Nurby on its own cameras. Each parent or adult child gets a Guardian Panel that answers the three questions they actually have. Did they arrive safely. Are they okay right now. Who did they leave with.

It is a thin permission and view layer on top of everything Nurby already does. It forks no detection, identity, or AI logic, so every improvement to the core engine is inherited automatically.

What a guardian sees

  • Presence. A 10-second check. "Inara is at school, Classroom B, seen 30 seconds ago." Green, amber, or grey.
  • Safe arrival and verified pickup. A push the moment they arrive and the moment they leave. Pickup is checked against an approved-pickup registry of people and vehicles, so you get "picked up by you" or a yellow "left with someone not on the approved list."
  • A real day timeline. Arrival, pickup, and zone moments as they happen, grouped by day, with a dedicated pickup-moment card.
  • Blurred images. The most recent snapshot, with every face blurred so no one is identifiable. The dependant's own enrolled photo is shown separately as a recognition aid.
  • Deeper views. Short clips, audio signals, a daily recap, gentle weekly trends, and natural-language search scoped to their own dependant.

Privacy is the spine, not a feature

  • Blur everyone but the bound person. Every image served to a guardian is blurred. The system fails safe: it would rather over-blur the target than ever reveal the wrong person.
  • Default-deny. A guardian only ever sees the one person they are bound to. Everyone else stays an anonymous, blurred body.
  • The facility grants, the guardian never self-grants. Links carry a tier, an expiry, and an instant revoke for custody changes.
  • Every view is logged to a facility-visible audit trail.

It is free and open source

Everything is free right now. Guardian ships as part of Nurby's open-source codebase, so you can run the whole thing yourself today. The product already has the building blocks for tiers (the per-guardian flags an admin toggles), but there is no billing and nothing is paywalled. Pricing and tiers are a problem for later, once the product has earned it.

Who it is for

  • Daycares, preschools, and after-school programs. Parents drop a child off and spend the day wondering. Guardian answers the two questions that actually nag them, did they get there safely and who took them home, without turning the place into a surveillance camera for every other family.
  • Eldercare and assisted living. The same "follow one person" engine, with adult children as the guardians, surfacing presence, time out of room, and wellbeing signals.

Guardians sign in and land on the Guardian Panel at /guardian. A facility admin manages grants, the approved-pickup registry, alert policy, and the audit log under /guardian/admin, and can invite a parent by email in one step. Guardians can also ask "is my child at school right now" from any MCP client through guardian-scoped, read-only tools that honor the same scope and blur.

Get Nurby running on your computer

New to this kind of software? This is the whole setup. You do not need to know Docker, Python, or databases. You copy four commands, wait once, and open a web page. It runs the same way on macOS, Windows, and Linux.

Step 1. Install Docker Desktop

Docker is the one tool Nurby needs. It runs everything else for you (the database, the AI services, the web app) in the background so you do not install them one by one:

  • Download and install Docker Desktop from docker.com/products/docker-desktop.
  • Open it once after installing and leave it running. You will see a whale icon in your menu bar or system tray when it is ready.

On Windows, accept the WSL 2 prompt if it appears. That is Docker setting itself up, and it is normal.

Step 2. Download Nurby

Open a terminal (on Mac, the Terminal app. On Windows, PowerShell) and run:

git clone https://github.com/Eshpelin/nurby.git
cd nurby

No git? Install Git, or download the project as a ZIP from the green "Code" button on GitHub, unzip it, and cd into the folder.

Step 3. Create your settings file

cp .env.example .env

This makes a .env file from the template. The defaults are fine for trying it on your own machine. You do not need to edit anything yet.

Step 4. Fetch the AI models

bash scripts/fetch-models.sh

This downloads the detection, face, and license-plate models once (about 430 MB) so the perception service can bake them into its image. They are baked in rather than pulled at runtime so Nurby works offline and starts instantly, and so it runs on locked-down networks where the upstream model hosts are not reachable. Re-running skips anything already downloaded.

Step 5. Start it

docker compose up --build

The first time, this downloads and assembles everything. It can take 5 to 15 minutes and print a lot of text. That is expected, and only happens once. Later starts take seconds. When it settles and stops scrolling, Nurby is running. Leave this terminal window open while you use it.

Step 6. Open Nurby

Open your web browser and go to http://localhost:4747.

The first visit drops you straight in. No account wall, no forms. You pick how to start:

  • Show me some magic. One click. Nurby adds a live demo camera, sets up a private local vision model if one is reachable, and lands you on the dashboard watching footage. Nothing leaves your machine.
  • Set it up myself. A short guided flow. Add your own camera (paste its RTSP or ONVIF link, the built-in brand guide covers 26 popular brands, or use your laptop or phone webcam), then optionally pick a vision model, local or cloud.

When you are ready, a Secure your account button in the top bar lets you set an email and password so only you can get back in. Until then you are signed in as a provisional owner.

That is it. You now have Nurby running. Open Ask and try a question, or build your first rule.

Want AI scene descriptions with zero setup? Detection, faces, and rules all work without a vision model. For plain-language captions and Ask Nurby, start the optional bundled local AI once:

docker compose --profile local-ai up -d ollama

Nurby detects it automatically, and Settings → AI Providers can deploy a model in one click. It stays opt-in so a plain docker compose up remains light.

Faster local AI on a Mac (native Ollama with the GPU)

The bundled ollama container runs the model on the CPU, because Docker Desktop on a Mac cannot reach the Apple GPU. That works, but a vision model can take tens of seconds per frame. For a much faster setup, run Ollama natively on the Mac so it uses the Metal GPU, and point Nurby at it.

  1. Install and start Ollama for macOS, then pull a vision model:

    ollama pull gemma3:4b
  2. Let Ollama accept connections from the Docker containers, then restart it:

    launchctl setenv OLLAMA_HOST 0.0.0.0
    osascript -e 'quit app "Ollama"'; open -a Ollama

    Note: This binds Ollama to all network interfaces so Docker can reach it, which also exposes it to your local network. On a home network that is low risk. To undo it later, run launchctl unsetenv OLLAMA_HOST and restart Ollama.

  3. Point Nurby at the host Ollama by adding this to your .env, then docker compose up -d to apply it:

    OLLAMA_BASE_URL=http://host.docker.internal:11434
  4. You no longer need the bundled container, so skip the --profile local-ai step. In Settings → AI Providers, deploy or select your model. It now runs on the GPU. On Apple Silicon this is roughly ten to twenty times faster than the CPU container.

This is the recommended setup for anyone on a Mac who wants responsive live captions. Linux hosts with an NVIDIA GPU get the same benefit by giving the bundled ollama container GPU access through the NVIDIA Container Toolkit.

Stopping, starting, and resetting

  • Stop it. Press Ctrl+C in the terminal, or run docker compose down.
  • Start it again. docker compose up (no --build needed after the first time).
  • Update to the latest version. ./scripts/update.sh. See Updating.
  • Start completely fresh. docker compose down -v wipes all data and gives you a clean slate. This deletes everything, so only do it on purpose.

If something does not work

Problem Fix
docker: command not found or "Cannot connect to the Docker daemon" Docker Desktop is not installed or not running. Open it and wait for the whale icon, then retry.
"port is already allocated" Another program is using a port Nurby needs (4747 or 4748). Quit that program, or change the port on the left side of the mapping in docker-compose.yml.
The first up --build seems stuck It is downloading. Give it up to 15 minutes the first time. A fast internet connection helps.
The page at localhost:4747 will not load Wait until the terminal stops scrolling and shows the services are up, then refresh. On Windows make sure Docker is using WSL 2.
"I do not have an RTSP link for my camera" Use the in-app brand guide when adding a camera, or start with your webcam to explore.
No AI model offered in setup Install Ollama and start it, then click "Check again" in the model step, or paste a cloud provider API key.

Want more control (custom passwords, HTTPS, a public address)? See Configuration and Requirements below.

Feature highlights

Cameras and ingestion

  • Multi-protocol cameras. RTSP, HTTP MJPEG, HTTP snapshot, HLS, USB, file, and a phone or laptop webcam as a camera.
  • ONVIF auto-discovery with network scanning, plus USB and local device probing.
  • A guided camera-brand cheat sheet (26 brands) that shows where to find each vendor's RTSP/ONVIF URL during setup.
  • Smart recording per camera. Continuous, motion, object, or clip with pre/post buffers.
  • Retention policies enforced automatically, by time or by size, with thumbnail cleanup.

Perception and reasoning

  • YOLO detection with a curated 17-model catalog (yolov8, yolo11, yolo-world open-vocabulary, OIV7 600-class, RT-DETR).
  • Dynamic class vocabulary per camera sourced from whichever model is active, not a hardcoded list.
  • Face detection and recognition with 512-dim embeddings in pgvector, auto-clustering of unknown faces, and body re-identification.
  • Vision-model scene captions with a CPU-friendly pipeline. A CLIP zero-shot gate, perceptual-hash dedupe, a Redis backlog with priority lanes, and late-frame flagging keep it responsive on modest hardware.
  • License plate OCR on vehicle crops, audio events (baby cry, dog bark, glass break, smoke alarm), and motion-zone masking.
  • Privacy post-processing. Per-person blur and NudeNet nudity blur.

People, journeys, and nicknames

  • Named person profiles with relationship tags, consent tracking, and per-person privacy blur.
  • Household nicknames. Call your mother "Mom" and your daughter "Lee" and that is what shows up everywhere, while identity stays canonical under the hood.
  • Cross-camera journeys. A subject's sightings are stitched into a single timeline across cameras, with co-presence and transitions.

Ask Nurby (agentic Q&A)

  • Ask questions in plain language and get grounded, cited answers from your footage.
  • A tool-use agent drives read-only tools over observations, journeys, people, events, and relationships, with a map-reduce summarizer for long windows.
  • Per-user daily token and cost budgets, streamed over WebSocket.
  • An MCP server exposes the read tools so external agents (Claude Desktop and others) can query Nurby with a scoped token.

Rules and automation

  • A full-page rule builder with a drag-to-reorder action chain, a live plain-language preview, and a dry-run plus historical-replay tester.
  • Trigger types. Object detected, face recognized, unknown face, motion, audio event, loitering, line cross (tripwire), and more, with an inline canvas geometry editor that draws zones on the live feed.
  • Conditions for camera scope, schedule, and confidence, with cooldowns to prevent spam.
  • Action chain. Webhook, API call, in-app notify, email, Telegram, broadcast, an AI verify gate that can stop the chain, and a VLM call whose output later actions can reference.
  • Physical device presets. Pick an ESP32 buzzer, ESP8266 relay lights, or a Raspberry Pi speaker or siren, and Nurby fills the webhook and links you the receiver script to flash.

Integrations and API

  • Programmatic REST API documented at /docs and /openapi.json, with read filters by time, person, label, and camera.
  • Long-lived API keys (nrb_...) for scripts, scoped and revocable, alongside user JWTs.
  • Outbound webhooks with HMAC-SHA256 body signing, automatic retries with backoff, and standing event subscriptions independent of any single rule. Every alert can carry a direct link to its footage clip.
  • Email via SMTP and Telegram with inline acknowledge, mute, and snooze buttons.

Operations

  • Live dashboard with a camera grid, hover PTZ controls, an activity timeline, and a 24h digest with a people gallery.
  • Natural-language search over observations via pgvector, plus keyword and regex fallbacks.
  • Notification center, per-camera storage and retention views, dark and light themes with no flash on load.
  • JWT auth with bcrypt, a first-run admin setup, and invite keys with per-camera access grants.

See the docs for deeper guides. REST API, webhooks, physical devices, MCP server, and the agent design.

Architecture

A four-layer pipeline runs as services in one Docker Compose stack:

+---------------------------------------------------------+
|  Frontend (Next.js 16 / React 19)                       |
|  Dashboard . People . Rules . Ask . Recordings . Settings|
+----------------------------+----------------------------+
                             |
+----------------------------v----------------------------+
|  API (FastAPI)             |  Streaming (MediaMTX)       |
|  REST + WebSocket + Auth   |  WebRTC . HLS . RTSP        |
|  API keys . MCP server     |                             |
+----------------------------+----------------------------+
                             |
+----------------------------v----------------------------+
|  Layer 4. Agent. Tool-use Q&A, summarizer, budgets      |
+---------------------------------------------------------+
|  Layer 3. Events. Rules, verify gates, webhooks (HMAC), |
|           email, Telegram, device alerts, digests       |
+---------------------------------------------------------+
|  Layer 2. Perception. YOLO, tracking, face + body re-id,|
|           VLM captions, plate OCR, audio, privacy blur  |
+---------------------------------------------------------+
|  Layer 1. Ingestion. RTSP decode, motion, recording,    |
|           clips, retention enforcement                  |
+---------------------------------------------------------+
         |                          |
    +----v-----+             +------v------+
    | Postgres |             |    Redis    |
    | pgvector |             |   Streams   |
    +----------+             +-------------+

Requirements

  • Docker and Docker Compose (the supported way to run the full stack).
  • About 4 GB RAM free for a small setup. More if you run larger local vision models.
  • A vision model. Either Ollama on the host for fully local inference, or an API key for OpenAI, Anthropic, or Gemini.
  • For local development. Python 3.11+, Node.js 20+, and PostgreSQL 15+ with the pgvector extension.

GPU is optional. The perception pipeline is tuned to run on CPU.

Ports and addresses

The setup walkthrough is in Get Nurby running on your computer above. For reference, the default compose file exposes the stack on these host ports:

Service URL
Frontend (app) http://localhost:4747
API http://localhost:4748
API docs http://localhost:4748/docs
WebRTC (WHEP) http://localhost:8889
HLS http://localhost:8888
RTSP rtsp://localhost:8554
Postgres localhost:5433
Redis localhost:6379

Running a local model with Docker. One-click Ollama deploy pulls models on the machine that runs the API, so when the API runs in Docker, install Ollama on the host and Nurby auto-detects it at http://host.docker.internal:11434. You can also set OLLAMA_BASE_URL to point anywhere on your network.

Configuration

Copy .env.example to .env and adjust. Key variables:

Variable Purpose
POSTGRES_PASSWORD Database password (compose wires it into DATABASE_URL).
DATABASE_URL Async Postgres DSN.
REDIS_URL Redis connection for streams and queues.
JWT_SECRET Signing secret for auth tokens. Set a strong value for any real deployment.
RECORDINGS_PATH, THUMBNAILS_PATH Where clips and thumbnails are stored.
OLLAMA_BASE_URL Override where Nurby looks for Ollama.
SMTP_* SMTP host, port, user, password, and from-address for email actions.
PUBLIC_BASE_URL Public URL used to build clip and event links in alerts.
NEXT_PUBLIC_API_URL, NEXT_PUBLIC_WS_URL, NEXT_PUBLIC_WEBRTC_URL Frontend endpoints for local development outside Docker.

Runtime settings such as timezone, blur defaults, and digest options live in the database and are editable from the Settings page.

Local development

Backend:

pip install -e ".[dev]"
alembic upgrade head
uvicorn services.api.main:app --reload   # serves on :8000

Frontend:

cd frontend
npm install
NEXT_PUBLIC_API_URL=http://localhost:8000 npm run dev   # serves on :3000

Seed realistic demo data (cameras, people, observations, and real journeys built through the production aggregation path).

python3 scripts/seed_demo_data.py            # add demo data
python3 scripts/seed_demo_data.py --clean    # wipe and repopulate

Tests

The backend ships a fast, deterministic suite that runs without a database or an LLM.

python -m pytest -q

The agentic Q&A surface has a separate 30-fixture eval suite (tests/test_agent_eval.py) run nightly in CI. See docs/agent-eval.md.

Updating

Nurby checks GitHub for new releases and shows an "Update available" banner in Settings. To update, run one command on the host:

./scripts/update.sh

It pulls the latest code, rebuilds, and restarts. Migrations run automatically on startup. An optional in-app one-click update button is available too. See docs/updating.md.

Prefer not to build on a low-power box? Every release publishes prebuilt images to the GitHub Container Registry, so you can docker compose pull and docker compose up -d instead of building. See docs/releasing.md.

Automate with n8n

n8n is a free, self-hostable automation tool. Nurby plugs into it both ways with no custom code.

Nurby to n8n (react to events). In n8n, add a Webhook node and copy its URL. In Nurby, add a webhook action to a rule, or a standing subscriber under Rules, and paste that URL. Now every matching alert arrives in n8n as JSON (camera, event, detections, and a recording_url link to the clip), and you can route it anywhere: a Slack or Telegram message, a Google Sheet, a smart-home action, a phone call.

n8n to Nurby (drive Nurby). In n8n, add an HTTP Request node pointed at the Nurby API with an API key in the Authorization: Bearer header. Now an n8n workflow can fetch events, list recordings, query people, or create rules on a schedule or in response to anything else in your stack.

Set a signing secret on the Nurby side and n8n can verify the X-Nurby-Signature HMAC so it only acts on genuine Nurby alerts. Full walkthrough in docs/integrations/n8n.md.

Database migrations

alembic upgrade head                                  # apply pending migrations
alembic revision --autogenerate -m "describe change"  # after model changes

In Docker the API applies migrations automatically on startup.

Project structure

nurby/
+-- services/
|   +-- api/            FastAPI REST + WebSocket + auth + routes
|   +-- ingestion/      RTSP decode, motion, recording, retention
|   +-- perception/     YOLO, tracking, face + body re-id, VLM, audio, blur
|   +-- events/         rule engine, actions, webhooks, email, Telegram
|   +-- agent/          tool-use Q&A driver, tools, summarizer
|   +-- mcp/            MCP server exposing read tools
|   +-- search/         vector search, embeddings, digests
|   +-- digest/         background digest scheduler
|   +-- discovery/      ONVIF discovery and PTZ
+-- shared/             models, schemas, auth, config, database
+-- integrations/
|   +-- devices/        physical alert device presets + receiver scripts
+-- frontend/           Next.js app (dashboard, rules, ask, people, ...)
+-- alembic/            database migrations
+-- scripts/            demo + eval seed generators
+-- docs/               API, webhooks, devices, MCP, agent guides
+-- docker-compose.yml  full stack

FAQ

Is Nurby free and open source? Yes. Nurby is free and open source under the AGPL-3.0 license. There is no paid tier, no account, and no cloud lock-in. You self-host it.

Is Nurby a Frigate alternative? Nurby covers similar ground to Frigate, Scrypted, Shinobi, MotionEye, and Blue Iris (recording IP cameras, object detection, alerts) and adds AI on top. Faces and people, cross-camera journeys, vision-language scene understanding, and plain-language questions about your footage. You can run it instead of or alongside them.

Does it work fully offline and keep my video private? Yes. With a local model via Ollama, all detection and reasoning happen on your hardware and no video leaves your network. Cloud vision models are optional.

What cameras work with Nurby? Any RTSP or ONVIF IP camera, plus HTTP MJPEG and snapshot cameras, HLS streams, USB cameras, and even a phone or laptop webcam. An in-app guide covers 26 popular camera brands.

Do I need a GPU? No. The perception pipeline is tuned to run on CPU. A GPU helps with larger local vision models but is not required.

What hardware do I need? A machine that runs Docker with roughly 4 GB of free RAM for a small setup. More for bigger local models. It runs on a NAS, a mini PC, an old laptop, or a home server.

How do I install it? Install Docker Desktop, clone the repo, and run docker compose up --build, then open http://localhost:4747. See Get Nurby running on your computer.

Can I build on top of it? Yes. Nurby has a documented REST API, long-lived API keys, HMAC-signed webhooks, an MCP server for AI agents, and physical-device alert integrations (Arduino, ESP32, Raspberry Pi).

Keywords

Open source CCTV, self-hosted NVR, network video recorder, video management system (VMS), home security camera software, AI surveillance, computer vision security cameras, RTSP and ONVIF recorder, privacy-first surveillance, self-hosted home security, Frigate alternative, Scrypted alternative, Blue Iris alternative, local AI camera monitoring, face recognition security camera, smart home security, Docker security camera server.

Maintainer note. GitHub ranks repositories by the "About" description and Topics, not just the README. Set a keyword-rich About description and add Topics such as cctv, nvr, surveillance, security-camera, self-hosted, home-security, computer-vision, object-detection, face-recognition, rtsp, onvif, ai, privacy, docker, and vms in the repository settings.

Contributing

Contributions are welcome. A good loop is:

  1. Fork and branch from main.
  2. Make focused changes with tests. Run python -m pytest -q and, for frontend work, cd frontend && npm run build.
  3. Open a pull request describing the change and how you verified it.

By contributing you agree your contributions are licensed under the project license below.

License

Nurby is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE.

In short, you are free to use, run, study, modify, and share Nurby. If you run a modified version as a network service, you must make your modified source available to its users under the same license. This keeps Nurby and its derivatives open.

Releases

No releases published

Packages

 
 
 

Contributors