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.