Open sourceMIT licensed · self-hosted · no account

Your cameras. Your server. Your storage.

OpenCCTV is a free camera server and NVR for Tapo, UniFi, Reolink and any RTSP or ONVIF camera. It records 24/7 or on motion, uploads to Google Drive, S3 or your NAS, and streams to apps for iPhone and Android. No vendor cloud, no subscription, no account with us.

Try the live demo with login demo / demo. Real cameras, real recordings, nothing to install.

OpenCCTV web interface: live grid of nine cameras with recording indicators, a motion alert on the front door, a 24-hour timeline and a list of motion events uploaded to Google Drive and S3
OpenCCTV iPhone app: live view of the home cameras, front door showing a motion alert
Web UI and iPhone app on the same server. Footage from the public demo.

Works with the cameras you already own

  • TP-Link Tapo
  • UniFi Protect
  • Reolink
  • Hikvision
  • Dahua
  • Amcrest
  • Axis
  • eufy
  • Foscam
  • EZVIZ
  • Imou
  • Annke
  • Wyze
  • any ONVIF camera
  • any RTSP stream

UniFi Protect cameras are imported in one step. eufy and Wyze need models or firmware with RTSP. Cameras that can only send video can push RTMP or RTSP to the server.

Features

Everything an NVR should do. Nothing phoning home.

One binary or one container. Streaming by go2rtc, recording and motion detection by ffmpeg, uploads by rclone, glued together with a web UI and native apps.

  • Live view in under a second

    WebRTC with HLS fallback, HD and SD substreams, multi-camera grids in the app and the browser.

  • 24/7 or motion recording

    Continuous or motion-only per camera, with pre- and post-roll. Video is stored as the camera sends it, without re-encoding.

  • Timeline playback

    Scrub through any day, jump from event to event and export a time range as MP4 to share.

  • Motion events and push

    Every event with snapshot, time and duration. Push notifications per camera, with a cooldown so a tree in the wind does not spam you.

  • Two-way audio

    Hold to talk through the camera speaker on models that support it, Tapo included.

  • PTZ control

    Pan, tilt, zoom and presets over ONVIF, right from the app or the browser.

  • Cloud upload, auto-delete

    Nine storage types, several at once. Each target deletes footage after the number of days you set.

  • Pair by QR code

    Scan the code in the web UI and the app is connected. No typing server addresses or passwords on a phone.

  • Remote access, no port forwarding

    Run a second OpenCCTV as a gateway on a VPS. Your home server dials out, nothing on your router opens.

  • Finds your cameras

    ONVIF discovery and a LAN scan list the cameras on your network. The UniFi Protect import adds all of them at once.

  • Users and roles

    Admins configure, viewers watch. Every phone signs in with its own token instead of your password.

  • Runs where you want

    Linux, macOS, Windows or Docker on x64 and ARM64. A mini PC, a NAS or a small VPS is enough. Coolify-ready.

The apps

Made for the phone in your pocket.

Native apps for iPhone and Android, free, without ads or in-app purchases. Face ID app lock, picture-in-picture, light and dark mode, English and German. They connect to your server and nothing else.

  • Camera screen with live video, talk button and PTZ control
    Live, talk, PTZWebRTC latency, two-way audio and presets.
  • Timeline screen with day picker and motion events along the recording
    TimelineScrub any day, jump between events.
  • Events screen listing motion events with snapshots
    EventsEvery motion with snapshot, one tap to the clip.
  • Storage screen with local disk usage, Google Drive, S3 and NAS targets and retention settings
    StorageSee where footage goes and for how long.
How it works

Camera, server, your storage. That is the whole path.

OpenCCTV pulls the streams from your cameras inside your network, records them on the server and copies the recordings to the storage you choose. The apps talk to your server, never to us.

