Open-source project
ZoneMinder/zoneminder avatar
ZoneMinder/zoneminder

ZoneMinder: a Linux CCTV stack you install from a package, not from source

ZoneMinder is a free, open source Closed-circuit television software application developed for Linux which supports IP, USB and Analog cameras.

5,941 stars1,310 forksPHPGPL-2.0

At a glance

What is it?
ZoneMinder is a GPL-2.0 camera capture, analysis and recording stack for Linux. Its own README tells you to install from a distro repository and discourages building from source, which shapes both the setup path and the upgrade cost.
Who is it for?
Adopt ZoneMinder if you already run Linux, your cameras speak V4L or ONVIF, and you are willing to install from a distro package rather than compile. Do not adopt it if you need a Windows host (the README describes a Linux application) or if you want a container path you can trust without reading the Dockerfile yourself, since the README says Docker work is still needed.
Can I use it commercially?
Yes, with conditions. GPL-2.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly PHP, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem ZoneMinder solves, and the people it is built for

ZoneMinder is an integrated set of applications for capture, analysis, recording and monitoring of CCTV and security cameras attached to a Linux machine. That sentence from the README is the whole scope. It is not a cloud service and not a camera vendor's app. It is the software layer between cameras and a disk, plus a web interface to watch and review what was recorded.

The intended user is someone with a Linux box and cameras that need to keep recording without a subscription. The README states it is designed for distributions supporting the Video For Linux (V4L) interface, and that it has been tested with cameras on BTTV cards, various USB cameras, and most IP network cameras. The topics list adds H.264 and H.265, so modern IP streams are in scope.

The practical consequence is that ZoneMinder assumes you own the host. You choose the disk, the retention policy and the network exposure. If you want a vendor to run the recording for you, this is the wrong category of product, not a worse version of the right one.

How ZoneMinder fits together: capture, analysis, recording, web

The README describes ZoneMinder as an integrated set of applications, and the repository layout supports that reading. The top level mixes src/, web/, db/, onvif/, scripts/, utils/ and conf.d/. These are separate concerns shipped in one tree: a compiled capture and analysis layer, a PHP web application, a database schema, and configuration shipped as files.

That split matters when something breaks. A camera that stops recording is a capture-layer problem. A page that will not load is a web or database problem. The two do not share a process, so you can diagnose them independently.

The repository also carries onvif/ at the top level, which is where ONVIF camera discovery and control live. The README does not document the ONVIF implementation in detail, so treat that directory as the place to look rather than as a documented feature. Similarly, conf.d/ and zm.conf.in indicate that runtime configuration is generated from templates at build or install time, not edited in place in the source tree.

The one architectural claim the README makes explicitly is about packaging: many configuration variable default values are not configurable at build time through autotools or cmake. That is why utils/zmeditconfigdata.sh exists. Package maintainers use it to change defaults in ConfigData.pm without patching source, and the README says it must be called from the root build folder before running cmake or configure. If you are not building a package, you can ignore this entirely.

Installing ZoneMinder from a package repository

The README calls the package repository the recommended install method. It lists maintained packages for Ubuntu via Isaac Connor's PPA, Debian from the default repository, RHEL/CentOS and clones plus Fedora via RPM Fusion, OpenSuse via a third party repository, Mageia from the default repository, Arch via the AUR, and Gentoo via Portage Overlays.

For Debian, the README points at the distribution's own package search rather than giving a command. It does not print an apt install line, so this article will not invent one. Follow the Debian package page the README links to, or the PPA page for Ubuntu.

After installation, the README says nothing about a first-run command, a service name, or a default login. It sends you to the online documentation at zoneminder.readthedocs.org for distro specific instructions. That is the honest answer: the README is a pointer, not a manual. Anyone who tells you the README explains first login is describing a different document.

If your distribution has no ZoneMinder package, the README's advice is to build your own package rather than build from source, and to adapt another distribution's package building instructions. It also recommends doing that work in a separate environment, a virtual machine, Docker or mock, because one mistake on a production server is expensive to undo.

Why the README discourages building from source

This is the most opinionated part of the README, and it is worth taking at face value. Historically, installation meant configure, make, make install. Every dependency had to be found and installed first. Init and logrotate scripts had to be copied into place by hand after the build. Optional components such as jscalendar and Cambozola had to be installed manually. Uninstalls could leave stale files behind, and those stale files could break the next upgrade. Upgrading meant repeating all of it.

The README's framing is that better methods exist and the current development team has worked to avoid source builds. That is not marketing language; it is a maintenance-cost argument. A source install puts the upgrade burden on you forever, and ZoneMinder ships releases on a steady cadence, with 1.38.4, 1.38.3 and 1.36.38 in the recent release list. Each of those is a moment where a hand-built tree has to be rebuilt correctly.

There is one narrow case where building is still the documented path: package maintainers. That is what utils/zmeditconfigdata.sh is for, and the README's example changes a default before the build runs:

bash
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes

This sets the ZM_OPT_CAMBOZOLA default to yes in ConfigData.pm without patching source, and the README notes it must run from the root build folder before cmake or configure. If you are not packaging ZoneMinder for a distribution, this command is not for you.

Docker support is present but the README says it is unfinished

The repository contains a Dockerfile, and the README says ZoneMinder and the ZM webserver will run using it. Then it adds a caveat in plain language: there is still work needed to ensure that the main ZM features work properly and are documented.

That is a meaningful limitation, not a footnote. It means the container path is not the supported path. The README separately notes that the Dockerfile has moved and that issues against it should be filed at the ZoneMinder/zmdockerfiles repository, so the file in this tree is not where container bugs are tracked.

