A desktop app that finds the IP cameras on your network and records them. No accounts, no cloud, no subscriptions. Install it, give it your camera passwords, watch it work.
| Platform | Link |
|---|---|
| Windows 11 | simplenvr-windows.zip |
| macOS — Apple Silicon | simplenvr-macos.zip |
Linux (.AppImage) |
simplenvr-linux.zip |
Intel Macs aren't supported by the current build — see docs/install.md for details and how to check which chip your Mac has.
Heads up — these builds are not yet code-signed or notarized. Code signing is on the roadmap before the first public release. Until then, Windows and macOS will warn you on first launch because the app is from an "unidentified developer." That warning is the OS's default treatment of any unsigned binary; it does not indicate a problem with SimpleNVR. The instructions below walk you through the one-time bypass each OS requires.
If you'd rather skip the downloads and build from source, see Building from source further down.
Because the current builds are not yet signed, Windows and macOS will warn you on first launch. That warning is the OS's default treatment of any unsigned binary, not a problem with SimpleNVR.
See docs/install.md for the one-time bypass each OS requires — Windows SmartScreen "Run anyway," macOS Gatekeeper approval from System Settings (or the one-line xattr Terminal shortcut), and the straightforward .deb install on Debian-family Linux.
SimpleNVR walks you through a short first-run flow and then gets out of your way:
- It scans your network and shows you every camera it can see, identified by brand where possible.
- It asks for your camera usernames and passwords. We show you the factory defaults for common brands as a starting point. If your network has four Reolinks and the username is
adminon all of them, you type it once. - It starts recording. As soon as a camera is authenticated, it starts writing video to disk immediately — you don't need to click a "begin recording" button.
After that, the home screen is a live grid of your cameras with a timeline of the day's motion events. There's nothing else to configure. SimpleNVR manages storage on its own — set a disk budget in Settings and it keeps a rolling buffer of footage up to that size. 30 days. 60 days. Whatever fits.
If a camera goes offline, a network blip reconnects automatically, ffmpeg crashes for any reason — SimpleNVR recovers silently in the background. You only see a notification when something actually needs you.
- Records 24/7 from any camera that speaks RTSP. Reolink, Amcrest, Annke, Eufy (with HomeBase), TP-Link Tapo, UniFi, and most generic ONVIF cameras are supported out of the box.
- Detects motion on every camera using OpenCV background subtraction, with multi-object tracking so one person walking across the yard is one event, not twenty.
- Identifies people, vehicles, and animals on-device using a small bundled AI model. No cloud, no subscription, no data leaving your machine.
- Listens for sounds that matter (glass breaking, alarms, dogs barking) on cameras that have microphones.
- Plays back any moment with a day-scrubber across all cameras. Click a time, see what was happening.
- Works for up to 32 cameras on a normal laptop or desktop. Beyond that you want something different — and we'll be honest and tell you so.
Everything runs locally. SimpleNVR does not send your video anywhere, does not require an account, and does not talk to any servers we run.
- Windows 11 on ARM64 (Snapdragon X Elite, Copilot+ PCs) — primary deployment target
- macOS on Apple Silicon (M1 and newer) — first-class support
- Windows 11 on x86_64 (Intel/AMD) — supported
- macOS Intel (2016+) — supported
- Linux x86_64 — best-effort; runs fine, not part of the regular release flow
System requirements:
- Any modern CPU from the last 5 years (4 cores or more recommended)
- 8 GB of RAM for up to 8 cameras, 16 GB for 8–32 cameras
- A dedicated drive (or a folder on a large drive) with enough space for the retention you want — plan for roughly 50 GB per camera per day at full quality, or a lot less if you enable the storage-friendly recording mode
SimpleNVR is a Tauri v2 desktop app with a Rust shell, a Python sidecar, and bundled ffmpeg, go2rtc, and libmpv binaries. A release build also needs a self-built LGPL-clean opencv-python-headless wheel (the stock PyPI wheel is GPL-contaminated — docs/cv2-selfbuild.md has the why).
From a fresh clone:
./scripts/setup.sh --with-cv2 # one-time machine setup (~45 min first run)
./scripts/dev.sh # run in dev mode (rebundles Python, hot-reloads frontend)
./scripts/build.sh # build the shippable installersetup.sh checks prereqs (Rust, Node, Python 3.11+, CMake, platform tools) in one pass and tells you what's missing. Full details, including what each step does and when to rerun --with-cv2, are in docs/build.md.
Windows has its own two-script pipeline (setup_windows.ps1 + build_windows.ps1) and enough platform-specific setup — winget, MSVC Build Tools, Developer PowerShell for VS 2022, WebView2, Defender exclusions — that it gets its own full runbook: docs/build-windows.md.
Four moving pieces:
- Tauri Rust shell (
src-tauri/) — the window, the process supervisor, the installer - Python backend (
backend/) — camera discovery, recording management, motion detection, object classification, audio classification, HTTP API, WebSocket event bus - React + TypeScript frontend (
frontend/) — the UI, built with Vite - Bundled native binaries (
src-tauri/binaries/) — ffmpeg for recording, go2rtc for RTSP fan-out, tether for cross-platform parent-death supervision
docs/product.md— who SimpleNVR is for, what we deliberately don't build, and the "can a non-technical user do this?" test every feature has to passdocs/architecture.md— the technical architecture: Rust shell, Python sidecar, go2rtc, the recording pipeline, lifecycle invariants, and the load-bearing gotchas you need to know before touching recording or discoverydocs/install.md— installing an unsigned build on Windows, macOS, and Linuxdocs/build.md— building from source (macOS and Linux)docs/build-windows.md— the full Windows build runbookdocs/trademarks.md— the legal basis for showing third-party camera brand names and logos in the UI
SimpleNVR records what's on your network. Cameras that stream exclusively through the manufacturer's cloud — Ring, Blink, Google Nest, Amazon, stock Wyze, TP-Link Kasa, Arlo without a local hub, Xiaomi — don't expose a local video feed and therefore can't be recorded by any local NVR. This is a vendor architecture choice, not a SimpleNVR limitation we intend to fix. Keep using the manufacturer's own app for those cameras.
Battery-powered motion-wake cameras work when paired with their local hub (Eufy HomeBase, Reolink Home Hub, Arlo SmartHub), and they appear as "asleep" between wake events rather than as "offline."
Found a bug or have a question? github.com/ben-ic/simplenvr/issues
