FAQ
Frequently asked questions
Sending files between two devices with no internet, no cable and no account — and the honest limits of doing it optically.
Also available as Markdown for LLMs and scripts.
How do I transfer a file between two devices without internet?
Open this page on both devices, pick a file on the sender, and point the receiver’s camera at the sender’s screen. The file travels as an animated QR code stream — light between a screen and a lens — so no internet, Wi-Fi, Bluetooth, or cable is involved at any point.
The page itself does need to load once. After that it works fully offline, so you can open it while you still have a connection, disable every radio, and complete the transfer with both devices isolated.
What is air-gapped file transfer?
An air gap is a deliberate physical separation between a device and any network. Air-gapped file transfer means moving data across that separation without bridging it — historically with a USB stick, which is exactly the thing most locked-down environments forbid, because a USB device can carry executable payloads and firmware attacks.
An optical QR stream is a strictly one-way, data-only channel: the receiving device gets nothing but pixels through its own camera, and there is no path back to the sender at all. Nothing is plugged in and no network is joined.
Is QR code file transfer secure and private?
Your file is never uploaded, so there is no server copy to leak, subpoena, or breach. It is read by your browser, turned into QR codes, and reconstructed by the other browser. No account, no logging, no telemetry, no third-party requests.
The honest caveat: this is privacy through locality, not encryption. A QR code on a screen is readable by any camera with line of sight, so do the transfer somewhere you would be comfortable holding the document up. If you need confidentiality against an observer in the room, encrypt the file before sending it.
What is the maximum file size?
64 MiB, and that limit is measured rather than guessed. Preparing a transfer holds three full-size copies of the data in memory at once, a measured 3.0x peak multiplier, and mobile Safari terminates a tab well before the numbers a larger cap would require.
In practice the useful ceiling is lower than the hard one. Documents, PDFs, keys, configs, spreadsheets and photos are comfortable. A video file is technically possible and practically a bad idea — at 37.6 KB/s a 50 MB file takes over twenty minutes of holding a phone steady.
How long does a transfer take?
At the default Standard profile the raw optical rate is 37.6 KB/s, so roughly 40 KB per second in good conditions. A 100 KB document takes a few seconds; a 5 MB photo takes a couple of minutes.
Real throughput depends on your screen brightness, camera quality, distance, and how steadily the code is held in frame. Missed frames cost time but never correctness — the fountain code simply needs enough symbols, not any specific ones.
Which devices and browsers does it work between?
Any two devices where one has a screen and the other has a camera, in any combination: iPhone to Windows laptop, Android to Mac, Linux to iPad, phone to phone. Both sides are just a web page, so the two devices do not need to share an ecosystem, an account, or a network.
It needs a current browser — Chrome, Edge, Safari or Firefox — with camera access on the receiving side. Camera access requires HTTPS (or localhost), which is a browser rule, not a choice this app makes.
Do I need to install an app?
No. It runs entirely in the browser with nothing to install, no account to create, and no pairing step. You can optionally add it to your home screen as a PWA, which caches it for offline use, but that is a convenience rather than a requirement.
Why an animated QR code instead of one static code?
A single QR code holds about 3 KB at most, which is not enough for a real file. Streaming many codes turns that hard ceiling into a bandwidth figure instead.
The reason it is a fountain-coded stream rather than a numbered sequence is that cameras drop frames constantly and there is no way to ask for a retransmission over a one-way channel. With a fountain code the receiver only needs enough symbols, not specific ones, so dropped frames cost a little time and nothing else.
What happens if the camera misses frames or I start scanning late?
Nothing breaks. The sender loops forever, and every symbol is independently derivable from the stream’s seed, so the receiver can join at any point, take frames out of order, and miss any subset. It simply keeps collecting until it has enough.
If the receiver is starved of frames it reports the transfer as incomplete and refuses to hand over a partial file. A truncated file that looks successful is the one outcome worse than a failed transfer.
How is this different from AirDrop, Nearby Share, or a LAN transfer tool?
Those all need the two devices to reach each other over a radio or a network — and usually to be in the same ecosystem. AirDrop is Apple-to-Apple, Nearby Share needs Bluetooth and Google services, and LAN tools need both devices on one network with a route between them.
This needs none of that. It works when radios are disabled, when the network blocks peer-to-peer traffic, when the two devices are from different vendors, and when the receiving machine is deliberately air-gapped. In exchange it is much slower, which is the trade.
Does it really work with Wi-Fi and mobile data turned off?
Yes, after the page has loaded once. A service worker caches the app shell and the QR decoder, and the app audits that cache rather than assuming — the offline badge reports what is genuinely present, including whether the decoder is cached, because a page that loads without its JavaScript is an empty shell that would fail at the moment you press the button.
Is it free and open source?
Yes. It is MIT-licensed and the full source is on GitHub. There is no paid tier, no sign-up, and no telemetry. You can self-host it, audit it, or fork it.
Can I self-host it or run it on an isolated network?
Yes, and that is a first-class use case. The build output is static files with no server-side code, so npm run build and any static file server is enough — including one running on a laptop with no internet connection at all.
What file types can I send?
Any of them. The transfer is byte-exact and content-agnostic: documents, images, archives, keys, certificates, configs, binaries. The file is compressed before streaming, so text-shaped files move faster than already-compressed ones, but nothing is ever interpreted or transformed.
Do both devices need a camera?
No, only the receiving device. The sender just needs a screen. That is what makes desktop-to-phone work on a machine with no webcam, and it is why the transfer is one-way — there is no reverse channel from receiver to sender.