If you want containers, read the Dockerfile in this repository and the zmdockerfiles repository before you plan a deployment around them. If you want the path the project itself recommends, use the distro package. The two are not equivalent, and the README is unusually direct about which one it stands behind.

Where ZoneMinder is the wrong tool

ZoneMinder is a Linux application. The README describes it as designed for distributions supporting V4L, and every install method it lists is a Linux distribution or a distribution repository. There is no Windows install path in the README. If your host is Windows, this project does not address your problem, and searching for a Windows build will not produce one from this material.

The second boundary is scale and operational appetite. ZoneMinder gives you a capture, analysis, recording and monitoring stack to run yourself. That includes the database, the web server, the storage and the upgrades. If you want a managed service with someone else to call when a camera drops offline, the self-hosted model is the mismatch, not any single feature.

The third boundary is documentation depth in the README itself. It does not document rollback, does not give a default login, does not name a service unit, and does not list supported camera models beyond the general categories. Everything specific lives at zoneminder.readthedocs.org, in the wiki, on the forums, or in Slack and Discord, which the README links at the top. Budget time for reading those, not just the README.

ZoneMinder compared with Frigate, and the honest difference

The comparison people search for is ZoneMinder versus Frigate, and the difference is not a feature checklist. It is the shape of the system.

ZoneMinder is a general CCTV platform. The README's scope is capture, analysis, recording and monitoring of any CCTV or security camera on Linux, with V4L as the interface and support for BTTV cards, USB cameras and most IP cameras. It carries its own database schema, a PHP web application, and a configuration system that packages can modify at build time. It is broad by design.

Frigate is not described anywhere in this repository, so this article will not characterize its internals. What can be said is the axis of choice: ZoneMinder asks you to run a full stack and gives you breadth across camera types and a long release history, including a maintained 1.36 line alongside 1.38. If your priority is a smaller, more narrowly scoped deployment, that is a different design goal, and you should evaluate it on its own documentation rather than on ZoneMinder's.

The practical test is your camera list. If your cameras are USB or analog capture cards on a Linux host, ZoneMinder's V4L heritage is the reason to pick it. If everything you own is an IP camera with ONVIF, both categories of tool are plausible and the decision moves to how much stack you want to operate.

Licence, upgrade cost and what to check before adopting

ZoneMinder is licensed under GPL-2.0, and the repository carries both COPYING and LICENSE files. For most self-hosters this changes nothing day to day: you can run it, modify it and redistribute it under the same terms. It matters if you intend to embed ZoneMinder in a product or ship a modified version without publishing source, because the GPL-2.0 obligations travel with the code. That is a description of the licence, not legal advice; talk to a lawyer about your specific distribution plan.

Upgrade cost is the more immediate concern. The project ships releases regularly, and the README's source-build history is a list of exactly the things that go wrong when upgrades are manual. Installing from a distro repository moves that work to the package maintainer. The trade-off is that your ZoneMinder version is tied to your distribution's packaging schedule, so a distro that lags will keep you on an older release than the 1.38.4 published on 2026-08-11.

The last push to the repository was on 2026-09-22, and the repository is not archived. That is the only maintenance signal available here; the README does not publish a support policy or an end-of-life schedule for the 1.36 line.

Before you adopt, verify your distribution has a package in the list the README gives, confirm your camera falls into the V4L, USB or IP categories it describes, and read the installation guide at zoneminder.readthedocs.org, since the README defers to it for distro specific steps.

Editorial conclusion

Adopt ZoneMinder if you already run Linux, your cameras speak V4L or ONVIF, and you are willing to install from a distro package rather than compile. Do not adopt it if you need a Windows host (the README describes a Linux application) or if you want a container path you can trust without reading the Dockerfile yourself, since the README says Docker work is still needed. Before you commit, verify three things: that your distro has a ZoneMinder package, that your camera model appears in the supported list, and where your events are stored, because retention is a disk budget decision you make on day one.

Frequently asked questions

Is ZoneMinder free?

Yes. The repository is licensed under GPL-2.0 and carries both COPYING and LICENSE files, and the README describes it as a free, open source application. There is no paid tier described in the README.

How do I install ZoneMinder on Ubuntu?

The README recommends installing from a package repository and points Ubuntu users at Isaac Connor's PPA. It does not give the exact repository command, deferring distro specific steps to the installation guide at zoneminder.readthedocs.org.

How do I install ZoneMinder on Debian?

The README lists Debian as a distribution that ships ZoneMinder in its default repository, and links to the Debian package search page for it. That makes the package path the recommended one rather than a source build.

Which IP cameras are compatible with ZoneMinder?

The README states ZoneMinder has been tested with cameras attached to BTTV cards, various USB cameras, and that it supports most IP network cameras. It does not publish a per-model compatibility list.

Does ZoneMinder run on Windows?

The README describes ZoneMinder as designed for Linux distributions that support the Video For Linux interface, and every install method it lists is a Linux distribution or distribution repository. No Windows install path appears in the README.

How do I access the ZoneMinder web interface?

The README does not describe the web interface URL or login. It directs all documentation to zoneminder.readthedocs.org, so that is where first-run setup and access would be described.

Official sources

  1. License: GPL-2.0
  2. Project website
  3. README
  4. Releases
  5. ZoneMinder/zoneminder on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/zoneminder-zoneminder.svg)](https://hysenlabs.com/projects/zoneminder-zoneminder)