Cameras stream to the OpenCCTV server, which records them and uploads to your storage; apps and browsers connect to the server over LAN, gateway or VPN YOUR CAMERASYOUR SERVERYOUR STORAGEYOUR DEVICES TP-Link Tapo C210RTSP · camera account UniFi G4 ProProtect import · RTSPS Reolink RLC-823AONVIF · PTZ Doorbell or dashcampushes RTMP to the server OpenCCTV Docker · Linux · macOS · Windows go2rtclive view: WebRTC, HLS, RTSP ffmpegrecording and motion detection rcloneupload and retention Web UIAPI, pairing, gateway · :8080 Local disk7 days Google Drive30 days S3 · SMB · SFTP …90 days iPhone and Android Browser:8080 via LAN, gateway or VPN Cameras stream to the OpenCCTV server, which records them and uploads to your storage; apps and browsers connect to the server over LAN, gateway or VPN YOUR CAMERASYOUR SERVERYOUR STORAGEYOUR DEVICES Tapo C210RTSP UniFi G4 ProProtect · RTSPS ReolinkONVIF · PTZ Doorbell or dashcampushes RTMP to the server OpenCCTV Docker · Linux · macOS · Windows go2rtclive view: WebRTC, HLS ffmpegrecording, motion rcloneupload, retention Web UI + API · :8080 Local disk Google Drive S3 · SMB · SFTP … iPhone, Android Browser via LAN, gateway or VPN
  1. Install the server

    Docker, or one binary on Linux, macOS or Windows that starts on its own. Open port 8080 in a browser and create the admin account.

  2. Add your cameras

    Pick the brand, enter the camera account, test, save. Or let discovery and the UniFi import do it for you.

  3. Choose where footage goes

    Local disk, Google Drive, S3, a NAS or FTP, each with its own retention in days.

  4. Pair your phone

    Scan the QR code from the web UI. Live view, timeline and push notifications work right away.

Remote access

Watch from anywhere. Open no ports.

Any OpenCCTV server can act as a gateway. Put one on a small VPS or in Coolify, link your home server once with a code, and the app reaches your cameras through an encrypted tunnel that your home server opens outbound.

  • No port forwarding, no DynDNS. Works behind CGNAT and LTE routers.
  • Several sites, one app. Home, office and the holiday flat behind one gateway.
  • Your gateway, not ours. It is the same open-source server, running on a machine you control.
  • Prefer a VPN? Tailscale, WireGuard or your router's VPN work too. The app only needs a URL.
The home server opens an outbound tunnel to a gateway on a VPS; the app connects to the gateway over HTTPS, so no ports are opened at home OpenCCTV gateway your VPS or Coolify YOUR HOME NETWORK no open ports Tapo UniFi Reolink OpenCCTV server records, uploads, stays home OpenCCTV app on LTE, anywhere outbound tunnel (wss) HTTPS
Storage

Footage goes where you decide.

Recordings land on the server's disk first. From there OpenCCTV uploads them to one or more targets and deletes them again after the number of days you set. Nothing is sent anywhere you did not configure.

  • Local diskAny folder, USB drive or mounted volume
  • Google DriveSign in once with your Google account
  • S3AWS, Backblaze B2, Wasabi, Cloudflare R2, MinIO
  • SMBWindows shares, Synology, QNAP
  • SFTPAny server you can SSH into
  • FTPIncluding routers like the FRITZ!Box
  • WebDAVNextcloud, ownCloud, Hetzner Storage Box
  • DropboxPersonal and business accounts
  • OneDrivePersonal and Microsoft 365
  • Several at onceFor example 7 days local, 30 in Drive, 90 in S3

Retention per target

Each target cleans up after itself. Keep a week on the server and three months offsite.

A disk that never fills up

Set a maximum size for local footage. The oldest recordings go first, optionally right after upload.

Playback from anywhere it lives

The timeline plays recordings from the local disk or streams them back from remote storage.

Quick start

Running in a minute.

Pick one. Each starts the server on port 8080 and keeps all data in one place: the opencctv volume in Docker, ~/.opencctv on Linux and macOS, %APPDATA%\OpenCCTV on Windows.

