Your file is never uploaded: it leaves one device as light on a screen and enters the other through its camera, with no server in between.
Drop a file here or pick one with the button. Up to 2.0 MB, chunked and animated on this screen for the other device's camera to read.
Related tools
- QR Code ScannerScan a QR code with your camera or from an image, even when it is small, blurry, warped, or partly covered, and read the decoded link, Wi-Fi login, contact, or location without leaving the page.
- QR Code GeneratorGenerate SVG and PNG QR codes with a center logo, from links, Wi-Fi, contacts, email, SMS, maps, and calendar events.
- Terminal QR CodePrint a scannable QR code as unicode blocks, right in your terminal.
- Barcode GeneratorGenerate Code 128, EAN, UPC, Code 39, ITF-14 and Codabar barcodes as SVG, on their own or laid out on a print ready label sheet.
- Local File DropSend files straight from one browser to another over WebRTC, on the same Wi-Fi or across the internet, with no upload in between.
- Morse, DTMF and Audio DataTranslate Morse, generate and read DTMF keypad tones, and send text between devices through a speaker.
What it does
Turns a file into a stream of QR codes that animate on one device's screen while another device reads them back through its camera, with no cable, no Wi-Fi, no Bluetooth and no account in between. The sender splits the file into chunks, wraps each one in a header carrying the transfer id, the chunk index, the total size and a CRC32 checksum, and paints them as codes at up to 20 frames per second. The receiver scans, checks every frame, rebuilds the file and offers it as a download. The default fountain mode uses LT erasure coding, so a camera that misses half the frames still finishes without you replaying anything.
How to use it
Open the tool on the sending device, drop in the file, pick a code size and press play. Open the same page on the receiving device, switch to the Receive tab and point its camera at the first screen. Watch the progress bar climb; when it reaches the end the file appears with a save button and the original name. If frames are being missed, move the camera closer, lower the frame rate, or drop the code size so each code has fewer modules.
Why this one
Getting a file off a machine with no network is normally a story about USB sticks, and plenty of places ban those for exactly the reason you would want one. The alternatives online either upload your file to somebody's server first or are desktop apps you have to install on the very machine you are trying not to connect. This runs entirely in two browsers with no server between them: your files and inputs never leave your device, because the only channel is a screen and a camera. It is also honest about throughput, which is roughly one to three kilobytes per second in practice, and it tells you the estimated time before you start rather than after.
FAQ
- How fast is it really?
- Plan on one to three kilobytes per second. A version 15 code at error correction M carries about 410 characters, which after the base64url encoding and the frame header is roughly 275 bytes of payload, and a phone camera reliably locks onto around 8 to 12 frames a second. That is fine for a config file, an SSH key, a wallet backup or a small archive, and it is the wrong tool for a video. The tool estimates the time up front so you can decide before you start.
- What happens when the camera misses frames?
- In fountain mode, nothing. Each frame after the first pass carries an XOR of a pseudo random set of chunks chosen from a seed both sides derive from the frame header, so any sufficiently large collection of frames rebuilds the file, no matter which ones were missed or what order they arrived in. You just keep pointing the camera until the progress bar fills. Sequential mode is the simpler alternative: it loops through the chunks in order and the receiver picks up whatever it missed on the next pass.
- Is anything uploaded or sent over the network?
- No. The file is chunked, checksummed and encoded into QR codes by JavaScript running on the sending device, and decoded by JavaScript running on the receiving one. There is no server in the middle and no request carrying your data, because the data never becomes a request: it crosses the gap as light from a screen into a lens. That is also the honest security caveat. Anything with a view of the screen can read the stream, so treat it like holding a printed page up to a window.
Keyboard shortcuts: press ? anywhere on this page to see them.