This release adds 1 notable feature for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+1 more
Summary
AI summaryUpdates π οΈ What's Changed, π VibeNVR v1.29.6, and OpenCV across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Low |
Live view camera tile shows three distinct recording states with appropriate badges. Live view camera tile shows three distinct recording states with appropriate badges. Source: llm_adapter@2026-05-31 Confidence: high |
β |
| Feature | Low |
`SAVING REC` badge string fully localized in all 10 supported locales. `SAVING REC` badge string fully localized in all 10 supported locales. Source: llm_adapter@2026-05-31 Confidence: high |
β |
| Feature | Low |
Ukrainian (`uk`) locale fully added, enabling Ukrainian language support. Ukrainian (`uk`) locale fully added, enabling Ukrainian language support. Source: llm_adapter@2026-05-31 Confidence: high |
β |
| Bugfix | Medium |
Timezone handling now respects TZ env var across all Docker services. Timezone handling now respects TZ env var across all Docker services. Source: llm_adapter@2026-05-31 Confidence: high |
β |
| Bugfix | Medium |
Motion badge no longer sticks after disabling/re-enabling a camera with active motion. Motion badge no longer sticks after disabling/re-enabling a camera with active motion. Source: llm_adapter@2026-05-31 Confidence: low |
β |
| Bugfix | Low |
Crash in Logs settings panel fixed for nonβEnglish locales by adding missing `t()` wrapper. Crash in Logs settings panel fixed for nonβEnglish locales by adding missing `t()` wrapper. Source: llm_adapter@2026-05-31 Confidence: low |
β |
Full changelog
π VibeNVR v1.29.6
π Summary
This release delivers a set of focused but impactful improvements to the reliability and clarity of the live monitoring experience. The motion detection pipeline has been hardened against stale state bugs, the UI now communicates the full recording lifecycle with precision, and timezone handling has been made universally correct across all services.
π οΈ What's Changed
π Timezone Consistency β All Docker Services
Previously, the backend and engine services had a hardcoded TZ=Europe/Rome environment variable, silently ignoring any custom timezone set via .env. This caused frame overlays, timeline event entries, and recording filenames to be stamped in the wrong local time for any user outside Italy.
Fix: All four Docker services (backend, engine, frontend, db) now use the dynamic form TZ=${TZ:-Europe/Rome}, which respects the value in .env while keeping Europe/Rome as the safe default. Existing setups are unaffected.
π‘οΈ Motion Badge Reliability β No More Stuck Badges
A stale-state bug caused the AI: PERSON or MOTION badge on the live camera card to persist indefinitely after disabling and re-enabling a camera while a motion event was still active. The root cause was entries being added to the backend's in-memory LIVE_MOTION dict on motion_on events but never cleaned up on camera stop.
Three independent fixes have been applied to make the system resilient at every layer:
-
TTL Guard (Backend β
routers/events.py): Everymotion_onevent now stores a_updated_attimestamp. The/events/statusroute checks this on every poll and automatically evicts anyLIVE_MOTIONentry older than 60 seconds. This acts as a safety net if themotion_endevent is ever missed (e.g., due to a container crash). -
Instant Cleanup on Camera Stop (Backend β
motion_service.py): Thestop_camera()function now immediately removes the camera's entry fromLIVE_MOTIONafter sending the stop signal to the engine. The badge disappears the instant you toggle the camera off, with no delay. -
Engine State Reset on Detection Switch (Engine β
camera_thread.py): When the active detection engine is changed at runtime (e.g., switching fromOpenCVtoAI Enginein camera settings), if a motion event was already in progress, the engine now fires a syntheticmotion_endevent before handing off to the new engine. This prevents the new engine from inheriting stale motion state and ensures a clean transition.
π¨ Live View β Three-State Recording Badge
The live camera tile previously used a single red pulsing badge for all active states. This made it impossible to distinguish between an active detection event and the post-capture recording cooldown (where the motion has ended but the video file is still being written to disk).
The UI now exposes three distinct visual states:
| State | Visual | Badge Text | Meaning |
|---|---|---|---|
| Active Motion (OpenCV) | π΄ Pulsing red border + badge | MOTION | Background subtraction has detected movement |
| Active Motion (AI Engine) | π΄ Pulsing red border + badge | AI: PERSON (or detected label) | YOLO model has identified an object |
| Finalizing Recording | π Solid orange border + badge | SAVING REC | Motion ended, post-capture buffer writing to disk |
| Continuous Mode | π΅ Solid blue border + badge | CONTINUOUS | Always-on recording, no motion trigger required |
The transition is now: AI: PERSON β (you leave frame) β SAVING REC β (file finalized) β badge disappears.
π Localization
The new SAVING REC badge string has been fully localized. The extract_t.py and auto_translate.py scripts were run to propagate the translation key timeline.saving_rec to all 10 supported locale files:
EN Β· IT Β· FR Β· DE Β· ES Β· PT Β· ZH Β· JA Β· UK Β· RU
π Contributors
A big thank you to the following community contributors whose work is included in this release:
- @Lion-killer (Yuriy Bilous)
- PR #34 β Fixed a runtime crash caused by a missing
t()translation wrapper inLogSettingsModal, which would cause the Logs settings panel to fail to render in non-English locales. @Lion-killer in https://github.com/spupuz/VibeNVR/pull/34 - PR #29 β Contributed the complete Ukrainian (
uk) locale translation, adding full language support for Ukrainian-speaking users. @Lion-killer in https://github.com/spupuz/VibeNVR/pull/29
- PR #34 β Fixed a runtime crash caused by a missing
β¬οΈ Upgrade Notes
No database migrations or configuration changes are required for this release.
If you have set a custom TZ value in your .env file, it will now be correctly applied to all services automatically after the next rebuild.
docker compose down && docker compose up -d --build (only for dev environment)
## New Contributors
* @Lion-killer made their first contribution in https://github.com/spupuz/VibeNVR/pull/29
**Full Changelog**: https://github.com/spupuz/VibeNVR/compare/v1.29.5...v1.29.6
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About spupuz/VibeNVR
All releases βRelated context
Related tools
Earlier breaking changes
- v1.28.3 Must update docker-compose.yml with TZ variable for all services
Beta — feedback welcome: [email protected]