A simple, single-binary IP camera recorder. Think of it as a dashcam for your property.
Find a file
2026-08-05 14:09:52 +01:00
public fix: correct go2rtc player URL — stream.html not root 2026-08-05 14:02:00 +01:00
.gitignore chore: Milestone 1 & 2 — core setup, recorder, cleaner, web UI, deployment 2026-08-05 09:15:43 +01:00
api.go fix: proxy MJPEG stream through NextNVR to avoid cross-origin blocking 2026-08-05 13:04:44 +01:00
CHANGELOG.md chore: v0.2.2 — user-friendly README, one-line deploy, auto-install deps 2026-08-05 09:58:39 +01:00
cleaner.go feat: v0.3.3 — rec_/snap_ prefix, latest.jpg grid, per-minute archival snapshots 2026-08-05 12:37:51 +01:00
config.go chore: set retention to 7 days — no archival compression 2026-08-05 12:41:58 +01:00
config.yaml chore: set retention to 7 days — no archival compression 2026-08-05 12:41:58 +01:00
go.mod chore: Milestone 1 & 2 — core setup, recorder, cleaner, web UI, deployment 2026-08-05 09:15:43 +01:00
go.sum chore: Milestone 1 & 2 — core setup, recorder, cleaner, web UI, deployment 2026-08-05 09:15:43 +01:00
go2rtc.go chore: Milestone 1 & 2 — core setup, recorder, cleaner, web UI, deployment 2026-08-05 09:15:43 +01:00
main.go feat: v0.3.2 — disk-based snapshot engine, no go2rtc polling for grid 2026-08-05 12:28:29 +01:00
onvif.go chore: v0.3.0 — greenfield-first, auto-wizard, ONVIF hybrid probe, empty default config 2026-08-05 11:59:54 +01:00
README.md docs: add remote access guide with Dynamic DNS + port forwarding 2026-08-05 14:09:52 +01:00
recorder.go feat: v0.3.3 — rec_/snap_ prefix, latest.jpg grid, per-minute archival snapshots 2026-08-05 12:37:51 +01:00
server.go fix: no-cache headers to prevent stale JS, correct go2rtc stream.html URL 2026-08-05 14:02:44 +01:00
setup.sh chore: portable setup.sh — supports 5 distros, auto-detect pkg manager, fallback for non-systemd, ARM64 2026-08-05 10:03:34 +01:00
snapshot.go fix: snapshots via go2rtc frame.jpeg — instant, no RTSP renegotiation 2026-08-05 13:12:02 +01:00
VERSION chore: v0.2.2 — user-friendly README, one-line deploy, auto-install deps 2026-08-05 09:58:39 +01:00

NextNVR

A lightweight, self-hosted video recorder for IP cameras. Records 8 RTSP streams into 5-minute MP4 clips with near-zero CPU usage. Built for the Casa Alba Mindelo guesthouse.


Quick Install

Copy and paste this single line into your terminal:

curl -sSL https://git.lohmar.co.uk/cclohmar/NextNVR/raw/branch/main/setup.sh | bash

That's it. The script installs everything needed and starts NextNVR automatically.

Once done, open the web interface in your browser (the script prints the URL).


Supported Systems

Distro Package Manager Status
Debian 12+ / Ubuntu 22.04+ apt Tested
Fedora 40+ / RHEL 9+ dnf / yum
Arch Linux pacman
Alpine Linux apk
Other (systemd) auto-detect
Other (no systemd) fallback to nohup
  • ARM64 (Raspberry Pi, etc.) — auto-detected
  • Root or sudo — handles both

What It Does

Feature Detail
📹 Recording 8 cameras simultaneously, 5-minute MP4 clips
💾 Storage Saves to /mnt/recordings/ — keeps 18 days, auto-deletes older
🖥️ Live Wall 4×2 grid showing all cameras at once. Click one to enlarge.
🔍 Playback Browse recordings by camera and date with presets (Today, Yesterday, Last 7 Days)
⚙️ Setup Wizard Scans your network for cameras and helps you name them
🔒 Local Only Everything runs on your own hardware. No cloud, no subscriptions.

Remote Access (Optional)

To access NextNVR from outside your home network:

  1. Dynamic DNS — use a free provider like DuckDNS, No-IP, or Cloudflare to get a domain name (e.g. myhouse.duckdns.org)
  2. Port forwarding — in your router settings, forward these ports to the NextNVR server:
Port Service Required
8080 Web UI Yes
1984 Live streaming Yes — live view won't work without it

Then access your cameras from anywhere: http://myhouse.duckdns.org:8080

⚠️ For production use, put NextNVR behind a reverse proxy (like Zoraxy or Nginx) with HTTPS to secure your connection.


Server

What Detail
Web interface http://<server-ip>:8080
Config file /opt/nextnvr/config.yaml
Recordings /mnt/recordings/
Logs sudo journalctl -u nextnvr -f (systemd) or tail -f /opt/nextnvr/nextnvr.log (nohup)

Useful Commands

sudo systemctl status nextnvr     # is it running?
sudo systemctl restart nextnvr    # restart after changing config
sudo systemctl stop nextnvr       # stop recording
sudo journalctl -u nextnvr -f     # watch live logs

How It Works

IP Cameras                    NextNVR                        Your Browser
───────────                 ──────────                      ─────────────
192.168.1.201 ─┐                                          
192.168.1.202 ─┤   RTSP      FFmpeg -c copy      .mp4     http://192.168.1.10:8080
192.168.1.203 ─┼──────────►  (no re-encoding) ────────►   Live Wall + Playback
    ...        ┤              5 min segments               Settings + Setup
192.168.1.209 ─┘              auto-delete >18d
  • Zero transcoding — FFmpeg copies the video stream directly. CPU stays under 5%.
  • Crash-proof — if a camera disconnects, it auto-reconnects after 5 seconds.
  • Atomic files — recording in progress uses .part.mp4. Only renamed to .mp4 when complete. No corrupted files.

Adding or Changing Cameras

  1. Open the web interface in your browser
  2. Click the Settings tab
  3. Click 🔍 Scan Network to find your cameras
  4. Give each camera a name and description
  5. Click 💾 Save Configuration
  6. Restart: sudo systemctl restart nextnvr

Or edit the config file directly:

sudo nano /opt/nextnvr/config.yaml
sudo systemctl restart nextnvr

Updating

curl -sSL https://git.lohmar.co.uk/cclohmar/NextNVR/raw/branch/main/setup.sh | bash

The script pulls the latest version and restarts the service automatically.


Troubleshooting

Problem Check
Can't open the web page Is NextNVR running? sudo systemctl status nextnvr
No cameras showing Check config.yaml — are camera IPs and passwords correct?
Recordings not saving Does /mnt/recordings/ exist? Is the disk mounted? (df -h)
Disk full Recordings older than 18 days are auto-deleted. Check df -h /mnt/recordings

Built with ❤️ in Mindelo, Portugal. 🇵🇹