{"id":39156861,"url":"https://github.com/spupuz/vibenvr","last_synced_at":"2026-05-05T23:02:10.494Z","repository":{"id":332876095,"uuid":"1135290437","full_name":"spupuz/VibeNVR","owner":"spupuz","description":"Simple, privacy-respecting local NVR — fast setup, flexible recording, no cloud required","archived":false,"fork":false,"pushed_at":"2026-02-23T21:12:53.000Z","size":19686,"stargazers_count":87,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-24T02:58:48.120Z","etag":null,"topics":["ffmpeg","lightweight","local-storage","nvr","opensource","privacy","video-surveillance"],"latest_commit_sha":null,"homepage":"https://spupuz.github.io/vibe-nvr-site/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spupuz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-15T22:33:08.000Z","updated_at":"2026-02-23T22:10:17.000Z","dependencies_parsed_at":"2026-01-19T13:00:44.367Z","dependency_job_id":null,"html_url":"https://github.com/spupuz/VibeNVR","commit_stats":null,"previous_names":["spupuz/vibenvr"],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/spupuz/VibeNVR","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spupuz%2FVibeNVR","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spupuz%2FVibeNVR/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spupuz%2FVibeNVR/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spupuz%2FVibeNVR/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spupuz","download_url":"https://codeload.github.com/spupuz/VibeNVR/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spupuz%2FVibeNVR/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29969243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T11:43:06.159Z","status":"ssl_error","status_checked_at":"2026-03-01T11:43:03.887Z","response_time":124,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ffmpeg","lightweight","local-storage","nvr","opensource","privacy","video-surveillance"],"created_at":"2026-01-17T21:59:15.567Z","updated_at":"2026-05-05T23:02:10.469Z","avatar_url":"https://github.com/spupuz.png","language":"JavaScript","funding_links":["https://www.buymeacoffee.com/spupuz"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\r\n  \u003cimg src=\"docs/logo.png\" alt=\"VibeNVR Logo\" width=\"120\"\u003e\r\n\u003c/p\u003e\r\n\r\n# 📹 VibeNVR – Modern Video Surveillance System\r\n\r\nVibeNVR is a modern, modular, and containerized video surveillance system designed to manage IP cameras, recordings, motion detection, and a unified event timeline. It features a custom high-performance video engine (VibeEngine) built for efficiency and reliability, wrapped in a premium React-based interface.\r\n\r\n### 🎬 Video Demo\r\n![VibeNVR Demo](docs/screenshots/demo.webp)\r\n\r\n\u003e **Project Status**: This is a **Vibe Coding Project**. Extensive testing has been performed to ensure stability, but we are always **open to new help** and contributions from the community!\r\n\u003e \r\n\u003e ⚠️ **IMPORTANT**: When updating, always check the **[Release Notes](https://github.com/spupuz/VibeNVR/releases)** and ensure your `docker-compose.prod.yml` and `.env` are synchronized with the latest version.\r\n\u003e \r\n\u003e **Language Policy**: Please note that **English is the official and only supported language** of this project. All code, user interface elements, commit messages, issues, and documentation (including wikis) must be written strictly in English to maintain consistency and accessibility for the global community.\r\n\u003e \r\n\u003e ---\r\n\u003e ### 💬 Help Us Improve!\r\n\u003e We are building VibeNVR to be the best local NVR experience, and we can't do it without you. \r\n\u003e \r\n\u003e **Found a bug? Have a great idea for a feature? Want to share your setup?**\r\n\u003e Please **[Open an Issue](https://github.com/spupuz/VibeNVR/issues)**! We are extremely proactive, always available to fix problems, and love adding new capabilities requested by the community. Your feedback is what drives this project forward.\r\n\r\n## ✨ Key Features\r\n\r\n| Feature | Description |\r\n|---------|-------------|\r\n| 🖥️ **Modern Web Interface** | Ultra-premium UI built with React, Vite, and Lucide icons. |\r\n| 🎨 **Customizable Dashboard** | Toggle widgets and graphs to suit your monitoring needs. **New**: Real-time MQTT and **AI Processor** status indicators. |\r\n| 🛡️ **Secure by Design** | Full JWT authentication, **2FA with Trusted Devices**, Rate Limiting, and HttpOnly Media Cookies. |\r\n| 📷 **Advanced Video Engine** | Custom Python engine using PyAV \u0026 FFmpeg for RTSP streaming, with OpenCV for motion detection and image processing. |\r\n| ⚡ **Passthrough Recording** | Direct Stream Copy support for near-zero CPU usage recording (experimental, with auto-fallback). |\r\n| 🎯 **Smart Motion Detection** | Three detection engines: **OpenCV** (classic), **ONVIF Edge** (hardware offload), and **AI** (TFLite object recognition). |\r\n| 🤖 **AI Object Detection** | High-performance inference with **YOLOv8** or MobileNet SSD v2. Support for **Google Coral Edge TPU** or CPU. Detects people, vehicles, animals, and filters by confidence. **NMS (Non-Maximum Suppression)** ensures clean detections. |\r\n| 🛡️ **Universal AI Activation** | A global master switch allows for instant system-wide AI enabling/disabling. If OFF, AI models are not loaded, saving significant resources. Cameras automatically fallback to **OpenCV** detection with clear UI indicators. |\r\n| 🔍 **Descriptive AI Alerts** | Dynamic notifications including detected object labels (e.g., 🔍 Objects: Person, Vehicle) and confidence scores. |\r\n| 📅 **Event Timeline** | Unified browser for movie recordings and high-res snapshots with instant filters. |\r\n| 🛡️ **Privacy Masking** | Permanent black-out zones burned into recordings. **Motion Zones** for exclusion masking. |\r\n| 🔑 **API Access Tokens** | Secure, read-only API tokens with **TTL (Expiration)** and hashed storage for 3rd party integrations. |\r\n| 💾 **Storage Management** | Automated cleanup (FIFO), **Reactive 10-min Quota Monitoring**, **Granular Per-Camera Cleanup**, **Effective Limit Logic**, and Multiple Storage Profiles. |\r\n| 📁 **Camera Groups** | Organize cameras into custom groups for logical multi-view management. |\r\n| 💾 **System Backups** | Automated \u0026 Manual configuration snapshots with server-side management and restoration. |\r\n| 🕙 **Timezone Synchronization** | Full ISO 8601 support ensures perfect timing between engine, backend, and UI. |\r\n| 📊 **Real-time Monitoring** | Native **WebCodecs H.264** low-latency WebSocket streaming, with selectable modes and adaptive JPEG polling fallback. |\r\n| 🔊 **Audio Recording \u0026 Live** | Support for **AAC audio recording** and high-performance G.711 live streaming via WebCodecs. |\r\n| 🛡️ **IP Ban Protection** | Automated `ffprobe` pre-flight checks and per-camera **RTSP Transport** selection (TCP/UDP). Support for **Secure RTSP (RSTSPS/RTSPS)** with automated certificate handling. |\r\n| 🔀 **Dual-Stream Support** | Render ultra-lightweight UI grids using low-res sub-streams, while dedicating high-res main streams entirely to motion recording. |\r\n| 🔄 **Selective Settings** | Rapidly propagate Recording, Motion, or Alert settings across cameras or groups without overwriting unique hardware identities. |\r\n| 👯 **Camera Cloning** | Instant device provisioning via the 'Clone Settings' dropdown during initial camera creation. |\r\n| 🤖 **ONVIF Edge Motion** | Offload motion detection to camera hardware via ONVIF. **Stability+**: New Auto-Rebind pattern ensures reliability on devices with session limits. |\r\n| 📊 **AI Timeline Filtering** | Filter recorded events by detected object type (Person, Vehicle) directly from the Timeline view. |\r\n| 🎮 **Advanced ONVIF PTZ** | Real-time Pan, Tilt, Zoom, **Home Positions**, and **Presets Navigation** via an intuitive overlay. Supports intelligent 3-stage hardware fallbacks for restrictive cameras. |\r\n| 🏠 **Native MQTT Service** | Built-in MQTT service for real-time motion reporting and **Home Assistant Discovery**. Publishes AI metadata and camera status. |\r\n| 🔍 **Network Discovery** | Securely scan network ranges for ONVIF/RTSP devices via authenticated **SSE (Server-Sent Events)** streams. |\r\n| 🛡️ **System Integrity Audit** | Integrated security and consistency audits verify RBAC isolation, path sanitization, and **Backend-Engine synchronization** (e.g., Audio capabilities) on every release. |\r\n| 🐳 **Docker-Native** | Zero-dependency deployment with **Tag-Driven CI/CD**. Images are ultra-lean (~1GB) and protected by recursive `.dockerignore` policies to prevent artifact leakage. |\r\n\r\n---\r\n\r\n## 🔒 Security \u0026 Architecture\r\n\r\nVibeNVR is built with security as a priority. For detailed information regarding our security model, authenticated media, internal port protection, vulnerability reporting, and Role-Based Access Control (RBAC), please see our dedicated [Security Documentation](SECURITY.md).\r\n\r\n---\r\n\r\n### 📊 Public Telemetry\r\nVibeNVR maintains a public, anonymous telemetry dashboard where you can see global usage statistics, active versions, and hardware trends:\r\n**[View Public Telemetry Dashboard](https://vibenvr-telemetry.spupuz.workers.dev/)**\r\n\r\n### What is collected?\r\nWe only collect **non-sensitive, anonymous** technical data:\r\n- **Application Version**: To see how many users are on the latest release.\r\n- **Hardware Profile**: CPU count, total RAM (rounded to GB), and GPU acceleration status.\r\n- **Usage Metrics**: Total number of cameras, camera groups, and events in the database.\r\n- **Detection Engines**: Distribution of motion detection modes (OpenCV, ONVIF Edge, AI Native).\r\n- **System Info**: Operating System and hardware architecture (e.g., Linux x86_64).\r\n- **Anonymous ID**: A randomly generated UUID that uniquely identifies the installation without linking it to any personal identity or IP address.\r\n- **Feature Flags**: Indicators for active features like Notifications, MQTT, and Sub-stream usage (no addresses, credentials, or tokens are collected).\r\n\r\n### How often?\r\nThe report is sent once **30 seconds after startup** and then **once every 24 hours**.\r\n\r\n\r\n### Opt-out\r\nYour privacy is paramount. You can disable telemetry at any time:\r\n1. Navigate to **Settings** in the web interface.\r\n2. Open the **Privacy \u0026 Analytics** section.\r\n3. Toggle off **Enable Anonymous Telemetry** and save.\r\n\r\n---\r\n\r\n---\r\n\r\n## 🚀 Quick Start\r\n\r\n### Prerequisites\r\n- Docker \u0026 Docker Compose (V2 recommended)\r\n\r\n### 📦 Installation via Docker (Recommended)\r\n\r\n1.  **Get the files**:\r\n    Download the **[docker-compose.prod.yml](docker-compose.prod.yml)** file.\r\n    \r\n    *Alternatively, clone the repository to get all files (recommended for easier updates):*\r\n    ```bash\r\n    git clone https://github.com/spupuz/VibeNVR.git\r\n    cd VibeNVR\r\n    ```\r\n\r\n2.  **Configuration (.env)**:\r\n    VibeNVR is configured using a `.env` file. \r\n    \r\n    *   If you cloned the repo, you can use the included `.env` file as a base.\r\n    *   If you just downloaded the compose file, create a file named `.env` in the same directory.\r\n    \r\n    **Important: Update your `.env` with secure values:**\r\n    ```properties\r\n    # .env content example\r\n    # ENV Configuration\r\n    SECRET_KEY=change_this_to_a_long_random_string  # CRITICAL: Security key (min 32 chars). Application won't start in production with a weak key unless ALLOW_WEAK_SECRET=true is set.\r\n    WEBHOOK_SECRET=change_this_to_a_long_random_string # REQUIRED: Validates engine-\u003ebackend communication. Set SAME as SECRET_KEY.\r\n    # POSTGRES_PASSWORD=vibenvrpass\r\n\r\n    # Storage \u0026 Paths\r\n    # VIBENVR_DATA=./viben_data             # Where recordings and logs are stored\r\n    # VIBENVR_DB_DATA=./viben_db_data       # Database persistence path\r\n\r\n    # Ports\r\n    # VIBENVR_FRONTEND_PORT=8080            # Frontend Access Port\r\n    # VIBENVR_BACKEND_PORT=5005             # Backend API Port\r\n\r\n    # Hardware Acceleration\r\n    # HW_ACCEL=true                         # Enable Hardware Acceleration (true/false)\r\n    # HW_ACCEL_TYPE=auto                    # auto, nvidia, intel, amd\r\n    ```\r\n    *See the `.env` file in the repo for all available options.*\r\n\r\n3.  **Start the service**:\r\n    ```bash\r\n    docker compose -f docker-compose.prod.yml up -d\r\n    ```\r\n\r\n### 🔄 Updating VibeNVR \r\nWhen a new version is released, follow these steps to ensure a clean update:\r\n\r\n1. **Back up your .env file**:\r\n   ```bash\r\n   cp .env .env.bak\r\n   ```\r\n\r\n2. **Retrieve the new production compose file**:\r\n   Ensure you are in the project root.\r\n   ```bash\r\n   curl -O https://raw.githubusercontent.com/spupuz/VibeNVR/main/docker-compose.prod.yml\r\n   ```\r\n\r\n3. **Pull the new images**:\r\n   ```bash\r\n   docker compose -f docker-compose.prod.yml pull\r\n   ```\r\n\r\n4. **Stop the current stack**:\r\n   ```bash\r\n   docker compose -f docker-compose.prod.yml down\r\n   ```\r\n\r\n5. **Start the new stack**:\r\n   ```bash\r\n   docker compose -f docker-compose.prod.yml up -d\r\n   ```\r\n\r\n---\r\n\r\n## 💾 Data Persistence (Bind Mounts vs Volumes)\r\n\r\nThe default configuration above uses **Bind Mounts** (mappings to local folders like `./data/recordings`) which makes it easy to access your video files directly from the host system.\r\n\r\n**Option A: Using Local Folders (Bind Mounts - Recommended)**\r\nThis allows you to easily backup or view recordings using tools on your host machine.\r\n- Recordings: `./data/recordings`\r\n- Database: `./data/db`\r\n\r\n**Option B: Using Docker Volumes**\r\nIf you prefer to let Docker manage storage (better for performance on some non-Linux filesystems), change the `volumes` section in `docker-compose.yml`:\r\n\r\n```yaml\r\nvolumes:\r\n  - vibenvr_data:/data\r\n```\r\n\r\nAnd define the volume at the end of the file:\r\n```yaml\r\nvolumes:\r\n  vibenvr_data:\r\n```\r\n\r\n---\r\n\r\n---\r\n\r\n## 🏠 Dashboard Integration (Homepage)\r\n\r\nVibeNVR integrates perfectly with [gethomepage.dev](https://gethomepage.dev/) using the `customapi` widget.\r\n\r\n**Example `services.yaml` configuration:**\r\n\r\n```yaml\r\n- VibeNVR:\r\n    icon: mdi-cctv\r\n    href: http://your-vibenvr-ip:8080/\r\n    description: Video Surveillance\r\n    server: your-docker-host # Optional: Requires docker socket access in Homepage\r\n    container: vibenvr-backend\r\n    widget:\r\n      type: customapi\r\n      url: http://your-vibenvr-ip:8080/api/v1/homepage/stats\r\n      headers:\r\n        X-API-Key: \"your-api-token-here\"\r\n      method: GET\r\n      mappings:\r\n        - field: cameras_online\r\n          label: Online\r\n        - field: events_today\r\n          label: Events (24h)\r\n        - field: storage_used_gb\r\n          label: Storage (GB)\r\n        - field: uptime\r\n          label: Uptime\r\n        - field: cameras_recording\r\n          label: Recording\r\n        - field: storage_total_gb\r\n          label: Total Disk (GB)\r\n```\r\n\r\n---\r\n\r\n## 🌐 Production Deployment (Nginx Proxy Manager)\r\n\r\nSince VibeNVR binds to `127.0.0.1` by default, you **MUST** use a Reverse Proxy to access it from other computers or the internet.\r\n\r\n**Recommended Setup with Nginx Proxy Manager (NPM):**\r\n\r\n1.  **Network Setup**: Ensure NPM and VibeNVR containers can talk to each other. The easiest way is to put them on the same Docker network, or point NPM to the host IP (`host.docker.internal` or gateway IP).\r\n2.  **Proxy Host Configuration**:\r\n    - **Domain Names**: Set up your domain (e.g., `nvr.yourdomain.com`).\r\n    - **Scheme**: `http`\r\n    - **Forward Host**: `vibenvr-frontend` (if on same network) or Your Host LAN IP.\r\n    - **Forward Port**: `80` (container port) or `8080` (host mapped port).\r\n3.  **Websockets Support**: Enable \"Websockets Support\" in NPM for live streaming stability.\r\n4.  **SSL**: Enable \"Force SSL\" and strictly use Let's Encrypt certificates.\r\n\r\n**Why this is safer?**\r\nAttackers scanning your public IP will find all ports (5000, 8000) closed. They can only access the NVR through port 80/443 via your Proxy, which enforces HTTPS and potentially extra authentication layers.\r\n\r\n---\r\n\r\n## 🔧 Troubleshooting\r\n\r\n### Permission Errors on Proxmox/PVE Kernel, OpenMediaVault, Synology, QNAP\r\n\r\nIf you're running VibeNVR on a system with the **Proxmox kernel (pve-kernel)**, **OpenMediaVault**, **Synology**, **QNAP**, or similar NAS devices, you may encounter permission errors like:\r\n\r\n**PostgreSQL errors:**\r\n```\r\ncould not create Unix socket for address \"/var/run/postgresql/.s.PGSQL.5432\": Permission denied\r\nFATAL: could not create any Unix-domain sockets\r\n```\r\n\r\n**Engine/Backend errors:**\r\n```\r\nsocket.socketpair()\r\nPermissionError: [Errno 13] Permission denied\r\n```\r\n\r\n**Solution:** These errors are caused by kernel security restrictions (seccomp/AppArmor). Try the following solutions in order:\r\n\r\n**Option 1: Disable seccomp and AppArmor**\r\n\r\nAdd these lines to **each service** (backend, engine, db) in your `docker-compose.yml`:\r\n\r\n```yaml\r\nsecurity_opt:\r\n  - seccomp:unconfined\r\n  - apparmor:unconfined\r\n```\r\n\r\n**Option 2: Use Privileged Mode for ALL Containers**\r\n\r\n\u003e ⚠️ **CRITICAL WARNING**: Running containers in privileged mode bypasses Docker's isolation and grants root-level access to the host machine. Only use this if absolutely necessary on specific problematic kernels (like older Proxmox/OMV) and ensure your system is well-segmented.\r\n\r\nIf Option 1 doesn't work (common on OpenMediaVault + Proxmox kernel), you MUST change `privileged: false` to `privileged: true` for **every service** (frontend, backend, engine, db) in your `docker-compose.yml`:\r\n\r\n```yaml\r\nservices:\r\n  frontend:\r\n    privileged: true # Change from false to true\r\n  backend:\r\n    privileged: true # Change from false to true\r\n  engine:\r\n    privileged: true # Change from false to true\r\n  db:\r\n    privileged: true # Change from false to true\r\n```\r\n\r\n**Option 3: System-level fix** (if all else fails)\r\n\r\n```bash\r\n# Enable unprivileged user namespaces\r\nsudo sysctl -w kernel.unprivileged_userns_clone=1\r\n\r\n# Make it permanent\r\necho \"kernel.unprivileged_userns_clone=1\" | sudo tee /etc/sysctl.d/99-userns.conf\r\nsudo sysctl --system\r\n\r\n# Restart Docker\r\nsudo systemctl restart docker\r\n```\r\n\r\n- [x] Check backend logs: `docker compose logs backend`\r\n- [x] Check engine connectivity: `GET /api/settings/engine/debug-status` (Admin only)\r\n- [x] Ensure `HW_ACCEL_TYPE` matches your hardware (nvidia/intel/amd).\r\n\r\nAfter making changes, restart the containers:\r\n```bash\r\ndocker compose down\r\ndocker compose up -d\r\n```\r\n\r\n---\r\n\r\n## 📸 Screenshots\r\n\r\n### 🖥️ Desktop Views\r\n\r\n| Login Screen | Main Dashboard |\r\n|:---:|:---:|\r\n| ![Login](docs/screenshots/login.png) | ![Dashboard](docs/screenshots/dashboard.png) |\r\n\r\n| Live View (Grid) | Video Playback |\r\n|:---:|:---:|\r\n| ![Live View](docs/screenshots/liveview.png) | ![Video Playback](docs/screenshots/video_playback.png) |\r\n\r\n| Event Timeline | Camera Scanner |\r\n|:---:|:---:|\r\n| ![Timeline](docs/screenshots/timeline.png) | ![Scanner](docs/screenshots/camera_scanner.png) |\r\n\r\n| Camera Management | Camera Groups |\r\n|:---:|:---:|\r\n| ![Cameras](docs/screenshots/cameras.png) | ![Groups](docs/screenshots/camera_groups.png) |\r\n\r\n### ⚙️ Detailed Configuration\r\n\r\n| Camera Config (General) | Camera Config (Motion) |\r\n|:---:|:---:|\r\n| ![Config General](docs/screenshots/camera_config_general.png) | ![Config Motion](docs/screenshots/camera_config_motion.png) |\r\n\r\n| System Settings | Notification Channels |\r\n|:---:|:---:|\r\n| ![Settings](docs/screenshots/settings_system.png) | ![Notifications](docs/screenshots/settings_general.png) |\r\n\r\n### 📱 Mobile Views\r\n\r\n| Dashboard | Live View | Timeline |\r\n|:---:|:---:|:---:|\r\n| ![Mobile Dashboard](docs/screenshots/mobile_dashboard.png) | ![Mobile Live View](docs/screenshots/mobile_liveview.png) | ![Mobile Timeline](docs/screenshots/mobile_timeline.png) |\r\n\r\n## 🧱 Architecture\r\n\r\nVibeNVR is split into four main microservices:\r\n\r\n*   **Frontend**: React-based SPA providing a sleek, responsive dashboard.\r\n*   **Backend**: FastAPI server handling logic, secure database access, and **secure HttpOnly cookie-based media relay**.\r\n*   **VibeEngine**: Custom decoupled modular processing engine (`stream_reader`, `motion_detector`, `recording_manager`, `ai_detector`) for motion detection, recording, and overlays. Uses PyAV for RTSP stream ingestion, OpenCV for frame processing, and TFLite for AI inference with optional Coral Edge TPU acceleration.\r\n*   **Database**: PostgreSQL for persistent storage of camera configs and events.\r\n\r\n---\r\n\r\n## 🌟 Support \u0026 Star History\r\n\r\n\u003cp align=\"center\"\u003e\r\n  If you find VibeNVR useful, please consider giving it a star or buying me a coffee! Your support helps me maintain and improve the project.\r\n  \u003cbr\u003e\r\n  \u003cbr\u003e\r\n  \u003ca href=\"https://www.buymeacoffee.com/spupuz\" target=\"_blank\"\u003e\r\n    \u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" height=\"60\" width=\"217\"\u003e\r\n  \u003c/a\u003e\r\n  \u003cbr\u003e\r\n  \u003cbr\u003e\r\n  \u003ca href=\"https://www.producthunt.com/products/vibenvr?embed=true\u0026utm_source=badge-featured\u0026utm_medium=badge\u0026utm_campaign=badge-vibenvr\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\r\n    \u003cimg src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1070162\u0026theme=light\u0026t=1769727454865\" alt=\"VibeNVR - Simple, privacy-respecting local NVR | Product Hunt\" width=\"250\" height=\"54\"\u003e\r\n  \u003c/a\u003e\r\n  \u003cbr\u003e\r\n  \u003cbr\u003e\r\n  \u003ca href=\"https://star-history.com/#spupuz/VibeNVR\u0026Date\"\u003e\r\n    \u003cimg src=\"https://api.star-history.com/svg?repos=spupuz/VibeNVR\u0026type=Date\" alt=\"Star History Chart\"\u003e\r\n  \u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n---\r\n\r\n\r\n## 📄 License\r\n\r\nThis project is open source and available under the [MIT License](LICENSE).\r\n\r\n**DISCLAIMER**: THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n---\r\n\r\n\u003cp align=\"center\"\u003e\r\n  Made with ❤️ by \u003ca href=\"https://github.com/spupuz\"\u003espupuz\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspupuz%2Fvibenvr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspupuz%2Fvibenvr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspupuz%2Fvibenvr/lists"}