Move a file between two machines that share no network, no cable and no back channel — one shows QR symbols on its screen, the other watches with a camera.
airgap send report.pdf --fps 10 --prerender --redundancy 8 --loops 0
airgap receive --out ./receivedThe receiver checks SHA-256 and says so. Nothing else counts as success.
A rateless fountain code carries the payload, so the sender never runs out of symbols and a receiver that joins late or misses most of what it sees still finishes. Everything it needs — filename, size, hash, codecs — travels inside the stream, so there is nothing to configure at the far end.
QR is the first transport, not the only possible one: the protocol core does not know a camera exists.
5 MB across a camera in 207 seconds — 23.62 KB/s, SHA-256 verified, byte-identical. A laptop screen at QR v40 and 15 fps, read by a phone acting as the webcam.
That is verified goodput: bytes that hashed correctly, over wall time, with error-correction overhead charged against it — not the symbol-payload-times-frame-rate figure most similar projects quote. See Comparison for why the two are not the same number.
- Results — every measured transfer, SHA-256 verified
- Comparison — how this stacks against similar projects, honestly
- Usage — install, the commands, and the four things that make it work
- How it works — the protocol, the physics, and what it costs
- Architecture — how the code is put together
python3.12 -m venv .venv
.venv/bin/pip install -e ".[visual]"
.venv/bin/pytest tests/ -q # 678 tests, no hardware neededThe receiver needs camera permission — on macOS the first run prompts for it. See Usage.
MIT licensed.