Documentation
Videre is a browser-based camera evaluation tool for Linux. It connects to any V4L2-compatible camera and streams live video to your browser — no desktop environment, no Qt, no Electron required.
Installation
Videre ships as a single self-contained binary. Download the package for your system from the Community download page.
| Package | Recommended for | Install | |
|---|---|---|---|
| Architecture | Package | Recommended for | Install |
| x86-64 | .deb | Ubuntu / Debian and derivatives | sudo dpkg -i videre_*.deb |
| x86-64 | .AppImage | Any x86 Linux distro | chmod +x videre-*.AppImage && ./videre-*.AppImage |
| x86-64 | .tar.gz | Manual install / custom paths | Extract and run ./videre |
| arm64 | .deb | Raspberry Pi OS | sudo dpkg -i videre_*.deb |
| arm64 | .tar.gz | Manual install on RPi5 | Extract and run ./videre |
Runtime dependencies
The .deb and .AppImage bundles include all dependencies. For tarball installs, the following libraries must be present:
First Run
Videre 0.9.2 — http://localhost:8080
Videre starts a local web server and opens your default browser automatically. Navigate to http://localhost:8080 if it doesn't open. The port is printed to the terminal on startup; use --port PORT to change it.
To control which browser is launched, or to suppress it entirely:
$ videre --browser chromium
$ videre --no-browser # headless / server use
--browser accepts any command on $PATH. The default is xdg-open.
Community Edition: The free tier requires an internet connection. On first launch a consent dialog appears — clicking Accept & Continue enables usage data collection and grants camera access. After 1 hour of cumulative use, a verified connection becomes required to continue. See Usage Data & Privacy for full details. Paid tiers have no connectivity requirement.
PWA install: Look for the install icon in the browser address bar after opening the app — this gives you a standalone window without browser chrome.
Interface Overview
│ Title bar │
├──────────┬──────────────────────────────┬───────────┤
│ Sidebar │ Toolbar │ │
│ (device │──────────────────────────────│ Control │
│ list) │ Viewport (live video) │ Panel │
│ │ │ │
│ │ [Histogram / ROI overlays] │ │
├──────────┴──────────────────────────────┴───────────┤
│ Status bar (FPS · resolution · status) │
└─────────────────────────────────────────────────────┘
| Element | Purpose |
|---|---|
| Sidebar | Device list. Collapsible and pinnable. |
| Toolbar | Stream controls, zoom, flip, crop, save, record, histogram, settings. |
| Viewport | Live video display with floating histogram and ROI overlays. Right-click for context menu. |
| Control Panel | Camera Panel with configurable sections: setup, capture / 3A, ISP image pipeline, processing, detectors, and advanced device controls. Collapsible and pinnable. |
| Status bar | Live FPS, frame resolution, and status messages. |
Connecting a Camera
- Click the sidebar toggle (chevron, top-left) to open the device list.
- A list of detected V4L2 devices appears (e.g.
/dev/video0). Click a device to open it. - The sidebar shows the device name when connected.
- Click ▶ Play in the toolbar to start streaming.
The status bar shows live FPS and resolution once streaming starts. If the camera disconnects, an error banner appears and streaming stops automatically.
Pixel format and frame size can be changed in the Control Panel while not streaming. Stop the stream first — there is no need to close the camera. The new format takes effect when you press Play again.
Camera Controls
The Control Panel (right side) exposes every parameter reported by the V4L2 driver, rendered as sliders, checkboxes, menus, or buttons depending on type. Exposure and Gain sliders refresh ~3 times per second to reflect the current driver value when Auto mode is active.
Primary controls
| Control | Description |
|---|---|
| Exposure | Sensor exposure time. Supports manual value and Auto mode. |
| Gain | Sensor amplification. Supports Auto mode where available. |
| Gamma | Gamma curve correction. |
| Brightness | Digital brightness offset. |
| White Balance | Colour temperature adjustment. Supports Auto mode. |
| Frame Rate | Target capture rate. Enter a value and press Apply (or Enter). Shows the driver-reported min–max fps range. The status bar updates to show the actual fps the driver accepted, which may differ slightly from the requested value. |
Additional controls
All other V4L2 controls reported by the driver (sharpness, saturation, hue, power-line frequency, backlight compensation, and any camera-specific controls) appear below the primary controls, automatically discovered at open time.
Format and resolution
Discrete cameras (most USB webcams) show a drop-down list of preset resolutions.
Stepwise / continuous cameras (industrial, machine-vision) support arbitrary resolutions within a range. Two number inputs appear instead of a drop-down — enter the desired width and height; the hint below shows the valid range and step size (e.g. 640–1920 × 480–1080 (step 2×2)). Click Apply to set it.
Display Rate
The Display Rate section in the Control Panel (visible while streaming) controls how many frames per second are forwarded to the browser, using adaptive decimation.
After each second of streaming, Videre computes a decimation factor so the browser receives approximately the target FPS. For example, if the camera captures at 120 fps and the target is 30 fps, 1 in every 4 frames is forwarded.
| Control | Description |
|---|---|
| Adaptive toggle | Enable or disable automatic decimation. When disabled, every captured frame is forwarded. |
| Target FPS | Desired display frame rate (default: 30 fps). Read-only labels show the current device fps and active decimation factor. |
Decimation only affects the display. The camera always captures at its configured rate, and recordings capture every frame regardless of this setting.
H.264 cameras: Every H.264 frame is decoded internally even when decimation is active — skipping decoder input would corrupt subsequent P-frames. The CPU cost of decoding is unchanged by decimation on H.264 sources; the saving is in JPEG encoding and WebSocket delivery only.
Zoom & Flip
Zoom
| Control | Action |
|---|---|
| + / − buttons | Zoom in/out in 10% increments |
| Fit | Scale to fill the viewport |
| Mouse wheel over video | Zoom in/out |
Zoom is display-only and has no effect on saved images or recordings.
Flip
Flip H / Flip V mirror the image horizontally or vertically. Flip is display-only — saved images and recordings are not affected.
Crop / ROI
Videre probes each camera at open time to determine which crop mode it supports and labels the UI accordingly. Three modes exist:
| Mode | How to activate | Processed by | Affects captured frame | Changes resolution |
|---|---|---|---|---|
| Software Crop | Click Crop in toolbar, drag on viewport | Browser | No | No |
| Hardware Crop | Right-click → Hardware Crop | Camera driver (sensor level) | Yes | Yes |
| UVC ROI (AE/AF) | Right-click → Set AE/AF ROI | Camera firmware (metering only) | No | No |
Many USB webcams report crop support but only implement UVC ROI — a UVC spec feature that tells the camera where to meter for auto-exposure and auto-focus. Hardware Crop and Set AE/AF ROI are shown exclusively based on what Videre detects at device open time.
When a hardware crop or UVC ROI is active, a Reset H.Crop or Reset ROI button appears in the toolbar. The camera driver may adjust the selected region to align with sensor boundaries; the status bar shows the actual applied dimensions.
The Advanced section of the Control Panel also exposes crop/ROI coordinates as number inputs for precise entry.
Saving Images
Click the Camera icon in the toolbar. The current frame is saved immediately to ~/Pictures/videre/ with a timestamp filename (e.g. 20260222_143512_042.jpg).
| Format | Notes |
|---|---|
| JPEG | Quality 95. For MJPEG cameras, the raw compressed frame is written directly without re-encoding. |
| TIFF | Lossless, uncompressed. Mono cameras preserve full bit depth: GREY → 8-bit; Y16 → 16-bit. Colour cameras save as 8-bit RGB. Not available for MJPEG or H.264 cameras — enable any filter to force decompression first. |
| Raw | Verbatim V4L2 buffer bytes. Available via REST API only (POST /api/save with {"format":"raw"}). Useful for machine vision and offline processing. |
Select JPEG or TIFF as the default in Settings (gear icon). When image processing filters are active, all save formats operate on the filtered frame.
Recording Video
Click Record in the toolbar to start; click again to stop. Files are saved to ~/Pictures/videre/ as AVI.
| Source format | AVI codec |
|---|---|
| MJPEG camera | MJPG — frames written directly, no re-encoding |
| YUYV, NV12, H.264, etc. | MJPG — converted to JPEG before writing |
A maximum file size limit (default 200 MB, configurable in Settings) stops recording automatically. The AVI container uses a nominal 30 fps timestamp — playback speed will differ if the camera runs at a different rate. Recordings capture every frame regardless of the display rate / decimation setting.
Image Mode
Image mode lets you load a still image file for offline analysis using the same tools available for live streams — histogram, ROI analysis, image processing filters, and detectors. No camera is required.
Loading an image
Click the Load Image button in the toolbar. A panel appears with two loading methods:
| Method | How |
|---|---|
| Upload | Click the file picker or drag-and-drop. Sent over HTTP and processed immediately. |
| Local path | Type an absolute path on the server filesystem and click Load. Useful for large files already on the machine. |
Supported formats: JPEG, PNG, TIFF, BMP, and camera RAW files (DNG, CR2, CR3, NEF, ARW, ORF, RW2, and others via LibRaw). RAW files take 1–5 seconds. To return to camera streaming, click the ✕ next to the filename.
Pro / Subscription / Source: RAW file loading requires a paid tier. Community Edition is limited to JPEG, PNG, TIFF, and BMP.
Render modes (RAW files only)
| Mode | Description |
|---|---|
| Camera | Displays the embedded JPEG preview generated in-camera. Matches the manufacturer's colour science exactly. |
| Raw | LibRaw demosaic with sRGB gamma, no tone mapping. Neutral starting point for filter work. |
| Filmic | ACES filmic tone mapping with optional CLAHE local contrast enhancement. Exposure (0.10–2.00, default 0.65) and Clarity (0–8, default 2.5) sliders appear in the toolbar. |
Analysis tools in image mode
Histogram, ROI analysis, image processing filters, and detectors all work identically on the loaded image. Changing the render mode or Filmic sliders re-renders in place — no "apply" button needed.
Settings
Click the gear icon in the toolbar to open the Settings panel.
| Setting | Description |
|---|---|
| Save format | Default snapshot format: JPEG or TIFF. |
| Recording format | AVI codec for recordings: MJPEG (compressed, default) or Raw RGB24 (uncompressed). |
| Max recording size (MB) | Recording stops automatically when this limit is reached (default: 200 MB). |
| Close app when browser closes | When enabled (default), Videre exits automatically 4 seconds after the last browser tab is closed. A page reload reconnects within the grace period and does not trigger shutdown. Disable to keep Videre running in the background. |
| Performance Diagnostics | Opens the diagnostics page in a new tab. See Hardware Diagnostics. |
Live Histogram
Click the Histogram (bar chart) icon in the toolbar to toggle the overlay. The panel appears in the lower-left corner of the viewport, and is freely moveable and resizable.
Channels
| Channel | Colour |
|---|---|
| Luma (BT.601 Y) | White |
| Red | Red |
| Green | Green |
| Blue | Blue |
Each channel has an independent toggle (L / R / G / B). Disabling a channel removes it from the display and from the auto-scale calculation — remaining channels fill the full height.
Moving and resizing
| Action | How |
|---|---|
| Move | Drag the panel header. Release near the viewport edge to snap flush. |
| Resize width | Drag the right edge |
| Resize height | Drag the bottom edge |
| Resize both | Drag the bottom-right corner |
Scale, Axes, and Crosshair
Toggle between Log (default) and Lin scale in the panel header. Log scale makes shadows and dark tones easier to read.
Click Axes to overlay axis labels: Y-axis (max count / 0), X-axis (0, 128, 255), and faint grid lines at 25%, 50%, and 75% positions.
Move the mouse over the histogram canvas to show a vertical crosshair. A tooltip displays the pixel value (0–255) at the cursor and the count for each visible channel, updating live during streaming.
Clipping indicators
- Red vertical line at the right edge — highlight clipping (pixels at 255)
- Blue vertical line at the left edge — shadow clipping (pixels at 0)
Histogram is not available for MJPEG or H.264 cameras — compressed frames contain no raw pixel values. Enable any pixel filter to force decompression. On cameras wider than 1920 px or above 60 fps, a performance note is shown before starting Analyze mode.
Image Quality Analysis
Click Analyze in the histogram footer to collect 5 seconds of data at up to 60 samples/sec. A progress bar shows collection status. After collection, the analysis dialog reports:
| Category | What you get |
|---|---|
| Exposure | Mean brightness and qualitative label (dark / slightly dark / well exposed / etc.), highlight and shadow clipping percentages, contrast span |
| Color Balance | Per-channel (R/G/B) means, qualitative colour cast label |
| Temporal Stability | Luma standard deviation across samples, dominant flicker frequency via DFT, flicker depth (peak-to-peak modulation as %), source hints for 50/100 Hz mains flicker |
Nyquist note: Detecting mains-frequency flicker (50/100 Hz) requires a camera running above 100/200 fps respectively. A note is shown when the camera frame rate limits the detectable flicker range below 30 Hz.
ROI Analytics
Right-click the live viewport and select Analyze, then click and drag to draw a region. The ROI Analysis panel appears and begins updating automatically.
Statistics
Per-channel statistics are computed over all pixels in the selected region:
| Statistic | Description |
|---|---|
| Min | Minimum pixel value |
| Max | Maximum pixel value |
| Mean | Average pixel value |
| Std Dev | Standard deviation — a measure of contrast or noise within the region |
For colour cameras values are in the 0–255 range across R, G, B, and luma channels. For mono cameras (GREY / Y16) analysis runs at native bit depth — a single Mono row is shown with values in the sensor's native range (e.g. 2048 / 4095 for a 12-bit source).
Line profiles
Two colour-coded canvas charts show pixel values sampled from within the ROI. Use the H / V tab buttons to switch between horizontal and vertical profiles. Each channel (R, G, B, luma) can be toggled independently.
| Mode | Description |
|---|---|
| 1px (default) | Samples the single centre row (horizontal) or centre column (vertical). A yellow dashed crosshair appears on the video showing exactly which row/column is sampled. |
| Avg | Averages all rows across the full region height (horizontal) or all columns across the full region width (vertical). The crosshair overlay is hidden in this mode. |
The panel polls every 250 ms while streaming. Moving or resizing the selection box updates statistics immediately on mouse release. Close with the × button to stop polling.
ROI Analytics requires decoded pixel data. Not available for MJPEG cameras in passthrough mode — enable any pixel filter to force decompression.
Pixel Filters
The Processing section in the Control Panel provides a per-frame OpenCV filter chain. Filters run sequentially in a dedicated processing thread and can be toggled while streaming — changes take effect on the next frame.
| Filter | Parameters | Description |
|---|---|---|
| Gaussian Blur | Kernel size (3–15), Sigma (0 = auto) | Smoothing blur; reduces noise at the cost of detail. Sigma 0 lets OpenCV choose an appropriate value for the kernel size. |
| Median Blur | Kernel size (3–11) | Salt-and-pepper noise removal; preserves edges better than Gaussian. Kernel must be odd. |
| Sharpen | Strength (0.5–5.0), Radius (1–5) | Unsharp mask — boosts high-frequency detail. Higher strength increases the effect; higher radius blurs the reference more before subtracting. |
| Grayscale | — | Converts to luminance (BT.601 coefficients) and outputs a three-channel grey image. |
| Threshold | Threshold (0–255), Mode (Binary / Otsu) | Pixels above the threshold go to 255, below to 0. Otsu mode ignores the slider and computes an optimal threshold automatically from the image histogram. |
| Canny Edges | Threshold 1 (0–255), Threshold 2 (0–255), Aperture (3/5/7) | Canny edge detector. Outputs white edges on a black background. Threshold 2 is the strong-edge threshold; Threshold 1 is the hysteresis weak-edge threshold. |
Filters are applied in the order shown. Multiple filters can be active simultaneously — each is applied to the output of the previous one. When filters are active, histogram computation, saves, and recordings all operate on the filtered frame.
MJPEG cameras: When at least one filter or detector is enabled, Videre decompresses each MJPEG frame to raw RGB24, applies the processing chain, and re-encodes the result. This also enables histogram and ROI Analytics. Disable all filters and detectors to return to zero-overhead passthrough.
Shape Detectors
Detectors run after the pixel filter chain, concurrently across available CPU cores. Enabling multiple detectors does not multiply latency.
| Detector | Overlay colour | Parameters |
|---|---|---|
| Contour | Green (rects) / Cyan (polygons) | Min/max area (px²), Mode (external / all), Output (rect / polygon / both), Burn-in |
| Circle (Hough) | Yellow | Min/max radius, Param 1 (Canny threshold), Param 2 (accumulator threshold), Burn-in |
| Blob | Magenta | Min/max area, Min circularity (0–1; set to 0 to detect irregular blobs), Burn-in |
Overlay vs. Burn-in
| Mode | Description |
|---|---|
| Overlay (default) | Shapes sent to the browser as JSON and drawn on a transparent canvas layer. The underlying frame is unmodified — recordings and saves are clean. |
| Burn-in | Shapes drawn into the RGB24 frame before JPEG encoding. Visible in recordings and saved images as well as the live view. |
Tips
- Stack a Gaussian Blur before a detector to reduce noise-induced false positives.
- Canny Edges followed by Contour Detector (mode = all) finds edges and their regions together.
- Area limits (
minArea/maxAreain pixels²) are the most effective way to filter out noise and out-of-scale objects. - For Circle Detector, lower Param 2 finds more circles but increases false positives.
Barcode & QR Scanner
Enable the Barcode Detector (ZBar) in the Detectors section. Each found symbol is highlighted with a yellow polygon overlay and labelled with its type and decoded text (e.g. QR-Code: https://...).
| Parameter | Description |
|---|---|
| Throttle (1–60) | Number of frames to skip between scans. Cached results are shown on skipped frames to avoid flicker. |
| Burn-in | Draw overlays into the frame (visible in recordings/saves). |
Supported symbologies: QR Code, EAN-13/8, UPC-A/E, Code 128/39/93, DataBar, ITF, and more.
Hardware Diagnostics
Open via Settings → Performance Diagnostics → Open, or navigate directly to /diagnostics. No root access required — all data is read from sysfs/procfs.
System Information
| Field | Description |
|---|---|
| CPU | Model name, core count, and key SIMD instruction sets (SSE4.2, AVX2, etc.) |
| GPU | Detected GPU and VA-API hardware decode availability (H.264, HEVC, VP9) |
| RAM | Total and available memory |
| Kernel | Linux kernel release string |
Camera / USB
| Field | Description |
|---|---|
| Bus | USB version and negotiated bus speed (High Speed 480 Mbps, SuperSpeed 5 Gbps, etc.) |
| Transfer | Isochronous (typical for USB 2.0 UVC) or Bulk (typical for USB 3.0) |
| Autosuspend | Whether Linux USB autosuspend is active for the camera. Autosuspend can add latency between frames; disabling it is recommended for stable high-frame-rate capture. |
| UVC | UVC protocol version reported by the camera (e.g. v1.50) |
| Resolutions | Discrete (fixed presets) or Stepwise (arbitrary sizes within a range) |
| Frame Rate | Min and max frame rate at the current format and size |
| USB Bandwidth | Estimated bandwidth usage for the current format, resolution, and fps — shown as absolute value and percentage of bus capacity. Highlighted in orange when above 80%. |
Recommendations
| Severity | Meaning |
|---|---|
| Action | Something likely causing a problem with a clear fix |
| Warning | A configuration worth reviewing |
| Info | Setup is fine but an upgrade path may exist |
Common recommendations include: disabling USB autosuspend (with the exact sysfs command to run), USB 3.0 suggestions when bandwidth utilisation exceeds 80%, hardware crop / UVC ROI capability notes, and adjustable frame rate range information.
Live Pipeline Metrics
While streaming, the page polls every second and shows average and peak timing for each processing stage, plus a bar chart relative to the frame budget (1000 / device FPS):
| Stage | What is timed |
|---|---|
| Capture | V4L2 buffer handling and pixel format detection |
| H.264 Decode | FFmpeg decode time (H.264 cameras only) |
| Format Convert | MJPEG imdecode or raw format conversion to RGB24 |
| Filter Chain | All enabled OpenCV pixel filters |
| Detectors | All enabled shape detectors |
| Histogram | Histogram computation (only when overlay is open) |
| JPEG Encode | libjpeg encode for WebSocket delivery |
Total, Budget, and Headroom rows at the bottom show at a glance whether the pipeline is on track for the camera's frame rate. Frame counts (processed and dropped, with a drop percentage) are shown below the table.
Enable a heavy filter (Gaussian blur with a large kernel) and watch the Filter Chain row increase — an easy way to identify your bottleneck before enabling multiple features simultaneously.
Usage Data & Privacy
On first launch, Videre shows a consent dialog before camera controls become accessible. Behaviour depends on your license tier.
Community Edition
Anonymous usage data collection is mandatory for the free Community Edition. The consent dialog offers Accept & Continue or Exit. Choosing Exit shows a "usage data required" message and the app does not proceed. After accepting, the app works normally — no further action is needed.
After 1 hour of cumulative use, a verified internet connection is required to continue:
- A popup appears: "To continue, an internet connection is required for usage data verification — or purchase the Pro version."
- Three connection attempts are made automatically (immediately, +30 s, +60 s).
- A 3-minute window is given in total. If any attempt succeeds, the popup is dismissed and the app continues normally.
- If the window expires without a connection, the app shuts down after 3 seconds.
Cumulative usage is tracked across sessions and stored in ~/.config/videre/config.json. Delete or edit that file to reset the consent decision — the dialog will reappear on next launch.
Paid tiers
Paid tiers (Pro, Subscription, Source) show the consent dialog with Accept & Continue and Decline options. Usage data collection is optional, the decision can be changed in Settings, and no internet connection is required.
What is collected
| Event | Data sent |
|---|---|
| Session start / end | Session UUID (random, not linked to identity), timestamp |
| Device opened | Camera path, pixel format, frame resolution |
| Stream session | Duration, frames processed, frames dropped |
| Control change | Control name only — no values |
| Feature used | Feature name (see below) |
Feature events fire once per user action, never per frame: histogram, histogram_analyze, roi_analysis, snapshot, recording, filter:gaussian_blur, filter:canny_edges, filter:contour_detector, flip_h, flip_v, crop, zoom_fit, and similar.
No video data, pixel values, control values, or personally identifiable information is ever collected. Each session generates a random UUID that is never linked to a user identity.
Disabling usage data collection
Pass --no-telemetry on the command line to suppress the consent dialog and disable all data collection. This is intended for paid tiers.
Paid License Flow
When a Pro or Subscription build starts without an activated license token, Videre shows a blocking license screen before the main application is accessible.
Options on first launch
| Action | What happens |
|---|---|
| Activate now | Enter the license key and click Activate Now. Videre contacts the licensing backend, activates the current device, and proceeds normally. |
| Continue on this device | Stores a local single-device binding for the current machine. Useful before formal activation, limited to this device only. |
| Abort | Closes the session without activating and without reserving the local allowance. |
Activation credits
Pro licenses include 50 lifetime activation credits. Subscription licenses include 100 activation credits per year (renewed annually). Reinstalling on the same machine typically reuses the existing activation. Major hardware changes may consume another credit — contact support in exceptional cases.
Activation state is stored in ~/.config/videre/license.json. To revoke the current device, use Settings → Revoke License.
Retrieving your license key
After purchase, the purchase-success page shows your license key immediately from the LemonSqueezy redirect. If you no longer have the key, the recovery page at get-videre.com/license-recovery sends an email with a single-use verification link that reveals your key.
Remote Access
SSH port forwarding (recommended)
Forward Videre's port over SSH to access the full web UI from your local machine securely:
$ ssh -L 8080:localhost:8080 user@remote-machine
# Then open in your local browser
$ open http://localhost:8080
This is the recommended approach — the SSH tunnel provides authentication and encryption with no additional configuration.
CLI over SSH
CLI subcommands work naturally over SSH without port forwarding:
$ ssh user@pi "videre list"
# Capture a frame remotely, save locally
$ ssh user@pi "videre capture /dev/video0" > frame.jpg
# Capture multiple frames, pull files
$ ssh user@pi "videre capture /dev/video0 --frames 10 --output /tmp/caps/"
$ scp user@pi:/tmp/caps/*.jpg ./local-caps/
# Stream raw H264 over SSH to local player
$ ssh user@pi "videre capture /dev/video0 --format native --frames 0" | ffplay -f h264 -
Network binding
By default Videre binds to 127.0.0.1. Use --bind to listen on other interfaces:
$ videre --bind 192.168.1.50 --port 8080 --no-browser
Security warning: Binding to 0.0.0.0 exposes the camera stream and all API endpoints to anyone on your network. There is no authentication built in. Use SSH port forwarding for secure remote access.
CLI Reference
Videre includes CLI subcommands that operate without starting the web server — useful for scripting, automation, headless systems, and SSH workflows.
videre info DEVICE Show device info and capabilities
videre capture DEVICE Capture frames to file or stdout
videre record DEVICE Record video to AVI
videre Start the web UI server (default)
Run videre COMMAND --help for full options on any subcommand.
List cameras
/dev/video0 Logitech C920 uvcvideo usb-0000:00:14.0-1
/dev/video2 ZWO ASI120MM uvcvideo usb-0000:00:14.0-2
$ videre list --json # machine-readable output
Device info
Device: Logitech C920
Current: MJPEG 1920×1080 @ 30.0 fps
Formats: MJPEG (6 sizes), YUYV (6 sizes)
Frame Rate: 5.0 – 30.0 fps
Controls: 14 controls listed
$ videre info /dev/video0 --json # full device descriptor
Capture frames
$ videre capture /dev/video0 > frame.jpg
# 100 lossless TIFFs, skip 30 frames for auto-exposure to settle
$ videre capture /dev/video0 --frames 100 --skip 30 --format tiff --output ./caps/
# With camera settings
$ videre capture /dev/video0 --size 1280x720 --pixel-format YUYV --control "Exposure (Absolute)=500" --format tiff --output shot.tiff
# Timelapse: one frame every 5 seconds
$ videre capture /dev/video0 --interval 5s --frames 60 --output ./timelapse/
# Pipe to another tool
$ videre capture /dev/video0 | convert - -resize 50% thumbnail.jpg
Capture flags
| Flag | Description |
|---|---|
--frames N | Number of frames to capture (default: 1). Use 0 for unlimited (Ctrl+C to stop). |
--format FORMAT | Output format: jpeg (default), tiff, raw, native |
--output PATH | Output file or directory. Omit to write to stdout (single frame, jpeg/native only). |
--size WxH | Set frame size before capture |
--pixel-format FMT | Set pixel format (e.g. MJPEG, YUYV) |
--control "NAME=VALUE" | Set a V4L2 control before capture (repeatable) |
--interval DURATION | Delay between frames for timelapse (e.g. 5s, 500ms) |
--skip N | Skip the first N frames before saving (for auto-exposure settling) |
Capture formats
--format | Output | Use case |
|---|---|---|
jpeg (default) | JPEG file | General purpose |
tiff | Lossless TIFF (native bit depth for GREY/Y16) | Scientific, lossless |
native | Camera encoding verbatim | MJPEG/H.264 passthrough |
raw | V4L2 buffer bytes verbatim | Machine vision, post-processing |
For raw and native multi-frame captures, a metadata.json sidecar is written with pixel format, dimensions, and per-frame timestamps. When --frames N with N > 1, frames are written to a directory as frame_000001.jpg, frame_000002.jpg, etc.
Record video
$ videre record /dev/video0 --output clip.avi --size 1920x1080 --limit-mb 500
# Record on a remote machine, stream to local file
$ ssh user@pi "videre record /dev/video0 --duration 60 --output -" > clip.avi
| Option | Description |
|---|---|
--output PATH | Output file (default: timestamped filename in current directory) |
--format mjpeg|raw | AVI codec: compressed (default) or uncompressed RGB24 |
--duration SECONDS | Stop after N seconds (default: unlimited — Ctrl+C to stop) |
--limit-mb N | Stop when file reaches N MB |
--size WxH | Set capture resolution |
--fps N | Set capture frame rate |
--quality N | JPEG quality 1–100 for mjpeg format (default: 85) |
--control "Name=Value" | Set a camera control before recording (repeatable) |
H.264 cameras: The recorder waits for the first IDR keyframe (up to 10 seconds) before writing frames. The --duration timer starts from the first keyframe, so you always get the requested duration of usable content.
Server Options
--port PORT Listen on PORT (default: 8080)
--bind ADDRESS Bind to ADDRESS (default: 127.0.0.1)
--device /dev/videoN Auto-open device on startup
--no-browser Do not open browser automatically
--browser CMD Open with a specific browser command
--no-telemetry Disable usage data collection (paid tiers only)
-h, --help Show help and exit
-v, --version Show version and exit
REST API
Every feature in the web UI is also accessible via HTTP REST and WebSocket — suitable for scripting, automation pipelines, and headless integration.
$ curl localhost:8080/api/stream/start -X POST
$ curl localhost:8080/api/save -X POST -d '{"format":"tiff"}'
$ curl localhost:8080/api/stream/stop -X POST
Full endpoint reference — including WebSocket events, control endpoints, and the diagnostics API — is available in the API Reference.
Pixel Formats
| Format | Description |
|---|---|
MJPEG | Motion JPEG — camera delivers compressed frames |
H.264 | H.264/AVC — decoded via FFmpeg |
YUYV | Packed YUV 4:2:2 |
UYVY | Packed YUV 4:2:2 (byte-swapped) |
NV12 | Semi-planar YUV 4:2:0 |
NV21 | Semi-planar YUV 4:2:0 (UV swapped) |
GREY | 8-bit grayscale |
Y16 | 16-bit grayscale |
RGB24 | 24-bit packed RGB |
BGR24 | 24-bit packed BGR |
SBGGR8 / SGBRG8 / SGRBG8 / SRGGB8 | 8-bit Bayer mosaic (BGGR, GBRG, GRBG, RGGB) — demosaiced to RGB24 via OpenCV |
SRGGB10P / SBGGR10P / SGBRG10P / SGRBG10P | 10-bit packed CSI-2 Bayer (rp1-cfe native output) — demosaiced to RGB24 |
SRGGB12P / SBGGR12P / SGBRG12P / SGRBG12P | 12-bit packed CSI-2 Bayer — demosaiced to RGB24 |
SRGGB10 / SBGGR10 / SGBRG10 / SGRBG10 | 10-bit unpacked Bayer (uint16 LE) — demosaiced to RGB24 |
SRGGB12 / SBGGR12 / SGBRG12 / SGRBG12 | 12-bit unpacked Bayer (uint16 LE) — demosaiced to RGB24 |
Gray World white balance is applied to all Bayer demosaic paths.
Not yet supported
- YUV 4:2:0 planar (YU12 / YV12)
Raspberry Pi 5
Videre supports Raspberry Pi 5 with CSI-2 cameras using the rp1-cfe driver. Supported sensors include the HQ Camera (imx477), Camera Module 3 (imx708), Camera Module 2 (imx219), and others.
Camera discovery
Raspberry Pi cameras appear in the sidebar as a single logical entry — e.g. "Raspberry Pi HQ Camera (imx477)" — rather than individual /dev/videoX nodes. Videre configures the Linux Media Controller graph automatically.
Pipeline modes
| Mode | Description |
|---|---|
| ISP | Routes sensor data through the PiSP hardware ISP, delivering fully processed RGB24 frames with white balance, gamma, and demosaic applied in hardware. Recommended for most use cases. |
| Raw | Routes sensor data directly from rp1-cfe as PISP_COMP1 Bayer frames. Useful for diagnostics; display decoder pending. |
Tuning file selection
On first open in ISP mode, Videre scans /usr/share/libcamera/ipa/rpi/pisp/ for matching .json tuning files and shows a selection dialog. Choose the file that matches your sensor (e.g. imx477.json for the HQ Camera, imx477_noir.json for the NoIR variant). The choice is remembered for the session.
Image Pipeline controls (ISP mode)
| Control | Description |
|---|---|
| AWB | Automatic white balance using hardware statistics from pisp-fe. Gains shown live when enabled. |
| BLC | Black level correction. Value auto-detected from sensor driver (e.g. 4096 for imx477 in 12-bit mode). |
| LSC | Lens shading correction using tuning-backed luminance data. |
| DPC | Defect pixel correction using tuning-backed FE mapping. |
| Denoise | Bayer SDN plus mild CDN when tuning data is available. |
| Sharpen | Conservative first-pass sharpening. |
Feature status
| Feature | Status |
|---|---|
| Camera discovery (Media Controller) | ✅ Supported |
| ISP pipeline (PiSP FE + BE → RGB24) | ✅ Supported |
| Grey-world AWB | ✅ Supported |
| Black level adjustment | ✅ Supported |
| Gamma correction (sRGB) | ✅ Supported |
| Tuning file selection | ✅ Supported |
| CCM (colour correction matrix) | ⚠️ From tuning file if available; identity otherwise |
| Exposure / gain controls | ✅ Available (Generic Device Controls) |
| JPEG snapshots and recording | ✅ Supported |
| Raw Bayer mode (PISP_COMP1) | ✅ Streaming works; display decoder pending |
| Sensor H/V flip (ISP pipeline) | ⚠️ State persists correctly; ISP streaming after flip may fail on current rp1-cfe stack |
| Noise reduction, sharpening | ⚠️ Conservative first pass; further tuning planned |
Limitations
| Limitation | Detail |
|---|---|
| Single camera | Only one camera can be open at a time. |
| Localhost by default | Binds to 127.0.0.1. Use --bind 0.0.0.0 to expose on LAN (no authentication), or SSH port forwarding for secure access. |
| No format change while streaming | Stop the stream before changing pixel format or resolution. No need to close the camera — stopping is sufficient. |
| AVI frame rate | Fixed nominal 30 fps timestamp. Playback speed differs at other capture rates. |
| TIFF / histogram / raw recording | Not available for MJPEG or H.264 cameras (no raw pixel data). Enable any pixel filter to force decompression. |
| Software crop and flip | Display-only — no effect on saved images or recordings. Hardware crop does affect the captured frame and output; UVC ROI affects AE/AF metering only. |
| ROI Analytics | Requires decoded pixel data. Not available for MJPEG in passthrough mode — enable a filter first. |
| No desktop integration | No system tray or native window. Keep the browser tab open, or install as a PWA. By default the server exits when the last tab closes (see Settings). |
| Community Edition connectivity | After 1 hour of cumulative use, a verified internet connection is required to continue. A popup gives up to 3 minutes to reconnect. Paid tiers have no such requirement. |