Releases: spupuz/VibeNVR
v1.30.3
What's Changed
- fix(engine): honor "Motion Triggered" picture mode in the AI detection path by @Lion-killer in #49
Full Changelog: v1.30.2...v1.30.3
🚀 Release v1.30.3
📝 Summary
This patch release resolves a critical issue with the AI detection engine where the "Motion Triggered" snapshot configuration was not being respected, causing users with Passthrough recording to lose visibility into AI bounding boxes.
🛠️ Key Improvements
- 🛡️ Engine: Fixed a bug where the AI path ignored the
picture_recording_modesetting, always falling back to temporary snapshots. The AI engine now strictly honors the "Motion Triggered" setting, ensuring permanent snapshots are saved to the database with the AI bounding boxes clearly drawn.
🙌 Contributors
- @Lion-killer: Identified and fixed the AI motion snapshot bug, restoring feature parity with the OpenCV path.
v1.30.2
🚀 Release v1.30.2
📝 Summary
This release resolves a critical issue affecting transcoding loops. By importing a missing dependency, the backend ensures rock-solid stability during non-passthrough recordings and dynamic video frame resizing, providing a seamless experience even when hardware acceleration is unavailable.
🛠️ Key Improvements
- 🚀 Engine: Fixed a
NameErrorcrash related tocv2when therecording_managerfalls back to software transcoding and needs to accurately resize frames.
v1.30.1
🚀 Release v1.30.1
📝 Summary
This release introduces the highly anticipated native go2rtc integration directly within the VibeNVR engine. It acts as an internal gateway to transparently proxy RTSP streams, effectively bypassing connection limits and IP bans on consumer-grade cameras (like Tapo/TP-Link). We've also polished the UI localization and updated all documentation to reflect this architectural leap.
🛠️ Key Improvements
- 🚀 Engine & Architecture: Fully integrated
go2rtclifecycle management within the Engine. VibeNVR now auto-generates thego2rtc.yamlconfiguration and gracefully routes RTSP connections through the local proxy. - 🛡️ Resilience: Implemented robust proxy detection and enhanced logging in
stream_reader.pyto seamlessly distinguish between direct and proxy connections, avoiding hardware rate-limits. - 🎨 Aesthetics & UI: Added clear, localized UI terminology ("Network Proxy (go2rtc Gateway)") across all 8 supported languages to ensure users understand the gateway's function.
🙌 Contributors
- Юрій Білоус (Yurii Bilous): Original go2rtc stream gateway implementation.
- @spupuz: Core architecture review, integration refinements, and UI localization.
v1.30.0
Full Changelog: v1.29.8...v1.30.0
🚀 Release v1.30.0
📝 Summary
VibeNVR v1.30.0 is a milestone release that introduces our highly anticipated Granular Role-Based Access Control (RBAC). System administrators now have the precision to fine-tune Viewer accounts, explicitly granting or revoking the ability to view live feeds, replay historical events, or control PTZ cameras on a per-user and per-camera basis. This release also includes a beautiful redesign of the User Settings interface to support these powerful new capabilities intuitively.
🛠️ Key Improvements
- 🚀 Granular RBAC: Viewers can now be assigned specific VIEW, REPLAY, and CONTROL permissions via a flexible
camera_accessesmodel. - 🛡️ Security: Stricter endpoint validation ensures viewers can only access streams, frames, and events for cameras they are explicitly authorized for, strengthening the core security posture.
- 🎨 Aesthetics: The User Settings modal has been completely redesigned with a modern sticky layout, intuitive toggles, and responsive checkboxes tailored for mobile and desktop experiences.
VibeNVR v1.29.8
🚀 Release v1.29.8
📝 Summary
This patch introduces a critical stability fix for the AI engine (AI queue contention resolution), resolving a lock that occurred when multiple cameras made simultaneous inference requests. Additionally, it introduces Dynamic Resolution Scaling for the AI Overlay (OSD) to ensure bounding boxes and labels are always perfectly proportioned, regardless of the video stream resolution.
🛠️ Key Improvements
- 🚀 AI Queue Contention Resolution: Added a 200ms timeout to the AI queue submit lock to prevent watchdog loops and ensure safe frame dropping under extreme load.
- 🎨 Aesthetics: Implemented Dynamic Resolution Scaling for the AI OSD. Box thickness and font size now scale proportionally to the native frame resolution, eliminating the 'giant text' effect on low-resolution sub-streams.
- 🛡️ Stability: Fixed a backend crash during webhook processing caused by
N/Astrings returned byffprobeon incomplete video chunks.
v1.29.7
🚀 Release v1.29.7
📝 Summary
This patch release brings significant stability improvements to the recording engine, enhanced security for stream management, and polished dark-mode aesthetics for the frontend. We've introduced robust fallback mechanisms for AI passthrough and transcoder processes, ensuring continuous recording even under high-load or failure conditions. Additionally, new visual indicators and improved RTSP timeouts make managing cameras on slow networks more intuitive than ever.
🛠️ Key Improvements
- 🚀 Engine & Recording: Automatically restart recordings if the transcoder fallback crashes, and introduced AI Passthrough fallback safety with dynamic bounding boxes.
- 🚀 Streaming: Bumped RTSP connection timeouts to 30s to better support slow networks and VPN setups, while optimizing stream routing by removing the legacy
stream_urlschema. - 🛡️ Security: Masked RTSP passwords in stream connection error notifications to prevent credential leakage in logs, and fixed PostgreSQL array parsing for AI motion detection with pinned secure dependencies.
- 🎨 Aesthetics & UI: Display a distinct
DISABLEDstatus badge for inactive cameras, and cleared the internal health cache on camera stop to prevent stale green badges. Fully adapted Timeline and Live View dropdowns for dark-mode. - 📚 Documentation: Added comprehensive support and configuration instructions for Coral M.2 (PCIe) accelerators to the Wiki.
- 📦 Dependencies: Bumped
react-routerto v7.16.0.
🙌 Contributors
- @Lion-killer: Fixed UI dark-mode adaptation for overlay/transparent select dropdowns across the Timeline and Live View (#40).
- @app/dependabot: Bumped
react-routerdependency and resolved package-lock conflicts (#42).
Full Changelog: v1.29.6...v1.29.7
v1.29.6
🚀 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 #34 - PR #29 — Contributed the complete Ukrainian (
uk) locale translation, adding full language support for Ukrainian-speaking users. @Lion-killer in #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.6v1.29.5
Full Changelog: v1.29.4...v1.29.5
🚀 Release v1.29.5
📝 Summary
This release introduces native SOCKS/HTTPS Proxy support for Telegram notifications. We've engineered a resilient, asynchronous background system that allows your NVR to bypass network restrictions and deliver critical alerts reliably. To combat the instability of public proxies, the system includes a robust auto-retry mechanism that protects the core recording engine from timeouts.
🛠️ Key Improvements
- 🚀 Telegram Proxy Support: Full support for routing Telegram API requests through SOCKS5 or HTTPS proxies, ensuring notifications reach you even in strictly firewalled or regionally blocked environments.
- ⚙️ Intelligent Auto-Retry: Built-in background resilience. Users now have granular UI control over
Max RetriesandRetry Delay, allowing VibeNVR to silently retry failed proxy connections without dropping alerts or freezing the video engine. - 🛡️ Security & Stability: Hardened the Settings frontend against state-desync crashes, implemented strictly typed validation for proxy parameters, and passed all extensive RBAC isolation and Deep Roundtrip audits.
- 🌍 Internationalization (i18n): Automatically extracted and translated all new proxy configuration strings across 9 supported UI languages for global accessibility.
- 📚 Documentation Sync: Updated the integration guides with precise instructions for deploying notifications via proxy in restricted network environments.
v1.29.4
Full Changelog: v1.29.3...v1.29.4
🚀 Release v1.29.4
📝 Summary
This release focuses on bolstering our security posture and enhancing system resilience. We've introduced strict verification capabilities for SMTP connections, tightened the auditing mechanisms surrounding our backup infrastructure, and polished the internationalization (i18n) across the platform for a more seamless global experience.
🛠️ Key Improvements
- 🛡️ Security: Introduced
smtp_verify_certsetting to allow strict certificate validation during email transmissions, significantly reducing the risk of Man-in-the-Middle (MitM) attacks. - 🛡️ Security: Tightened the security and auditing protocols surrounding system backups to ensure data integrity and trackability.
- 🎨 Aesthetics: Polished internationalization (i18n) translations, ensuring a seamless and fully localized user interface.
v1.29.3
Full Changelog: v1.29.2...v1.29.3
🚀 Release v1.29.3
📝 Summary
This release introduces a highly requested quality-of-life feature: customizable drag-and-drop sorting for cameras! Users can now manually arrange the order of their cameras in both the Live View grid and the Settings manager, with the layout securely persisting in the database. Alongside this, the "Copy Settings" feature has been updated to protect your carefully arranged layouts from being unintentionally overwritten during bulk operations.
🛠️ Key Improvements
- 🚀 UI/UX: Drag-and-Drop Sorting. Visually arrange your camera feeds with a sleek new grab handle (
GripHorizontal). - 🛡️ Security: Admin-Only Reordering. The new
/api/cameras/reorderendpoint is strictly protected by RBAC to ensure Viewers cannot alter the master layout. - 🎨 Aesthetics: Polished the interaction states for the grab handles to ensure they don't overlap or distract from the video feed or selection checkboxes.
- ⚙️ Integrity: Excluded the
sort_orderattribute from the global "Copy Settings" logic to prevent layout corruption when cloning configurations across groups.