Dockerrecommended

docker run -d --name opencctv --restart unless-stopped --network host -v opencctv:/data ghcr.io/codextde/opencctv:latest

Linux and macOS

curl -fsSL https://opencctv.codext.de/install.sh | sh

WindowsPowerShell

irm https://opencctv.codext.de/install.ps1 | iex

Docker Composealso works as a Coolify resource

services:
  opencctv:
    image: ghcr.io/codextde/opencctv:latest
    restart: unless-stopped
    network_mode: host
    volumes:
      - opencctv:/data
volumes:
  opencctv:
  1. Open http://<server-ip>:8080 and create the admin account.
  2. Add cameras. Choose the brand, enter the camera's login, test and save.
  3. Install the app and scan the pairing QR code under Users & devices.

Host networking lets ONVIF discovery and WebRTC work without port mappings. The installers download the latest release from GitHub and set it up to start automatically with systemd, launchd or the Windows Task Scheduler. Read install.sh or install.ps1 before you run them.

FAQ

Questions self-hosters ask.

My Tapo camera has no SD card. Does it work?

Yes. OpenCCTV records the camera's live stream, so neither an SD card nor Tapo Care is needed. You only have to create a camera account once:

  1. In the Tapo app, open the camera and tap the gear icon.
  2. Go to Advanced Settings, then Camera Account, and set a username and password. This is not your TP-Link ID.
  3. In OpenCCTV, add a camera, choose TP-Link Tapo and enter the IP address and that account.

PTZ models like the C200, C210 and C500 are controlled over ONVIF. For two-way audio, optionally add your TP-Link cloud password.

Is it really free?

Yes. The server and the apps are open source under the MIT license. There is no paid tier, no camera limit and no feature behind a paywall. You pay only for the hardware and the storage you choose. Codext GmbH builds OpenCCTV in the open on GitHub; issues and pull requests are welcome.

Does video leave my network?

Only to the storage targets you configure and to your own devices when you watch. There is no OpenCCTV cloud. Codext receives no video, no snapshots and no metadata.

If you turn on push notifications, your server sends the notification (camera name and time) through Expo's push service to Apple or Google so it can reach your phone. Snapshots and video are not part of it.

How do I watch my cameras when I'm away?

Two options, neither needs port forwarding:

  • Gateway: run a second OpenCCTV on a VPS or in Coolify and link your home server to it. The home server keeps an outbound tunnel open; the app connects to the gateway.
  • VPN: Tailscale, WireGuard or your router's VPN. Add the server's VPN address in the app.

A reverse proxy with HTTPS in front of the server works as well, if you prefer to open a port.

Which cameras are supported?

Anything that offers RTSP, RTSPS, ONVIF, HTTP MJPEG or can push RTMP/RTSP. The brands listed above have presets that fill in stream paths for you. Cloud-only cameras such as Ring, Arlo, Blink or Nest do not offer a local stream and do not work. Some battery cameras only stream while RTSP is active and drain faster.

What hardware do I need?

Any always-on x64 or ARM64 machine with enough disk. Because recordings are stored without re-encoding and motion detection looks at a small, low-frame-rate copy of the stream, the CPU load per camera is low.

For disk space, a 2K camera at about 2 Mbit/s needs roughly 21 GB per day of 24/7 recording. Motion-only recording usually needs a fraction of that.

Can I keep using UniFi Protect?

Yes. The import logs into your console, enables RTSP on the cameras and adds them to OpenCCTV. Protect keeps working; OpenCCTV simply records a second copy where you want it, for example in Google Drive or S3, and gives you an app that works without a Ubiquiti account.

Do I need an account with you?

No. You create the admin account on your own server. The apps store only the address of your server and an access token on the phone. We do not know who uses OpenCCTV.

More answers on the support page.

See it before you install it.

The demo server runs several cameras with real recordings and motion events. Log in with demo / demo, or point the app at it.