Turn any low-power ARM device into a professional NVR in 60 seconds.
Single binary, zero dependencies, no cloud required. Runs on low-power ARM devices with a 512MB memory budget.
curl -fsSL https://raw.githubusercontent.com/Mi-Bee-Studio/MiBeeNvr/main/install.sh | sudo bashDownloads the binary, creates a system user (nvr), generates a config, installs a systemd service, and starts it. Data directory: /var/lib/mibee-nvr.
Download the latest binary from GitHub Releases:
# AMD64 (most PCs/servers)
wget https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/latest/download/mibee-nvr-amd64
chmod +x mibee-nvr-amd64
# ARM64 (Raspberry Pi 4/5, etc.)
wget https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/latest/download/mibee-nvr-arm64
chmod +x mibee-nvr-arm64
# ARMv7 (Raspberry Pi 2/3, etc.)
wget https://github.com/Mi-Bee-Studio/MiBeeNvr/releases/latest/download/mibee-nvr-armv7
chmod +x mibee-nvr-armv7Initialize config and start:
./mibee-nvr-amd64 init --password yourpassword
./mibee-nvr-amd64 -config mibee-nvr.yamlOpen http://localhost:9090 to access the Web UI.
docker compose --project-directory . -f deploy/docker/docker-compose.yml up -dOpen http://localhost:9090 to access the Web UI.
To store recordings on an external drive, edit the volume mount in docker-compose.yml:
volumes:
- /mnt/external/nvr:/data # ← change to your host path
environment:
- NVR_DATA_DIR=/data # must match the volume mountgit clone https://github.com/Mi-Bee-Studio/MiBeeNvr.git
cd MiBeeNvr
make build
./mibee-nvr init --password yourpassword
./mibee-nvr -config mibee-nvr.yamlFor detailed setup, see Getting Started.
- Single Binary: Zero dependencies, embedded Svelte 5 SPA,
CGO_ENABLED=0 - Low-Power ARM Ready: Runs on 1GB RAM with a 512MB memory budget (validated on Raspberry Pi 3B as the minimum baseline)
- Multi-Protocol Streaming: HLS, WebRTC, HTTP-FLV, RTMP, SRT, WebSocket
- No Cloud Required: Self-hosted, no subscriptions, no vendor lock-in
- Modern Web UI: Dark/light themes, i18n support, responsive design
- ONVIF Support: Auto-discovery, PTZ control, stream URI management
- Plug-and-Play Auto-Discover: ONVIF cameras joining the LAN are enrolled automatically in the background (Hikvision-NVR-style) — no manual scan. Unauthenticated devices start recording immediately; authenticated ones are added as pending activation until you supply credentials
- IP Self-Healing: ONVIF cameras that change IP (Wi-Fi roaming across APs) are auto-relocated by serial number and reconnected — unicast probing works across routed subnets
- Smart Integrations: MQTT triggers, WebDAV, FTP, FFmpeg transcoding

Surveillance grid: multi-camera live view (WebCodecs / MJPEG) with health scores and AI overlay

Recordings: per-camera timeline with AI event markers; list and timelapse views available

