✕ dismiss⚠ Something went wrong
LOCAL-ONLY · NO BACKEND · CANVAS + MEDIADEVICES

OPTIC/STREAM

A proof-of-concept transceiver: any image is broken into pixels, flattened into a raw binary stream, and re-drawn as an animated black & white bit matrix — a custom optical signal, not a QR code. Point a second camera at the animation, or loop it back locally, to decode the stream and rebuild the image.

01 UPLOAD / CAPTURE 02 PIXELS → BINARY 03 BINARY → OPTICAL MATRIX 04 CAMERA SCAN 05 DECODE → RECONSTRUCT

Source · Upload Image

Accepted formats: PNG, JPEG, WEBP, BMP. The image is read locally via FileReader — nothing leaves the browser.

Click to choose a file
or drag & drop an image here

Source · Capture From Camera

Uses getUserMedia(). Capture a still photo, or record a short clip and pull a frame from it.

Live CameraIdle
Recorded ClipNone

Preview · Selected Source Image

This is the image that will be converted. Choose a working resolution — smaller grids convert to fewer bits and animate/scan far more reliably.

Full PreviewEmpty
Downscaled

The downscaled canvas is the exact pixel grid that gets flattened to binary. Every pixel = 3 bytes (R,G,B) = 24 bits.

Convert · Image → Binary Stream

Extracts RGB from every pixel of the downscaled image and flattens it into one continuous binary string, then packages it into optical frames.

Total Pixels
Total Bits
Binary Length (chars)
Equivalent File Size
Optical Frames
Bits / Frame (payload)

Binary Viewer

Raw flattened bitstream (1 = white pixel-bit, 0 = black pixel-bit). Truncated in the DOM for performance; full stream is held in memory.

Convert an image to see its binary stream…

Optical Visualizer · Live Animation

Dynamic Optical Bit-Matrix Protocol. Select matrix grid density to scale frame capacity (16×16 = 256 bits, 24×24 = 576 bits, 32×32 = 1024 bits, 48×48 = 2304 bits). Higher grid density processes up to 11.8× more data per frame at once! 1 → white square, 0 → black square.

Optical MatrixStopped
Current Frame
Frame Type
Grid Matrix Size
16 × 16
Payload Bits / Frame
176 bits

Scan Mode

Point a camera at the Optical Matrix above (on this device, or another device/tab showing the same animation) to capture frames and read the binary back out. No second device handy? Use Local Loopback to feed the animator's frames directly into the decoder and verify the full pipeline in one tab.

Scanner CameraIdle
⚠ Fill the dashed box edge-to-edge with the animated matrix — background outside the box is NOT read and will corrupt every sampled frame.
Sampled Grid (debug)
Decoded Bit-Grid (what the algorithm reads)
NO SIGNAL
low contrast / not aligned
Decode From a Video File (already-captured clip)Idle

Already filmed the animation with your phone's camera app, or have a saved .webm/.mp4 clip of the Optical Matrix? Load it here — it will play back and decode automatically, looping a few extra times to pick up any frames it missed the first pass.

Click to choose a video file
or drag & drop a recorded clip here
⚠ This only decodes cleanly if the matrix fills the frame edge-to-edge in the source clip (see live diagnostics below while it plays).

Decoder

Reassembles frame index + payload bits back into RGB triplets, then pixels, then a full image.

No header yet Incomplete
Frames Received
0 / —
Bits Decoded
0
Detected Size
If scanning stalls on a few stubborn frames, this reconstructs immediately from whatever has been decoded so far — missing pixels render black — so you can still preview and download.

Reconstruction Preview

Side-by-side comparison of the original working image and the image rebuilt purely from decoded bits.

Original (downscaled source)
Reconstructed (from decoded bits)
Similarity
Pixel Accuracy
Binary Accuracy
Original Image Size
Binary Stream Size

Export Decoded Data

Turns the scan into real files on disk: a viewable PNG, and a raw .bin file holding the decoded binary stream itself (header + packed RGB bytes) — the actual "convert the scanned video into a binary file" step.

Finish a scan (live camera, video-file decode, recorded clip, or loopback) — or use "Force Reconstruct Now" above on a partial one — to enable export.

Regenerate Image From a .bin File

The other half of the loop: load a .bin file that this page exported earlier (from any previous scan) and rebuild the image straight from it — no camera, no re-scanning, no video needed.

Click to choose a .bin file
or drag & drop it here
Rebuilt From Binary

Internal Device Storage · Auto-Saved Decoded Files

Every video scan or decoded stream is automatically saved into your device's internal storage (IndexedDB) and triggered for download into your local Downloads folder — persisting safely across browser restarts and offline sessions.

IndexedDB Connected ✓
No saved files in internal device storage yet. Scan or decode a video above to auto-save to device!
FRAME
BITS/FRAME
FPS
DECODED BITS 0
MISSING BITS 0
RECOVERED BITS 0
hide ▾