A lightweight video input viewer — OBS without the complexity. View and manage capture card feeds with a clean, simple interface designed for users who need to display video inputs without the overhead of full streaming software.
Dual view with the dropdown open: per-side input selection, per-input and system volume, and the centre divider between the two feeds.
Download the latest release for your platform:
- macOS: Input Viewer.dmg
- Windows: Input Viewer Setup.exe
The app includes auto-updates and will notify you when new versions are available.
Note: Releases live in this repository. The separate
LAB271/input-viewer-releasesrepo is retired — it stopped receiving builds at v2.5.2 and is no longer authoritative. The in-app auto-updater also points here, so downloads and updates come from the same place.
- Multi-input display — View one or two video feeds side by side
- Layout switching — Dual view or single feed centered
- Direct input selection — Number keys 1-4 to switch inputs instantly
- Freeze frame — Pause any feed with Space key
- Settings panel — Configure inputs with toggle switches
- No-signal detection — Custom overlay when source disconnects
- DVD screensaver — Bouncing logo when feeds lose signal
- Fullscreen support — Designed for dedicated display setups
- Auto-updater — Automatic updates from GitHub releases
- Any capture card — Works with any video capture device
| Key | Action |
|---|---|
D |
Dual view (both feeds) |
S |
Single view (selected feed centered) |
1-4 |
Select input directly |
Space |
Freeze/unfreeze current feed |
F11 / F |
Toggle fullscreen |
Escape |
Exit fullscreen |
Q |
Quit |
Hover over the top edge to reveal the settings dropdown panel.
Click the ⚙ gear icon to open the settings panel:
- Toggle inputs on/off
- Set default input (shown at startup)
- Rename inputs for easy identification
- Adjust center gap between feeds
- Adjust border width on sides
- Changes are saved automatically
Settings are stored in the app's user data directory — the Settings panel shows the exact path. Inputs are keyed by capture device id, since index order is not stable across reboots:
{
"leftDeviceId": null,
"rightDeviceId": null,
"layoutMode": null,
"centerGap": 60,
"borderWidth": 0,
"inputs": {
"<capture-device-id>": { "name": "Laptop", "enabled": true }
}
}settings.example.json in the repo root lists every
key with its default. It is documentation only; the app does not read it.
- Node.js 24+ (the active LTS, and what CI builds on; Electron and the test tooling both require newer than 20)
- npm
cd input_viewer_electron
npm install
npm run dev # Development mode with hot reload
npm run build # Build for productionnpm run build:mac # Build macOS DMG
npm run build:win # Build Windows installerWorks with:
- Any capture card — USB or PCIe capture devices
- Any display — adapts to your screen resolution
- Platforms: macOS, Windows
Optimised for ultrawide. It runs on any resolution, but the defaults are
tuned for very wide displays: on a screen with an aspect ratio of 3:1 or wider
it starts in dual view (two feeds side by side), and on anything narrower it
starts in single view. The reference deployment is a 6000×1200 projector
videowall, which is also what the screensaver scaling in
src/renderer/screensavers/gl-base.js is calibrated against.
| Path | What it is |
|---|---|
input_viewer_electron/ |
The application. Everything that ships is here. |
docs/USER_GUIDE.md |
End-user guide: booth setup, shortcuts, troubleshooting. |
remote_keyboard/ |
Arduino sketch (ESP32-S3) for the optional Remote Keyboard feature. Receives HTTP requests from the app over WiFi and emits USB HID keypresses to a presenter PC. Flash it separately; the app works without it. The WiFi credentials and API key in the sketch are placeholders to fill in before flashing. |
spikes/ |
Standalone HTML design prototypes (no-signal screen, dropdown/settings, an OpenCV detection experiment). Not built, shipped, or maintained — kept as a visual reference for how those screens were designed. |
settings.example.json |
Documented example of the settings file. Reference only; the app reads its own copy from the user data directory. |
The original Python implementation was removed in v2.6.0 (it carried a GPL dependency). It remains available in the v2.5.3 source tree but is no longer maintained. Use the Electron version for the best experience.
See CONTRIBUTING.md.
Please report vulnerabilities privately, not as a GitHub issue. See SECURITY.md.
Copyright 2025-2026 Schuberg Philis B.V.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the License in LICENSE or at https://www.apache.org/licenses/LICENSE-2.0.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
