Updated : 2018-09-11 10:07 AM

In earlier revisions of this article I mentioned the arrogance of the ZM developers in detail but later removed it because I felt they had made some progress with their interpersonal skills. It turns out I was wrong. So a few details have been added to better illustrate why I couldn't use ZoneMinder.

Before Reading

Please be aware this is all based on my experiences with ZoneMinder. Much of this can be seen as just an opinion. Whether it's a good one or not is up to you.

Firstly, Why does ZoneMinder matter to me?

I want to make a world class CCTV platform. One that anyone can use. I scoured the internet for months for a place to start and only finding ZoneMinder as the answer over and over. Even my own brother was suggesting it. After using it and studying the code for 2+ years I was met with frustration. Developer arrogance coupled with poorly written code.

In short I spent a lot of time and energy on something that didn't work and It frustrated me.

MJPEG streams are outdated

With MJPEG you are opening a new stream every time you create an image with an MJPEG url. Even if you remove this element it will continue to eat resources from the server and client. Only way to deal with it currently is through an iframe, popup, or hard refresh.

Shinobi addresses this with Websocket streams. As frames are captured by FFMPEG they are base64 encoded and sent to the client. Shinobi can also output HLS (m3u8), MJPEG (in an iframe), and JPEG (on a timer).

MJPEG streams are limited in many browsers. About 6-8 Streams maximum. Unless you turn off this limitation in the browsers settings, but of course mobile doesn't normally have this option exposed to users.

In Shinobi you don't have to worry about that with Bas64 or JPEG streams you can trick the browser into just letting you do it anyway. Base64 is technically using 1 pipe to the client, the Websocket. While JPEG is just refreshing an image on a timer.

JPEG Storage is awful

Saving each frame as a separate file in JPEG format can have a seriously detrimental effect on storage space and the hardware itself.

Shinobi saves to WebM and MP4 files. While MP4 takes a fair amount of space.. its level of CPU usage during encoding for H.264 streams is just amazing.

Using too many languages

The platform uses Perl, PHP, JavaScript, C++, HTML, CSS, MySQL, and probably more. This makes it difficult to modify the code for other purposes.

Shinobi uses JavaScript, HTML, CSS, and MySQL. Simple right? It should be.

Outdated methods

While connected to the dashboard it will query the database for events every few minutes, continuously getting/counting the same events over and over.

Shinobi uses Websockets to get real-time data about Videos and Events.

For every camera a new process is created every time a viewer opens a stream. 1 Stream = 1 Process. So if you had 1 Camera with 3 Streams open, you would have 3 processes active for each viewer.

Shinobi uses 1 process per camera for all viewers.

Multiple windows and pages for simple things. For example the monitor settings window. It has multiple pages. Even though each page has a fixed set of options, all inputs are present on the page. They are just hidden. If they were going to do that they may as well have made it use JavaScript to show and hide fields appropriately. Rather than send a request to the server on each page change.

Shinobi has it all in one window, which is loaded on dashboard load. The fields are populated based on the camera selection. Even then the camera details are stored in the memory of the client browser to easily load data without an additional request to the server.

As mentioned previously ZoneMinder uses Perl, PHP and C++. These languages are powerful, no doubt. The issue is in their use. C++ will require building of components, which makes updating a pain. PHP is fully synchronous, which makes client operations a pain for you and for the system it runs on.

Shinobi uses JavaScript, this allows users to simply overwrite the older Shinobi files with the new ones, restart the processes and you are updated. Since JavaScript is asynchronous and has the ability to pipe data, we are left with little overhead when it actually comes to the node application itself.

Telemetry (Remote User Tracking)

Quoted from the source code "This script collects usage information of the local system and sends it to the ZoneMinder development team. This data will be used to determine things like who and where our customers are, how big their systems are, the underlying hardware and operating system, etc." - ZoneMinder/scripts/zmtelemetry.pl.in

