← Back to QR File Transfer
Guide

QR File Transfer — How to Use

Everything you need to successfully transfer a file between two devices using QR codes — step-by-step instructions, tips, and how it works under the hood.

📖 Step-by-Step Guide

📤 DEVICE A — SENDER
1
Open ihaveall.com/qr-file-transfer in your browser. Stay on the Send tab.
2
Drop your file into the box or click Browse to pick it. Max 5 MB.
3
Optional: check Encrypt and enter a passphrase for AES-256 encryption. Share the passphrase with the receiver out-of-band.
4
A QR code starts flashing on screen. Keep this page open and visible — don't lock the screen.
5
Adjust the speed slider — lower fps if receiver is missing frames, higher fps for faster transfer.
6
Hold the phone/laptop steady and maximise screen brightness for best results.
📥 DEVICE B — RECEIVER
1
Open ihaveall.com/qr-file-transfer on the second device. Switch to the Receive tab.
2
Tap Start Camera and allow camera permission when prompted.
3
Point the camera at the sender's screen. Align the QR code inside the purple guide box.
4
Watch the progress bar and ETA fill up. The screen flashes green each time a frame is read — you don't need to catch every frame.
5
If the file was encrypted, enter the passphrase when prompted to decrypt.
6
Once 100% — SHA-256 is verified automatically — tap Download File.

💡 Tips for Best Results

✅ Maximise screen brightness on sender — dark screens cause missed frames
✅ Hold steady — camera blur is the #1 reason for slow transfer
✅ Good lighting on receiver side — avoid pointing at a bright window behind you
✅ 30–50 cm distance between screen and camera works best for most phones
✅ Missed frames are fine — fountain coding fills gaps automatically
✅ Works completely offline after the page has loaded once
✅ Use Text mode for short links or passwords — generates a single static QR instantly
✅ Files over 500 KB are auto-compressed before encoding to speed up transfer
⚠️ Reduce fps to 3–4 if scanning in low light or on an older phone
⚠️ Not encrypted by default — check Encrypt and set a passphrase for sensitive files

⚙️ How It Works (Technical)

1
SHA-256 + block split: The browser computes the file's SHA-256 hash, then splits the file into fixed 350-byte source blocks (K blocks total). Large files are auto-compressed with deflate-raw first.
2
Optional AES-256-GCM encryption: If enabled, PBKDF2 (100,000 iterations, SHA-256) derives a 256-bit key from your passphrase. The payload is encrypted with AES-GCM before fountain encoding. The salt + IV are prepended to the ciphertext.
3
Fountain / LT coding: Each QR frame carries an encoded block = XOR of 1–4+ randomly chosen source blocks. The seed that chose them is stored in the frame. This is called a Luby Transform (LT) code — a rateless erasure code that generates an infinite stream of unique encoded blocks.
4
Receiver collects blocks: Frames can arrive in any order, and missed frames are harmless. The receiver only needs ~K × 1.1 unique frames (10% overhead) to decode all K source blocks.
5
Belief propagation decoder: Degree-1 frames reveal a source block directly. That block is XORed out of all other frames that contained it, reducing their degree. This cascades (peeling) until all K source blocks are recovered.
6
Decrypt + decompress: If the file was encrypted, the receiver prompts for the passphrase, derives the same key via PBKDF2, and decrypts with AES-GCM. If compressed, it decompresses with DecompressionStream.
7
SHA-256 verification: Before the download button appears, the rebuilt file is hashed using the browser's built-in Web Crypto API and compared against the hash embedded in the metadata frames. Mismatch = rejected automatically.
8
Zero network: The entire pipeline — encoding, QR generation, camera scanning, decoding, hash check — runs in the browser. No data touches a server at any point.

❓ Frequently Asked Questions

How long does it take to transfer a 1 MB file?
At 6 fps with 350-byte blocks, a 1 MB file has ~3000 blocks × 1.1 overhead = ~3300 frames. At 6 fps that's ~9 minutes. Raise fps to 12 to cut it to ~4 minutes. Use compression for large files — text-heavy files often compress 60–80%, halving transfer time.
Do I need to catch every QR frame?
No. Fountain coding means the receiver can miss frames randomly and still decode the file. You only need ~10% more unique frames than the number of source blocks. The sender loops the stream continuously.
How secure is the encryption?
AES-256-GCM with PBKDF2 key derivation (100,000 iterations, SHA-256) is considered strong. The security depends entirely on your passphrase strength. A random 6-word passphrase is recommended. The passphrase itself is never transmitted — only the encrypted bytes appear in QR frames.
Why can't I use this for files larger than 5 MB?
Larger files produce thousands of QR frames, making transfer impractically slow via camera scanning. For larger files, use AirDrop, a USB cable, or a cloud link. QR transfer shines for small files in environments where those options aren't available.
Does this work offline?
Yes — once the page has loaded, all processing is local. The only external call after initial load is lazy-loading the qrcode.js library on first use. On a cached page (or saved PWA), it works with zero internet access.
What is Text mode for?
Text mode generates a single static QR code (no stream, no fountain coding) from text or a URL up to 500 characters. It's readable by any camera app or QR scanner app — useful for sharing Wi-Fi passwords, URLs, or contact info between nearby devices.

📌 When Is This Useful?

🏢
Air-gapped networks
Move a file from an internet-connected laptop to an isolated secure machine with no USB allowed
🚫
No shared network
Two phones on different networks, or a phone and a PC with no USB cable
✈️
No internet at all
Works on a plane, in a basement, on a ship — anywhere once the page is cached
🔒
No accounts / pairing
No AirDrop setup, no Bluetooth pairing, no Google account — just open the page
🔐
Encrypted transfer
Send a sensitive document with AES-256 encryption and share the passphrase verbally
🔗
Quick link or password
Use Text mode to share a URL or Wi-Fi password as a single QR anyone can scan
Open QR File Transfer →