Cameras: discovery scanning, start/stop, and push-out relay management in one place
- RTSP (H.264/H.265/MJPEG) streaming
- HTTP JPEG snapshot streaming
- ONVIF discovery & management with PTZ control
- Xiaomi CS2 + legacy TUTK (7 models) cloud camera support
- SRT/RTMP push-in cameras (cross-network ingest — receive streams from remote publishers)
- GB/T 28181 national-standard platform (experimental): SIP cameras (Hikvision/Dahua/Uniview) register to the NVR — catalog, PTZ, voice intercom, device-side recording search & playback, alarm subscription, cascade. Default off
- Native Go push-out relay (forward any camera to remote RTMP/RTSP targets; FFmpeg optional for compatibility)
- HLS on-demand streaming with LL-HLS support
- WebRTC WHEP for sub-second latency viewing
- HTTP-FLV for browser-friendly streaming
- RTMP ingest server for push/pull workflows
- SRT low-latency transport receiver
- WebSocket real-time binary frame streaming
- Automatic MP4 segment generation
- Multi-camera concurrent recording
- Per-camera retention policies
- Audio capture (AAC + G.711 + Opus)
- Segment merging with configurable policies
- Periodic timelapse recording
- Continuous playback: double-buffered seamless segment chaining + full-day VOD timeline (scrub across recordings and gaps), AVI frame-browse mode
- LAN discovery (mDNS
_mibee-nvr._tcp+ UDP 49090 responder) with a stabledevice_idin/api/health
- Modern Svelte 5 web UI with dark/light themes
- REST API for automation
- BasicAuth with bcrypt password hashing
- Prometheus metrics integration
- Atomic configuration with validation
- Browser-side AI detection (ONNX Runtime Web, WebGPU-accelerated) — no backend inference
- Audio recording and playback (AAC + G.711 μ-law/A-law + Opus); AAC live preview via WebCodecs
- Multi-layer camera health monitoring
- Auto-remediation for connection issues
- SSE-based real-time event system
- Quality scoring and alerting
- MQTT trigger-based recording
- WebDAV server for file access
- FTP server for remote uploads
- FFmpeg hardware transcoding
- Event-driven architecture
| Protocol | Direction | Status | Notes |
|---|---|---|---|
| RTSP | Camera → NVR | ✅ Done | H.264/H.265/MJPEG support |
| HTTP JPEG | Camera → NVR | ✅ Done | Snapshot streaming |
| HLS | NVR → Browser | ✅ Done | On-demand streaming |
| WebRTC | NVR → Browser | ✅ Done | WHEP sub-second latency |
| HTTP-FLV | NVR → Browser | ✅ Done | Browser-friendly streaming |
| RTMP (ingest) | Camera → NVR | ✅ Done | Push-in: receive streams from remote publishers |
| SRT (ingest) | Camera → NVR | ✅ Done | Push-in: low-latency transport |
| RTMP (relay) | NVR → External | ✅ Done | Push-out: native Go relay to remote targets |
| RTSP (relay) | NVR → External | ✅ Done | Push-out: native Go relay to remote targets |
| ONVIF | Camera ↔ NVR | ✅ Done | Discovery, PTZ, stream URI |
| Xiaomi (CS2 + TUTK) | Camera → NVR | ✅ Done | CS2 P2P + legacy TUTK (7 models), cloud auth |
| GB/T 28181 | Camera → NVR | ✅ Done | SIP platform, auto-enrollment, audio + talk, subscriptions, PTZ, device-side playback |
Monitor your property with multiple cameras. Motion-triggered recording, smartphone alerts, and easy remote viewing from anywhere.
Affordable security system for shops, offices, and warehouses. Multi-camera support with individual retention policies.
Perfect for homelab enthusiasts. Self-hosted, no subscriptions, works with any RTSP camera and integrates with smart home systems.
| Document | Description |
|---|---|
| Getting Started | Installation, first camera setup |
| Upgrade Guide | Breaking changes & migration steps between versions |
| Configuration | Full config reference |
| API Reference | REST API documentation |
| MediaMTX Guide | MediaMTX integration for CSI cameras |
| Deployment | systemd, reverse proxy, cross-compile, and per-platform NAS guides (unRAID / fnOS / iStoreOS / Synology / QNAP / ZSpace) |
| Auto-update (Docker) | Manual + optional Watchtower auto-updates and rollback |
| Object-Storage Offload | Async S3-compatible cold backup with verified local eviction |
| Desktop Edition | Windows / macOS desktop installers and trust model |
| Xiaomi Setup | Xiaomi cloud camera integration |
| ONVIF Guide | ONVIF camera setup, PTZ control, troubleshooting |
| Camera Guide | Camera setup, protocols, troubleshooting |
| FTP Integration | FTP file access setup |
| MQTT Integration | MQTT smart home integration |
| Home Assistant | Home Assistant integration guide |
| WebDAV Integration | WebDAV file access setup |
| Troubleshooting | Common issues and solutions |
| Transcoding | FFmpeg transcoding setup |
| Prometheus Metrics | Complete Prometheus metric reference with types, labels, and examples |
| Relay Guide | RTMP live platform relay configuration and troubleshooting |
| Remote Access | External/4G access via Tailscale, Cloudflare Tunnel, and WebRTC ICE/STUN/TURN config |
# Build for current architecture
make build
# Cross-compile for ARM64 (Raspberry Pi)
make cross
# Run tests
make test
# Build Docker images
make docker-build # Multi-stage build
make docker-build-arm64 # Cross-compile arm64 (no QEMU)
make docker-build-all # All architecturesDocker deployment:
docker compose --project-directory . -f deploy/docker/docker-compose.yml up -dImages published to ghcr.io/mi-bee-studio/mibeenvr with tags: 0.13.0 (exact version), 0.13 (minor track), 0 (major track), latest
cmd/mibee-nvr/ # CLI entry point + app lifecycle
internal/ # Core packages (43 Go modules)
web/ # Svelte 5 SPA frontend
deploy/ # systemd services, Caddyfile
docs/ # Bilingual documentation (EN/ZH)
tests/ # Integration tests
e2e-tests/ # Playwright E2E tests
For full project details, see the architecture overview.
- Run
make lintbefore submitting (golangci-lint v2; runmake lint-installfirst) - Add tests for new features
- Write clear commit messages
Thanks to everyone who has contributed:
AGPL-3.0-only © Mi&Bee Studio, with a linking exception for pkg/ so third-party programs may build on the extension interfaces without triggering AGPL obligations.
- Using MiBee NVR (running it, recording cameras, watching streams): no obligations — use it freely, including commercially.
- Modifying and distributing it: your modified version must be released under AGPL-3.0.
- Building on
pkg/in your own program: allowed under the linking exception; your program's license is your choice. - Separate programs talking to a running NVR over its HTTP/WebSocket APIs: never affected by the license.
Releases up to v0.10.1 were MIT-licensed; that continues to apply to those versions. See NOTICE for third-party components and CONTRIBUTING.md for the contribution licensing policy.