Live demo

This one page both displays an animated UR and scans one, using the library's own <ur-scanner> element. Open it on a laptop, open the same URL on your phone, point the phone at the laptop, and watch the bytes transfer as the ring fills.

No second device? Fixture mode replays a captured frame sequence and decodes it in-page, so you get the full experience on a single device, no camera needed. All decoding is local; no frame ever leaves this page.

Want numbers rather than vibes? The real device benchmark reports measured decode attempts per second, median scan cost, time to complete, and the camera's actual delivered frame rate on the phone you are holding. That is the one measurement headless CI cannot produce, and it matters most on Safari and Firefox, where the jsqr fallback runs. See benchmarking for how to read it.

Sender · animated UR

Encoding…

Source fragments: ...: the stream is rateless; it keeps emitting mixed frames.

Receiver · <ur-scanner>

Loading the decoder…

What you're watching

The sender chops your payload into K source fragments and emits an endless, fountain-coded stream of frames, each an XOR mix of several fragments. The receiver can start on any frame and finishes once it has collected a set of frames whose information adds up to the original, typically a little more than K. That is why the progress can jump, why a dropped frame is never fatal, and why there is no “frame 7 of 12” to wait for.

Read the fountain-codes explainer for the worked example, or the reference for the <ur-scanner> attributes, events, and error taxonomy. The exact page you're on is a port of the package's own demo/, importing the real published package.

ur-scanner Browser receiver for animated BC-UR QR codes. Camera to bytes, no wallet required.