Settings
Settings are stored per profile. Each ZoneMinder server profile has its own independent settings.
Appearance
Setting |
Description |
|---|---|
Language |
Interface language (English, German, Spanish, French, Chinese) |
Theme |
Light, Cream, Dark, Slate, Amber, or System (follows system setting by default). The quick toggle is in the sidebar; see Getting Started. |
Date format |
How dates are displayed throughout the app |
Time format |
12-hour or 24-hour clock |
TV mode |
Larger touch targets and D-pad/remote navigation for TV and set-top devices. See TV mode. |
Thumbnail display |
Order of frame types to try when loading event thumbnails |
Hover preview |
Where an enlarged live or event preview appears on hover (long-press on mobile). See Hover preview. |
Thumbnail display
Event thumbnails can come from different frame types in ZoneMinder: alarm (first alarmed frame), snapshot (representative frame), objdetect (object-detection frame from zmeventnotification), or a custom frame ID. Different ZoneMinder setups populate different frame types depending on motion and ML configuration, so a single fixed choice leaves some users with missing images.
The Thumbnail display setting lets you pick the order in which the app tries each frame type. Each row has a drag position (up/down arrows), an enable toggle, and the frame type label. The last row is a custom slot where you can type any frame ID your setup uses (for example 1 for the first frame). Disabled rows and empty custom rows are skipped.
When a thumbnail loads successfully, the winning frame type is cached for the session so the app doesn’t re-try earlier entries for the same event. If every entry fails, a placeholder image is shown. At no point does the app flash a broken-image icon, the thumbnail area stays blank until a frame succeeds or the chain is exhausted.
The setting applies to every thumbnail surface in the app: events list, event montage, event detail hero, timeline scrubber, timeline preview popover, and notification history.
TV mode
TV mode adapts the interface for televisions and set-top boxes (for example Fire TV or Android TV). It enlarges touch targets and enables D-pad and remote navigation, so you can move focus and select with a remote instead of a pointer. Turn it on when running zmNinjaNg on a TV; leave it off on phones, tablets, and desktops.
Hover preview
Hover preview enlarges a feed or event in place when you hover over it on desktop, or long-press it on mobile. Each surface has its own toggle, so you can enable previews only where you want them:
Events list and Events grid
Monitors list and Monitors grid
Dashboard
Timeline
Notifications
The playback speed control (0.5x, 1x, 1.5x, 2x, 4x) sets how fast an event preview plays. Live monitor previews open a fresh stream while the preview is on screen and close it when you move away.
Bandwidth Settings
Control how often the app fetches data. Useful on mobile data or slow connections.
Mode |
Description |
|---|---|
Normal |
Standard refresh intervals (10–30s depending on the data type) |
Low |
Reduced refresh rates (2x slower) and lower image quality |
Low bandwidth mode affects:
Monitor snapshot refresh rate
Dashboard widget refresh intervals
Event list polling
Timeline/heatmap data loading
Image quality and scale
Tip
Switch to Low bandwidth mode when on mobile data or a slow connection. You can switch back to Normal when on WiFi.
Live Streaming
Settings that control live camera feeds:
Setting |
Description |
|---|---|
Streaming Mode |
Streaming delivers continuous video. Snapshot fetches a periodic still image instead, lower bandwidth, lower frame rate. See Streaming Mode below for where this setting applies. |
Enable Go2RTC |
When on, the app tries WebRTC/MSE/HLS for each monitor and falls back to MJPEG. When off, all monitors use MJPEG. |
Streaming Protocols |
WebRTC, MSE, and HLS, tried in parallel when Go2RTC is configured. The first protocol to produce video wins. |
Snapshot interval |
How often to refresh the still image when Streaming Mode is set to Snapshot (1–30 seconds) |
Protocol Label |
Shows or hides the streaming protocol indicator (MJPEG/MSE/WebRTC) on video feeds across all pages |
Stream FPS |
Maximum frame rate for live MJPEG streams (1–30 fps, default 10; presets 5/10/15/30). Lower values reduce bandwidth and CPU. |
Stream Scale |
Server-side scaling applied to MJPEG frames before they are sent (10–100%, default 50; presets 25/50/75/100). Lower values reduce bandwidth. |
Switching to Low bandwidth mode resets Stream FPS, Stream Scale, and Snapshot interval to lower defaults.
Streaming Protocols
When Go2RTC is enabled, zmNinjaNg tries WebRTC, MSE, and HLS in parallel. The first protocol to produce video wins and is used for the stream. If all Go2RTC protocols fail, the app falls back to MJPEG via ZoneMinder’s ZMS. The protocol label (when enabled) shows which protocol is active on each feed.
You can configure which protocols to try in the Go2RTC protocol settings.
Streaming Mode
The Streaming Mode toggle picks how live MJPEG feeds are fetched:
Streaming: continuous MJPEG over a single open connection at the configured FPS. Smooth motion, higher bandwidth and CPU.
Snapshot: a single JPEG fetched every Snapshot interval seconds. Lower bandwidth and CPU, choppier motion.
Streaming Mode interacts with the streaming protocol layer. When a monitor uses Go2RTC (WebRTC/MSE/HLS), it always delivers continuous video, the Streaming Mode setting is ignored for that monitor. The setting only changes behavior on the MJPEG path: either when Go2RTC is disabled globally, when it is disabled per-monitor, or when Go2RTC fails and the app falls back to MJPEG.
Default per device
A new profile picks a default based on the platform:
Phone, tablet, and web app: default is Snapshot. The browser or app webview holds only about 6 live connections open to one server at a time, so a montage full of Streaming tiles stalls after the first few. Snapshot mode fetches a still on an interval instead of holding a connection, so every tile keeps updating no matter how many cameras are on screen.
Desktop app: default is Streaming. The desktop app reads each MJPEG feed natively rather than through the webview, so the per-server connection limit does not apply and a montage can stream many cameras at once.
Changing the Streaming Mode toggle overrides the default for that profile.
Connection limits by platform
How a live MJPEG feed reaches the screen differs by platform, and that decides whether the per-server stream limit applies:
Platform |
How live feeds load |
~6 simultaneous live streams limit? |
|---|---|---|
Web browser |
Loaded directly from ZoneMinder by the browser |
Yes, about 6 per server |
Android |
Loaded directly through the app WebView |
Yes, about 6 per server |
iOS / iPadOS |
Loaded directly through the app WebView |
Yes, about 6 per server |
Desktop (Windows, macOS, Linux) |
Read natively by the app, not through the webview |
No limit |
Note
On iOS, Android, and the web app, a ZoneMinder server keeps only about 6 live streams open at a time, so a montage with more than ~6 live tiles stalls after the first few. To show more than 6 live feeds at once, either keep Snapshot mode (the default on these platforms, which fetches a still on an interval instead of holding a connection) or enable multi-port streaming on the server by setting ZM_MIN_STREAMING_PORT. That spreads each camera across a different port, so the limit no longer applies. On desktop the app reads feeds natively, so this limit never applies. See Multi-Server.
Where Streaming Mode applies
View |
Affected? |
Behavior |
|---|---|---|
Monitors list (grid/list of tiles) |
Yes |
Each tile honors the global setting. WebRTC tiles always stream; MJPEG tiles follow Streaming Mode. |
Montage page |
Yes |
Same as Monitors list, per-tile behavior. |
Dashboard monitor widgets |
Yes |
Each widget honors the global setting. |
Monitor Detail page (single monitor view) |
No, always streams |
This page ignores Streaming Mode and always uses continuous video. The stream is closed ( |
Hover-preview popovers (over a monitor card) |
No, always streams |
Hardcoded to streaming for the brief time the popover is open. |
Event playback (Event Detail, Timeline previews) |
Not applicable |
These play recorded video, not live feeds. |
Notification thumbnails |
Not applicable |
Static event images, not live streams. |
Why Monitor Detail always streams
You opened one camera deliberately, so the bandwidth tradeoff that justifies Snapshot mode in dense grids does not apply. The page also tears the stream down on exit, so honoring snapshot mode here would just add latency without saving bandwidth.
Per-Monitor Streaming Override
The global Go2RTC setting acts as the default for all monitors. To override it for a single monitor, open the monitor’s Settings dialog (Video tab). When a monitor has Go2RTC enabled, a Go2RTC toggle appears. Turning it off forces MJPEG for that monitor only, leaving other monitors unaffected.
Playback
Settings that affect event video playback and dashboard refresh:
Setting |
Description |
|---|---|
Event autoplay |
Start video playback automatically when opening the Event Detail page |
Events per page |
How many events to load per page on the Events screen (10–1000, presets at 100/300/500) |
Dashboard refresh interval |
How often the dashboard widgets reload data (5–300 seconds, presets at 10/30/60) |
Notification Settings
Configure how zmNinjaNg handles event notifications. See Notifications for details.
Advanced
The Advanced section is a single flat section containing the following controls (no subsection headings in the UI):
Setting |
Description |
|---|---|
Allow self-signed certificates |
Shown only when the Portal URL uses HTTPS. Enable when your ZoneMinder server uses a self-signed certificate. On native platforms (iOS/Android/desktop) the app pins the certificate fingerprint on first connection; toggling this off and back on lets you re-pin. |
Disable log redaction |
Stop redacting URLs and credentials from logs. Enable only temporarily when sharing logs for troubleshooting. |
Auto-restart (desktop only) |
The desktop app’s webview accumulates memory over long sessions that only a restart reclaims, so this is on by default: it restarts the app automatically on an interval, in minutes (default 120, minimum 1). Turn it off to disable. A Restart now button next to it restarts immediately. The window size and position are preserved across the restart. |
Component Logs (collapsible) |
Sets the global log level (the floor for everything) and per-component overrides. Includes a Reset button to clear all per-component overrides. |
For information about persistent log files, file locations, and the Share / Open / Clear buttons, see Logs.
Kiosk PIN
Manage the PIN used to lock and unlock kiosk mode. See Kiosk Mode for full details on kiosk mode.
Action |
Description |
|---|---|
Set PIN |
Appears when no PIN is stored. Sets a new 4-digit PIN. |
Change PIN |
Requires verifying your current PIN or biometrics before setting a new one. |
Clear PIN |
Removes the PIN. Requires verifying the current PIN or biometrics first. |
Multi-Server
zmNinjaNg detects multi-server ZoneMinder setups via the /servers.json API endpoint. Single-server setups are unaffected.
In a multi-server setup:
Each monitor’s ServerId is mapped to the correct server for streaming, daemon checks, and event images
All API calls, ZMS streams, and portal URLs route to the appropriate server
Multi-port streaming (
ZM_MIN_STREAMING_PORT) is automatically applied to per-monitor URLs
For the full Server page (version, load, disk usage, daemon state, per-server metrics, storage areas, and run-state control), see Server.