Send a file between two devices using only a screen and a camera — no network, no pairing, no accounts, no app to install.
Live page: https://kaklaber.github.io/Phos/
- Open the page on both devices.
- The receiving device presses Receive and points its camera at the other screen.
- The sending device presses Send and plays the file as an animated stream of QR frames.
- At 100% the receiver verifies the checksum (SHA-256) and offers the file for download.
The stream is fountain-coded: frames may be missed and the transfer still completes — the sender simply keeps looping until the receiver has enough data.
- Any file up to 64 MB, or pasted text
- Everything runs locally in the browser — nothing is uploaded, no tracking, works offline once the page is loaded
- A single self-contained HTML file; hostable on any static host
- QR decoding via zxing-cpp compiled to WebAssembly, across multiple worker threads
- Tunable: frame size (180–2900 B), frame rate, 1 / 2×2 / 3×3 code grid, QR error-correction level, display size (incl. fill-screen), camera resolution (480p–4K) and scan rate (up to 60 fps)
- A modern browser (Chrome, Firefox, Safari) on both devices; the receiving device needs a camera.
- The page must be served over https (or localhost) — browsers only grant camera access in a secure context.
- Not encrypted. Anyone who can see the sending screen can read the data, so don't use it for secrets in public.
- qrcode-generator — © 2009 Kazuhiko Arase, MIT
- zxing-wasm 3.1.2 / zxing-cpp — MIT / Apache-2.0
Third-party copyright notices are retained inside index.html.
MIT — see LICENSE.
