Open protocol · No network · Web, iPhone, Android, desktop

Turn files into
moving light

The sender plays your file as an animated colour code; the receiver films it and rebuilds the file. No network, Bluetooth, pairing or account is needed.

Free in the browser. Apps for iPhone and Android: US$2.99, coming soon.

Photosensitivity warning: while sending, the code flashes up to 60 times a second. If flashing light affects you (e.g. photosensitive epilepsy), don’t look at it.

One real Lumen Code frame, still. While sending, frames like this change 12–60 times a second.
A phone receiving a file
  • No network
  • No pairing, no account
  • Files never touch a server
  • Protocol 1.0, frozen
  • MIT licence

How it works

Data goes one way, from screen to camera, so the receiver can start at any time and can miss frames.

  1. holiday-photos.zipyour file
  2. Fountain codea stream of new packets
  3. Colour frames12–60 a second
  4. Cameraany order, any gaps
  5. holiday-photos.zipchecked, byte for byte
  1. 1

    Open Send

    On the device that has the file, choose the file or type a message. The screen plays the code, sized for that screen.

  2. 2

    Point a camera

    Open Receive on the other device and point its camera at the screen. Three of the four corners are enough.

  3. 3

    Hold steady

    Every frame carries new data, so a missed or blurred frame only makes the transfer a little slower.

  4. 4

    Save

    The receiver checks the whole file and opens it: text and images in a reader, any other file to save or open.

More data in every frame

Lumen Code is used like an animated QR code, but each frame carries more data:

Animated QR (v25)Lumen Code 1.0
Bits per cell12 (4 colours) or 3 (8 colours)
Shapesquarefills the screen, either orientation
Data per frame, phone screen~1.2 KB~2.2 KB / ~3.4 KB
Data per frame, 13″ laptop~1.2 KB~6.9 KB / ~10.3 KB
A missed framewait for it to come roundno need to wait: every frame is new
Glare on one cornerframe lostread from the other three

At 12 frames a second a laptop screen sends 80–125 KB/s of raw capacity. The fastest measured transfer, between two phones running the apps, reached 96 KB/s. What a receiver gets depends on its camera; the receiver shows the live numbers.

96 KB/stop speed measured between phone apps
3 / 4corners are enough: glare on one corner is fine
0network, pairing or accounts needed
1.0open protocol, frozen; MIT licence

Made for real cameras

It works with handheld phones, glare, ordinary lenses and small screens.

  • Adaptive density

    The cell size follows the physical size of the screen: a small phone still reads reliably, a laptop carries several times more.

  • Fountain code

    Every frame is new data. Frames can be missed, blurred or out of order; once enough have arrived, the file is complete.

  • Three corners are enough

    Each corner has a finder pattern and an alignment grid covers the code, so a frame decodes even with one corner hidden by glare or a finger.

  • Colour and error correction

    2 or 3 bits per cell, Reed–Solomon on every codeword, a checksum on every packet and on the whole file.

  • Two engines, identical frames

    The JavaScript and Rust/WebAssembly implementations make bit-identical frames. Switch while receiving and nothing is lost.

  • Live dashboard

    Shows speed, cell size, success and capture rate while you scan, and a hint when something limits the speed.

In the browser, or as an app

All versions use the same protocol, so a browser can send to a phone app and the other way round.

  • Web

    Any modern browser with a camera

    Nothing to install. Send and receive files and text, on phones and computers.

  • iPhone

    iOS 17 or later

    Reads the camera directly and switches it to 60–240 frames a second when the sender is fast; plays at 120 Hz, with haptics.

  • Android

    Android 10 or later

    Captures at up to 60 frames a second under the app’s own exposure control; scans less when the phone gets hot.

  • Desktop

    macOS, Windows, Linux

    Send from a big screen or receive with a webcam. Signed and notarized on macOS.

The apps are usually faster than the browser: they read the camera directly and use higher frame rates.

An open protocol, frozen at 1.0

The specification is public, so anyone can implement it.

  • Frozen

    Version 1.0 is final and its wire format will not change, so every 1.0 receiver can read every 1.0 sender.

  • Two reference implementations

    JavaScript and Rust pass the same conformance vectors and make identical decisions on tens of thousands of random and damaged inputs.

  • Add it to your app

    There is no package to install: point your coding agent at the repository. The guides cover the web, Rust, and other languages through a C ABI.

  • Open source

    The protocol, both implementations and all the apps, under the MIT License.

Free in the browser. US$2.99 for the apps.

The web version and the store apps send and receive the same files; the apps are usually faster.

Web

Free forever

  • Any modern browser with a camera
  • Nothing to install, no account
  • Files and text, send and receive
Open the web app

Build it yourself

Free forever

  • The complete source, under the MIT License
  • iPhone, Android and desktop: the same apps as in the stores
  • Desktop builds ready to download from GitHub Releases
How to build

One price worldwide; each store shows it in your currency. iPhone and Android are bought separately, as the two stores require.

Questions

If the browser version is free, why pay for an app?

You do not have to: the web version handles the same files, and you can build the apps yourself for free. The store apps read the camera directly, use higher frame rates and control exposure, so they are usually faster and run cooler. Buying one also pays for further development.

Does my file go through a server?

No. The page is loaded from the website once; the file goes only from the sending screen to the receiving camera. Nothing is uploaded.

How large can a file be?

Up to 256 MiB per transfer. In practice the speed sets the limit: at 50 KB/s, 1 MB takes about 20 seconds and 20 MB about 7 minutes.

What do I need?

Two devices: one with a screen, one with a camera. Phones, tablets and computers all work, in either role. In a browser the camera needs the HTTPS site (or localhost).

Does it work without the internet?

The apps need no connection at all. The web version needs one to load the page; the transfer itself never uses the network.

Is the flashing safe to look at?

While sending, the code changes colour up to 60 times a second. People who are sensitive to flashing light, for example with photosensitive epilepsy, should not look at it.

Can I use Lumen Code in my own app?

Yes. The protocol is open and frozen, and the code is MIT-licensed. Take src/core for the web, the Rust crate for native code, or the C ABI from other languages; the developer guides and the conformance vectors show how.

Why not AirDrop or a cable?

Use them when you can. Lumen Code is for when you cannot: devices from different makers, no shared network, a locked-down or air-gapped computer, or a screen you can only look at.

Try it with two devices you already have.

Open Send on one and Receive on the other. Nothing to install.