Settings
Rate: 15 FPS · Frame: 0 / 0
Ready to send
How it works

How the payload actually crosses

The text is split into chunks of 110 bytes. Each chunk is base64-encoded and wrapped in a short header (a protocol marker, this frame's number, how many frames there are in total, and a CRC32 of the whole original payload), and each of those becomes a real QR symbol, drawn from the ISO/IEC 18004 encoder on this site. The frames play in a loop on the screen.

The receiving device points its camera at that screen and decodes the symbols with BarcodeDetector, which is the browser's own barcode API rather than something written here and marked as its own homework. Frames arrive in whatever order the camera catches them, are filed by sequence number, and duplicates are dropped. When every number from one to the total is present they are joined in order and the CRC32 is recomputed. If it does not match, nothing is shown at all: a partly corrupted key is worse than no key, because you would use it.

The chunk size is deliberately modest. A QR symbol carrying less data has fewer, larger modules, and larger modules are what a phone camera can resolve across a desk in ordinary room light. Pushing more bytes into each frame makes the transfer shorter on paper and unreadable in practice.

What an air gap is worth, and how people lose it

The point of keeping a machine off the network is that a machine with no network connection cannot be reached over one. The moment you plug in a USB stick to move a file, you have made a connection: a slow one with high latency, and a real one. Every significant attack on an air-gapped system has crossed it the same way, on removable media, because that is the only path there is.

Light across a room is a narrower path. The receiving device gets pixels through a camera and nothing else: no filesystem is mounted, no driver is loaded for a device of unknown provenance, no autorun, no firmware on the far end of a cable. What can cross is the bytes in the frames, which is what you wanted to cross.

The rest of the air gap is yours to keep. A camera pointed at a screen is readable by any other camera pointed at the same screen, so this is a transfer for a room you control, not a transfer that is private in itself. If the payload would matter in the wrong hands, encrypt it with CIPHER first and send the armour block across: then the frames carry ciphertext and a photograph of your screen is worth nothing.

The self-test says what it is

The loopback check renders the frames and reads them back through the same decoder on the same machine. That proves the encoder and the decoder agree and that this browser can do both, which is genuinely worth knowing before you carry a laptop into another room.

It is not an optical hop and it is not described as one. An earlier version of this page had a button called “Simulate Ingest From Buffer” that copied the text straight out of the transmitter's own textarea into the output box, over a grid of hand-drawn squares that looked like a QR code and that no scanner on earth could read. Nothing optical ever happened. The frames on this page are real symbols and the receiver is a real camera; the self-test is labelled separately because the difference is the entire value of the tool.

For the codes themselves, QRMAKER makes one that never leaves the machine and QRSHIELD shows you where a code points before you follow it.

Doing this often? The OBSCURA Sovereign Suite seals files so that only the person with the passphrase opens them, and checks files before they are opened. On its own, US$4 a month; with everything else, US$9 a month or US$79 a year. 7 days free.