Omahub
← All plugins
T

VisionHub

by tobiasz-p

Live view of RTSP IP cameras — health at a glance in the bar, real window with a camera grid and focused view.

Security review

Review recommended · 1 finding

Deterministic scan — not a security guarantee

Low
Risk level
Low
Analyzed commit
8427d1f
Scanned
1 week ago

Flagged patterns appear only in documentation files (README / docs) — descriptive examples, not executable code.

  • Docs external_hosts README.md:180

    Downloads or connects to an external HTTP(S) host.

    git clone https://github.com/<your-username>/vision-hub.git

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

Low
AI risk level
Low
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
8427d1f
Reviewed
1 week ago

VisionHub is a transparent RTSP camera viewer: the QML UI controls a Ruby daemon that probes cameras and spawns isolated ffmpeg processes writing JPEG frames into a 0700 tmpfs directory. Camera passwords are fetched from the keyring via secret-tool and are not placed in command-line arguments by default, and the configuration is strictly validated. The deterministic scan's only medium finding is a git-clone example in the contributing section of the README, which is documentation, not executable code.

  • The external_hosts finding is a false positive from README documentation only; no executable code connects to that host.
  • The plugin requires access to the user's configured RTSP cameras and keyring by design, which is expected for its stated functionality.
How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/tobiasz-p/vision-hub --enable
Widgets #bar #quickshell #media

VisionHub — Omarchy Plugin

Ruby License: MIT RuboCop

Live view and health monitoring of RTSP IP cameras directly in your Omarchy shell bar and desktop. Displays an at-a-glance camera status counter on the top bar and expands into a floating multi-camera grid with single-camera focused view.


Showcase

Multi-Camera Grid View

Configurable live overview of all surveillance feeds with instant reachability status pills and custom camera naming.

<p align="center"> <img src="docs/assets/grid.png" alt="Multi-Camera Grid View" width="720" /> </p>

Focused Cinema Live View

High-framerate focused stream with interactive FPS switcher, live RTSP audio playback toggle, HUD telemetry, and bottom carousel strip navigation.

<p align="center"> <img src="docs/assets/cinema-garage.png" alt="Focused Cinema Live View" width="720" /> </p>

Features

  • Top Bar Health Widget: Compact status pill displaying active online camera count (e.g. 󰹗 4/4), offline warnings, and hover tooltips with detailed status for each configured camera.
  • Floating Live View Window: Themed desktop window featuring a configurable multi-camera grid and high-framerate focused single-camera view.
  • Resource Efficient & Isolated: RTSP streams decode in crash-isolated background ffmpeg worker processes managed by an asynchronous Ruby daemon. Only visible cameras consume streaming resources.
  • tmpfs Fast Frame Buffer: Video frames stream directly into RAM ($XDG_RUNTIME_DIR/vision-hub), protecting SSD longevity and ensuring zero latency UI rendering.
  • Hardware Acceleration Support: Automatic hardware-accelerated video decoding (VAAPI / CUDA / Vulkan / QSV).
  • Secure Credential Storage: Camera passwords reside safely in your system keyring (gnome-keyring / secret-tool) and are never written to disk or exposed in configuration files.
  • Non-Blocking TCP Health Probes: Proactive reachability checks detect offline cameras without stalling the UI.

Requirements

  • Ruby 3.4+ (standard on Arch/Omarchy; verify with ruby --version)
  • ffmpeg (with RTSP protocol support)
  • secret-tool (libsecret / GNOME Keyring)
  • Omarchy Shell (Quickshell / Hyprland)

Installation & Removal

Install

Install and enable the plugin directly from git:

omarchy plugin add https://github.com/tobiasz-p/vision-hub.git --enable

Or clone manually into ~/.config/omarchy/plugins/tobiasz-p.vision-hub and enable:

omarchy plugin enable tobiasz-p.vision-hub

Or place it in a specific bar position:

omarchy bar put tobiasz-p.vision-hub --section right

Disable & Remove

Disable the plugin:

omarchy plugin disable tobiasz-p.vision-hub

Remove the plugin:

omarchy plugin remove tobiasz-p.vision-hub

Configuration

1. Camera Definitions

Create ~/.config/vision-hub/cameras.json:

