Decimen
Fountain-QR file transfer · airgap-friendly

Move a file from a screen to a phone — with nothing but a camera.

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.

Open sender → Open receiver

01Why fountain-coded?

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.

R

Rateless

The sender doesn't need to know how much data you'll catch. It keeps emitting new symbols forever — every one useful.

L

Late-joining

Start the camera whenever. There's no "chapter 1" you have to see first — every QR frame contributes to reconstruction.

A

Airgap-friendly

No LAN, Bluetooth, USB, or cloud. Two devices in the same room. The only shared substrate is light.

02How it works

Under the hood: LT (Luby Transform) codes with a Robust Soliton degree distribution, packed into QR v20-L Byte-mode frames.

  1. Sender splits your file into K equal blocks (default 768 bytes each).
  2. For each output frame it picks a degree d from the Robust Soliton distribution and XORs d random source blocks together.
  3. The 32-bit PRNG seed is put in the frame header so the receiver reproduces the same random selection deterministically.
  4. Sender renders the frame as a QR code on canvas at your chosen FPS. It loops forever until you stop.
  5. Receiver reads webcam frames with jsQR, ingests each unique frame into an LT decoder.
  6. The decoder peels degree-1 symbols against known source blocks, cascading until all K blocks are recovered.
  7. Once complete, the receiver assembles the file with the original filename + MIME (both carried in every frame's header) and offers a download.

03Specs & limits

Max file size

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.

Throughput

QR v20-L Byte mode carries ~858 bytes. At 15 FPS effective capture that's ~12 KB/s goodput after overhead + duplicates.

Error handling

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.

Privacy

The file never leaves your two devices. There is no server, no analytics, no upload. Static HTML + JS.

Protocol

Every frame carries the session ID, K, block size, file size, seed, filename, and MIME. Receivers can join any live stream mid-transmission.

Open

All source is in sites/decimen/ of the Biz Dev App repo. LT encoder + decoder are ~350 lines of vanilla JS.