File Transfer over HDMI , turn a file into a video signal. Rebuild it on another computer with a capture card.
Quick start · Transfer speeds · Installation guide · Hardware setup · FAQ
HDMI Transfer encodes files into video frames displayed through an HDMI output. On the receiving computer, an HDMI-to-USB capture card captures those frames so the software can reconstruct the original file. The file payload travels through video; no network file share is required.
A browser-based sender, a USB capture-card receiver, fountain codes and a local Python/Flask web interface work together to move files between two computers.
Proof of concept (POC): this is an experimental project for demonstrating file transfer over HDMI video.
- Choose a file in the browser sender or through the command line.
- Display the encoded frames full-screen on the HDMI output connected to the capture card.
- Receive through the local interface, then download the reconstructed file.
- Video transport: move a file between two computers using HDMI and a USB capture card.
- Standalone sender: open
sender.htmllocally in a browser, with no Python installation on the sending computer. - Browser-based reception: select a capture device, preview the signal, track progress, download files and browse history.
- Fountain codes: reconstruct a file from enough packets, even when some video frames are lost.
- Explicit settings: choose Balanced, Speed or Quality profiles and configure the encoding.
- CLI tools: send, receive, calibrate and benchmark for reproducible experiments.
docker compose up --build -d --waitdocker compose stop # Stop; keep received files
docker compose start # Start againInstall Git and uv, then open a terminal:
git clone https://github.com/Thunzyy/HDMI-transfer.git
cd HDMI-transferWindows — PowerShell or terminal:
.\start.batLinux / macOS — shell:
sh start.shThe launchers install web dependencies into .venv, then start the server. The first launch requires access to dependency downloads. Open http://localhost:5000 and keep the terminal open. Stop the server with Ctrl+C.
Windows is the automated quality-gate platform. A POSIX launcher is provided for Linux/macOS; capture-card and driver compatibility must be checked on each system.
Manual commands, without a launcher
uv sync --locked --extra web
uv run --no-sync hdmi-web- Connect sender PC HDMI output → capture card HDMI input → receiver PC USB port.
- Copy
sender.htmlto the sending computer using an authorized method, then open it in a browser. It runs in offline mode by default. - On the receiver, open Receive, choose the capture card and select Fountain · Balanced · 2 bpc · Preview Low.
- On the sender, choose a small test file and match the receiver’s protocol, profile and encoding settings.
- Move the sender window to the display connected to the capture card. Click Start on the receiver, then Start transmission on the sender. The signal must fill the captured display.
- Once reception is complete, use Download on the receiver. Stop the sender if it is still transmitting.
Need to load the sender over a LAN or test on a single PC? The step-by-step guide covers both options, display settings and common problems.
| Goal | Setup |
|---|---|
| Two PCs with no shared network | Local sender.html + local web receiver |
| Load the sender from the receiver on a trusted LAN | Start the server with --host 0.0.0.0, then open http://RECEIVER_IP:5000/sender |
| Test on one PC with an HDMI capture card | /sender/test — explicit local test mode |
| Automate sending or receiving | CLI commands |
LAN mode uses the network to serve the interface. To avoid any network dependency between the two computers, prepare the standalone HTML file in advance. The local server exposes received files: restrict LAN access to a trusted network.
| Profile | Resolution | Target FPS | When to use it |
|---|---|---|---|
| Balanced | 1920 × 1080 | 60 | Recommended for your first transfer |
| Speed | 1920 × 1080 | 240 | A high-refresh-rate HDMI path and compatible capture card |
| Quality | 3840 × 2160 | 30 | Experiments with a 4K-compatible chain |
Selecting Speed does not turn a 60 Hz capture card into a 240 Hz device. See calibration and signal checks.
The following are theoretical encoded-payload ceilings, not measured file-transfer speeds. They use Fountain, 2 bits per RGB channel, 8 × 8 pixel blocks, and assume every frame reaches the receiver at the stated cadence.
| Profile | Resolution / effective FPS assumed | Payload per frame | Theoretical MB/s | Theoretical Mbps |
|---|---|---|---|---|
| Balanced | 1920 × 1080 / 60 | 24,284 bytes | 1.46 | 11.66 |
| Speed | 1920 × 1080 / 240 | 24,284 bytes | 5.83 | 46.63 |
| Quality | 3840 × 2160 / 30 | 97,184 bytes | 2.92 | 23.32 |
Actual useful-file throughput is lower because of Fountain redundancy, frame loss, calibration, decoding and file reconstruction. The browser caps sending to the detected display refresh rate: Speed on a 60 Hz path has the same theoretical ceiling as Balanced at 60 FPS. The capture card and receiver must also keep up. HDMI link bandwidth is not the file-transfer speed.
For a hardware measurement, transfer a known file, verify its SHA-256 result, and divide its size by the receiver's reported transfer duration. Include setup/calibration time separately when measuring total user wait time. Software benchmarks and Docker smoke tests do not measure HDMI throughput; the table above is not a hardware benchmark.
Scale comparison only, not a head-to-head benchmark.
| Connection / example configuration | Rate (Mbps) | Equivalent MB/s |
|---|---|---|
| Bluetooth Classic, EDR 3 Mb/s mode | 3 | 0.375 |
| HDMI Transfer — Balanced | 11.66 | 1.46 |
| HDMI Transfer — Quality | 23.32 | 2.92 |
| HDMI Transfer — Speed | 46.63 | 5.83 |
| Wi-Fi 6 — Intel AX203, 2×2 | 1,200 | 150 |
| USB 3.2 Gen 1 — USB 5Gbps | 5,000 | 625 |
HDMI Transfer demonstrates a video-based file channel when a shared network is unavailable. For routine large-file transfers, a working Wi-Fi/Ethernet connection or suitable USB storage is generally a more practical choice.
The receiving computer needs an HDMI input. Most PC HDMI ports are outputs, so an HDMI-to-USB capture card is required.
Initial installation downloads dependencies. After setup, the file payload travels over HDMI. A local HTML sender and an already-installed receiver can operate without a shared network.
Video encoding and fountain codes are not encryption. Encrypt the file before sending it if confidentiality is required.
See Transfer speeds: the recommended Balanced configuration has a theoretical ceiling of 1.46 MB/s (11.66 Mbps) at 60 FPS. Actual file throughput depends on your hardware and protocol overhead; this POC does not guarantee that speed.
Check the capture source, close other applications using the card, verify the correct HDMI display and return to Fountain + Balanced + 2 bpc on both sides. See troubleshooting.
Licensed under the MIT License. Copyright (c) 2026 Thunzyy.
