The creamiest selfhosted NVR
This is not intended for production use. This application is unlikely to function correctly.
This is a wrapper around the rtsp-to-hls.sh script in https://github.com/w23/zenki
- Live camera viewing with live rewind / time shifting
- 24/7 recording
- Automatic pruning of recordings based on per-camera storage size or age limit
- View timeline of a camera's motion events across many recordings and scrub through them
| Feature | Desktop | Mobile |
|---|---|---|
| Listing Cameras | ![]() |
![]() |
| Viewing Camera | ![]() |
![]() |
| Viewing Cameras | ![]() |
![]() |
| Listing Recordings | ![]() |
![]() |
| Viewing Recording | ![]() |
![]() |
| Viewing Timeline | ![]() |
![]() |
Create a config like this:
{
"inputs": [
{
"id": "my-camera",
"name": "Camera",
"url": "rtsp://foo:[email protected]:554/stream"
}
]
}Give it to creamy-nvr by saving it to config.json or via env in CREAMY_NVR_CONFIG
Build the project with make
Run the project with ./creamy-nvr
View the project at http://localhost:3000
Enable debug mode to see ffmpeg logs in stdout:
{
"debug": true
}Enable pruning to automatically remove recordings or stream-segments that are too old or are taking too much space:
{
"prune_interval_minutes": 60,
"inputs": [
{
"id": "my-camera",
"name": "Camera",
"url": "rtsp://foo:[email protected]:554/stream",
"recording_age_limit_hours": 24,
"recording_size_limit_megabytes": 20000,
"stream_age_limit_hours": 6,
"stream_size_limit_megabytes": 500
}
]
}If you get too many motion events, change the motion detection minimum score. It defaults to 10. To include every single event, set this to -1.
{
"inputs": [
{
"id": "my-camera",
"name": "Camera",
"url": "rtsp://foo:[email protected]:554/stream",
"motion_detection_minimum_score": 10
}
]
}If your recordings aren't having motion detected in a timely manner, try assigning extra motion detection workers.
This value defaults to one worker per input or at least two goroutines - whichever is greater.
{
"motion_detection_workers": 7
}docker build -t creamy-nvr .
docker run \
--rm \
-p 3000:3000 \
-v creamy-nvr-media:/media \
creamy-nvr












