Decimen streams your file as a live loop of QR frames. A phone camera on the receiver page decodes them and reassembles the file using Luby Transform fountain codes — so it doesn't matter which frames you catch, or in what order. Miss a few, keep watching, done.
Screen → camera is a lossy, unreliable channel. Fountain codes turn that into a strength: the sender emits a rateless stream, the receiver can join late, drop frames, and still decode.
The sender doesn't need to know how much data you'll catch. It keeps emitting new symbols forever — every one useful.
Start the camera whenever. There's no "chapter 1" you have to see first — every QR frame contributes to reconstruction.
No LAN, Bluetooth, USB, or cloud. Two devices in the same room. The only shared substrate is light.
Under the hood: LT (Luby Transform) codes with a Robust Soliton degree distribution, packed into QR v20-L Byte-mode frames.
K equal blocks (default 768 bytes each).d from the Robust Soliton distribution and XORs d random source blocks together.canvas at your chosen FPS. It loops forever until you stop.jsQR, ingests each unique frame into an LT decoder.K blocks are recovered.10 MB in the MVP. The LT decoder scales linearly; the ceiling is set by browser memory + how long you're willing to hold your phone.
QR v20-L Byte mode carries ~858 bytes. At 15 FPS effective capture that's ~12 KB/s goodput after overhead + duplicates.
Frames that don't scan cleanly are just skipped — fountain codes tolerate arbitrary loss. Corrupt-but-decodable QR frames are caught by the magic header check.
The file never leaves your two devices. There is no server, no analytics, no upload. Static HTML + JS.
Every frame carries the session ID, K, block size, file size, seed, filename, and MIME. Receivers can join any live stream mid-transmission.
All source is in sites/decimen/ of the Biz Dev App repo. LT encoder + decoder are ~350 lines of vanilla JS.