You can turn this feature off. Although it should have never been made in the first place or at least turned off by default. From a developer standpoint this a great idea but some people may not like their information being logged somewhere to be possibly stolen then used maliciously. Paranoid? perhaps. All that matters is there are a few who don't want it and may not realize it is there. We don't know if other parts of the code are sending other kinds of data. To even wonder is a bother. Shinobi has no such integration and it never will.

The added issue to this being a third party controls this data. The original author is not the one who stores it. Literally anyone can become a core member of the platform tomorrow and leak all the information 10 minutes after that.

Update : It has been changed to off by default on 22/06/2018.
Commit : https://github.com/ZoneMinder/zoneminder/commit/422d2d6dbac0b985dbf01f30251329719379599f

Developer Arrogance

A major reason why I couldn't just push myself to fix everything I thought was wrong with ZM was the attitude of the developers.

From calling their userbase "suckers" to requesting payment for bug fixes.

Some might think "he's just joking". It means they are comfortable disparaging people who want to help others. If anything he should be telling people not to be that way in the community, instead he encourages it.

They also consistently tell people who ask about features or bugs that they won't do something unless they get paid. That's right, they avoid fixing bugs unless someone pays them to fix it or it suits their interests.

I understand needing to fund your efforts, possible future developments, or a full-blown family. That doesn't excuse the requirement of showing humility. If anything these are reasons one should be more willing to help.

Here is an encounter the lead developer had with just one user.

I wish to never become like them. I wish that no other person becomes like them.

I decided instead of just taking down ZoneMinder I would try to help them. Perhaps I'd learn a few things along the way.

But, No. Every suggestion I made, in my own name or username, would be shot down. Ideas like H.264 live streams in the browser right after they mentioned wanting to do it.

yes, they ignored the chance to have live H.264 streaming because I was the one who was willing to give the information.

They went as far as to censor my username from "moeiscool" to "moeisnotcool" and the name "Shinobi" to "ZoneMinder" on their forums. They said I was "spamming" but I was posting in the "Non-ZoneMinder" chat or talking in a private chat about a problem ZoneMinder had. Shinobi was mentioned in relation to what the discussion was about.

Definition of Spam : 
Irrelevant or inappropriate messages sent on the Internet to a large number of recipients. 

Irrelevant, No. Inappropriate, No.

They consider it spam because it doesn't suit their interests. With this behavior from core developers; people in the community have started to feel comfortable undermining others.

They can't even accept when they've done something wrong. A developer by the name of @asker created the mobile app zmNinja. He released it on the Google Play Store and started getting bad reviews because it didn't work for some people. He went to the ZM community chat and started talking about how it was me who was buying his app and leaving negative reviews.

I never bought the zmNinja app. I never reviewed it on the Google Play Store. I never reviewed it anywhere. Until now. I downloaded the source for zmNinja and tried it by loading it on my iPhone through Xcode. It didn't work so I deleted it. That is zmNinja to me. I am not a wealthy person. The fact that I didn't just pickup Blue Iris (or another well made app) should be evidence of that. Buying the zmNinja app just to undermine it would be a waste of money and a waste of time.

The bad reviews for ZoneMinder and related apps aren't something that started when I got mad at them and started Shinobi. It was, and is, happening on a regular basis. Shinobi gets bad reviews, It hurts at first but then you start to understand where they're coming from.

Quite honestly if the ZoneMinder developers weren't so obnoxious they could have had all of the effort I put into Shinobi. I'm not the only one, many people in the Shinobi community have expressed their desire to stay away from the ZoneMinder community for the very same reason. I wouldn't be surprised if the same sentiment is found in other communities.


In less than a year Shinobi has more than half the features of ZoneMinder. I'm not special or trained in programming, I learned at home - in my mom's basement. When someone cares about something they will give their time and effort for that. I care about Shinobi, that is why it has progressed so quickly.

Protect what is precious to you as you live long and prosper.

Learn more about Shinobi on the Why page.

See a comparison of features for ZoneMinder to Shinobi.