{
  "cameras": [
    {
      "id": "front",
      "name": "Front Door",
      "host": "192.168.1.101",
      "port": 554,
      "username": "admin",
      "mainPath": "/Streaming/channels/101",
      "subPath": "/Streaming/channels/102"
    },
    {
      "id": "backyard",
      "name": "Backyard",
      "host": "192.168.1.102",
      "port": 554,
      "username": "admin",
      "mainPath": "/live/ch0",
      "subPath": "/live/ch1"
    }
  ]
}

2. Store Credentials in Keyring

Camera passwords are stored securely in GNOME Keyring using secret-tool.

Option A: Single shared password for all cameras

If all cameras share the same password, store a single default entry:

secret-tool store --label='VisionHub default camera' application tobiasz-p.vision-hub camera default

Option B: Per-camera passwords

Store specific passwords for individual cameras by matching the id defined in cameras.json (takes precedence over the default):

secret-tool store --label='VisionHub camera front' application tobiasz-p.vision-hub camera front
secret-tool store --label='VisionHub camera backyard' application tobiasz-p.vision-hub camera backyard

3. Widget Settings

Settings can be customized via omarchy bar set:

Setting Default Description
gridColumns 3 Number of columns in the multi-camera grid (1 to 6)
targetFps 2 Target FPS for substream grid tiles (1 to 10)
mainFps 15 Target FPS for focused single-camera stream (1 to 30)
audioEnabled false Play audio by default in cinema view
hwaccel true Enable hardware-accelerated video decoding
showOfflineCameras true Show offline/unreachable cameras in the grid view

Example:

omarchy bar set tobiasz-p.vision-hub gridColumns 2
omarchy bar set tobiasz-p.vision-hub targetFps 10

Gestures & Controls

Action Control
Left Click (Bar Widget) Toggle live-view floating window
Right Click (Bar Widget) Force immediate network health re-probe
Click (Camera Tile) Switch to focused single-camera view (high-fps main stream)
Press ← / → Arrow (Cinema View) Cycle to previous / next camera
Press 1-9 (Cinema View) Switch directly to camera by position
Click ← Grid or Press Esc (Focused View) Return to multi-camera grid
Press Esc (Grid View) Close live-view window

Contributing

Contributions are welcome! To help keep the codebase clean and git history maintainable, please follow these guidelines when opening a Pull Request.

Workflow & Creating a PR

  1. Fork the repository on GitHub to your personal account.
  2. Clone your fork and add the upstream repository as a remote:
    git clone https://github.com/<your-username>/vision-hub.git
    cd vision-hub
    git remote add upstream https://github.com/tobiasz-p/vision-hub.git
    
  3. Create a feature branch:
    git checkout -b feat/your-feature-name
    # or
    git checkout -b fix/issue-description
    
  4. Make your changes: Verify test suites and linters pass locally:
    bundle exec rake
    omarchy plugin validate ~/.config/omarchy/plugins/tobiasz-p.vision-hub
    
  5. Push to your fork:
    git push -u origin feat/your-feature-name
    
  6. Open a Pull Request: Submit a PR from your branch against upstream/main with a clear description of the changes.

Commit Guidelines

We follow Conventional Commits. Write concise, descriptive commit messages in the imperative mood:

<type>(<optional scope>): <description>

Common Types:

  • feat: A new feature or capability
  • fix: A bug fix
  • docs: Documentation updates
  • refactor: Code changes that neither fix a bug nor add a feature
  • style: Formatting or UI styling adjustments without logic changes
  • test: Adding or updating tests
  • chore: Maintenance tasks, dependency updates, or toolchain configuration

Examples:

  • feat: add support for custom stream transport protocols
  • fix: handle ffmpeg restart edge case during rapid window toggle
  • docs: update camera configuration examples for ONVIF profiles

Meaningful Commits & Linear History

  • Meaningful Commits Only: Each commit should represent a complete, logical unit of work. Avoid leaving intermediate "WIP", "fix typo", or "checkpoint" commits in the history.
  • Squash Fixups: Squash or rebase intermediate commits locally (git rebase -i) before submitting or finalizing your PR.
  • Linear History: We maintain a strictly linear git history. PRs will be rebased onto main (no merge commits). Make sure your branch is up-to-date with upstream:
    git pull --rebase upstream main
    

License

MIT License. Copyright (c) 2026 tobiasz-p.