A minimal, zero-dependency video viewer for JetKVM devices. Strips the full KVM UI and displays only the HDMI video feed at 100% viewport size — ideal for embedding in dashboards or iframes.
Open public/index.html in a browser with a ?host= parameter:
public/index.html?host=<JETKVM_IP>
docker run -d -p 8080:80 ghcr.io/alexluckett/jetkvm-video-proxy:latestThen open http://localhost:8080/?host=<JETKVM_IP>
| Parameter | Required | Default | Description |
|---|---|---|---|
host |
Yes | none | JetKVM device IP or hostname |
<iframe
src="http://your-server:8080/?host=<JETKVM_IP>"
style="width: 100%; height: 100%; border: none;"
allow="autoplay"
></iframe>- Opens a WebSocket to the JetKVM signalling endpoint (
/webrtc/signaling/client) - Receives device metadata, then creates a WebRTC offer (video receive-only)
- Exchanges SDP and ICE candidates with the device
- Renders the H.264 video stream in a full-viewport
<video>element
No keyboard, mouse, or control signals are sent. This is a view-only connection.
- Zero dependencies — single HTML file with inline CSS and JS
- Auto-reconnect: exponential backoff (1s to 30s) on connection loss
- Cross-origin: works when served from a different host than the JetKVM device
- Stretch-to-fill: video uses
object-fit: fillto cover the entire viewport
- JetKVM device running firmware v0.4+ with WebRTC support
- Modern browser with WebRTC support (Chrome, Firefox, Safari, Edge)
- Network access from the browser to the JetKVM device (WebSocket + WebRTC)
| Symptom | Likely Cause | Fix |
|---|---|---|
| Black screen, no console logs | Wrong device IP | Verify ?host= parameter matches the JetKVM device IP |
| Black screen, "WebSocket error" in console | Device unreachable or firmware too old | Check network connectivity, ensure firmware v0.4+ |
| Video doesn't autoplay | Browser autoplay policy | Ensure muted attribute is present (it is by default); some browsers require a user gesture for iframes, so add allow="autoplay" to the iframe tag |
| No video when served over HTTPS | Mixed content blocked | Browsers block ws:// from https:// pages. Serve the page over HTTP, or use a reverse proxy that terminates TLS and connects to the JetKVM over plain WS internally |
| Reconnect loop every few seconds | JetKVM busy with another session | Only one WebRTC session at a time per device; close other tabs/clients |
Browser ──WebSocket──▶ JetKVM Device (:80/webrtc/signaling/client)
Browser ◀──WebRTC───▶ JetKVM Device (H.264 video, peer-to-peer)
The browser connects directly to the JetKVM device. No proxy server is required.