Viseron
Self-hosted, local-only NVR and AI computer vision software
Alternative to: ring, nest, wyze
v3.5.0
2026-03-25The main highlights of this release are camera tuning in the frontend, manual recordings, and improved MQTT support. Additionally, there are various performance optimizations and fixes.
Breaking changes
CUDA has been upgraded to 12.9.1.
If you run the roflcoopter/amd64-cuda-viseron image, it may cause compatibility issues if you are using an older version on your system. Please make sure to update your host if you experience any issues.
New features
Camera tuning
Camera tuning allows you to adjust various settings of a camera directly in the frontend.
Not all options are available yet but that is the long-term plan.
Another welcome change to this feature is that you can now draw masks directly in the frontend, instead of having to use external tools to generate the masks and then pasting it into the config.yaml. This makes it much easier to set up motion detection areas and ignore areas.
Note that you still need to restart Viseron after changing the settings for the changes to take effect. The next release will include hot reloading of all settings to make this process more seamless. Most code is already in place for this but it has not been exposed to the frontend properly yet. Documentation on this feature can be found here
A big shoutout to @kaburagisec who contributed the camera tuning!
Manual recordings
You can now start and stop recordings manually from the frontend, via MQTT and through Telegram.
Visual feedback is provided when a recording is ongoing as well.
Documentation on this feature can be found here
Camera toggle in frontend
There is now a camera toggle in the frontend to stop/start cameras on-demand:
Profile page
A new profile page has been added to the frontend where users can set their preferences for the frontend.
This currently only supports setting the users display name and timezone but will be expanded in the future to include more settings like language and date format.
Other notable features
- External DB support for PostgreSQL. Documentation is available here
- New config option
base_topicformqttto set the base topic for all MQTT messages. Still defaults to the valueclient_idif not set. - New config option
publish_states_on_reconnect(default: true) formqttto control if MQTT state messages should be re-published on reconnect. This is useful to not miss state updates that happened during downtime or if using an MQTT broker that does not persist messages. - New config option
publish_ha_config_on_reconnect(default: false) formqttto control if Home Assistant MQTT discovery config messages should be re-published on reconnect. This is useful if using an MQTT broker that does not persist messages. - MJPEG camera sources are now automatically transcoded to be compatible with HLS streaming.
Changes
- Ruamel YAML is now used for parsing the configuration file instead of PyYAML. This allows for preserving comments and formatting in the config file.
- Recordings on the Recordings pages are now using HLS.js for playback instead of Video.js. This improves compatibility across browsers and devices, and provides a more uniform playback experience.
- Uses
default_entity_idinmqttinstead ofobject_idwhen publishing Home Assistant MQTT discovery messages, since the latter is deprecated.
Fixes
- Fixes an issue where multiple API calls were re-fetching the same data unnecessarily, improving performance.
- Camera segment fragmenter no longer runs for stopped cameras, reducing CPU usage.
- Fixes a problem where cameras that were disconnected never properly reconnected. Closes #1164
- Fixes a problem where the segment process that is spawned when using a substream was not monitored correctly, leading to missing recordings in case of crashes. Closes #1215
- Upgrades HLS.js to version 1.6.15, which includes a fix to #1106
- Fixes segmentation faults on some models for the YOLO component
mog2motion detector no longer triggers motion during startup.
Developer experience
- Framework for generating screenshots for documentation added, using Playwright
- Slight changes to the developer environment setup instructions for VS Code
Docker images will be on Docker Hub shortly
All changes
- YOLO component documentation now indicates model_path is required by @john- in https://github.com/roflcoopter/viseron/pull/1170
- Manual recordings by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1172
- Master by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1183
- Feature/dev container install docs by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1186
- use ruamel instead of PyYAML by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1187
- Add Camera Tuning Implementation (Tuning Interface, Zone/Mask Drawer Tool, Labels Editor, OSD Texts, and Miscellaneous UI) by @kaburagisec in https://github.com/roflcoopter/viseron/pull/1165
- Playwright screenshot updater by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1189
- fix syntax in mqtt docs by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1190
- Start manual recording via live player by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1193
- set max-old-space-size in azure builds to avoid out of memory issues by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1195
- Frontend performance improvements (session expiry, onboarding, useEffect’s) by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1196
- support using an external postgres database by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1197
- Start and stop cameras from frontend by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1198
- add manual recording button to MJPEG player by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1199
- improve ffmpeg camera stopping mechanism by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1200
- ignore fragmenting commands when camera is stopped by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1201
- add docs on live player context menu by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1203
- add recreate_db script by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1204
- replace object_id with default_entity_id for home assistant MQTT entities by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1208
- User profile page by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1211
- Several Frontend Refactoring by @kaburagisec in https://github.com/roflcoopter/viseron/pull/1212
- Feature/ffmpeg segments monitor by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1215
- feat(mqtt): publish states on broker reconnect by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1216
- feat(mqtt): allow setting base_topic directly by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1217
- Remove VideoJS by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1219
- feat(ui): upgrade hls.js to 1.6.15 by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1221
- refactor(ui): fix all circular dependencies by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1222
- fix(api/hls): track target duration for hls client by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1223
- Support iOS Fullscreen for new recordings player by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1224
- refator(backend): remove all direct usage of DataStream by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1230
- Update YOLO component Ultralytics library to v8.4.2 by @john- in https://github.com/roflcoopter/viseron/pull/1229
- feat(motion_detector): add unload support by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1232
- refactor(backend): add domain registry by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1233
- refactor(backend): keep track of entity owner component/domain by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1234
- refactor(backend): start using DomainRegistry by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1237
- refactor(backend): prepare for full typing of vis.data by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1239
- fix(domains): make registered domain event publish EventData by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1240
- Domain unload functionality by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1241
- feat(domains): add method to reload domains and dependencies by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1245
- Test cases for yolo component by @john- in https://github.com/roflcoopter/viseron/pull/1243
- Introduce setup_domains for components by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1246
- feat(nvr): prepare nvr for config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1250
- feat(object_detector): prepare object detector for config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1251
- Config diffing by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1252
- fix(domains): cancel retries using a threading event by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1253
- feat(tests): update pytest to 9.0.2 by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1254
- feat(tests): add test suite for component setup by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1256
- Config reload orchestrator by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1257
- Pylint changes by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1260
- Config reload support for camera domain by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1266
- fix(reload): make sure failed deps are reloaded when an identifier is added by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1267
- Support reloading for all domain base classes by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1268
- fix(reload): reload deps of newly added identifiers by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1269
- feat(compreface): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1271
- feat(darknet): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1272
- Discord reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1273
- feat(gstreamer): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1276
- feat(dlib): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1275
- feat(hailo): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1279
- feat(go2rtc): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1281
- feat(gotify): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1282
- feat(ffmpeg): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1280
- fix(ffmpeg) auto transcode to h264 for mjpeg sources by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1283
- fix(ffmpeg): handle UNDEFINED in encoder_tuning_args by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1285
- fix(ffmpeg): add stdin to RestartablePopen calls by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1286
- feat(mqtt): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1287
- fix(mog2): avoid triggering motion on first frame by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1288
- fix(nvr): correctly log first frame and typing updates by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1289
- fix(yolo): fix segmentation fault for some models by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1290
- feat(webhook): support config reload by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1292
- feat(reload): changes to default components require restart by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1293
- feat(docker): upgrade cuda to 12.9.1 by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1294
- feat(docs): add docs on camera arm/disarm toggle by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1295
- feat(docs): add profle page screenshot by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1296
- feat(docs): add basic camera tuning docs by @roflcoopter in https://github.com/roflcoopter/viseron/pull/1298
Full Changelog: https://github.com/roflcoopter/viseron/compare/v3.4.1…v3.5.0