deedy GitHub avatar

qr-data-transfer

deedy

QRFerry transfers files between devices through a live animated QR stream entirely in the browser, without uploading the file to an application server.

Stars

40

7-day growth

No data

Forks

10

Open issues

0

License

No data

Last updated

2026-07-31

AI repository intelligence
FR-AI / ANALYSIS

Why it is worth attention

It turns QR transfer into a continuous high-rate optical channel by combining RaptorQ fountain coding, dual-lane QR rendering, and WebAssembly codecs, enabling reliable browser-only air-gapped file transfers.

Who it is for

  • Privacy-conscious users transferring files across air-gapped or network-restricted devices
  • Developers working with QR codes, fountain codes, or WebAssembly
  • Teams needing offline device-to-phone data transfer without infrastructure
  • Security researchers evaluating optical side-channel transfer methods

Use cases

  • Move a file from a screen to a phone in an air-gapped or network-restricted setting
  • Transfer files between devices without uploading to an application server
  • Evaluate high-throughput QR streaming using the laboratory 1 Mbps profile
  • Recover files despite camera blur, dropped frames, or out-of-order QR captures

Strengths

  • Transfer is entirely browser-based; the file is never uploaded to an application server
  • RaptorQ interleaving lets the receiver join mid-cycle, discard blur, accept out-of-order frames, and reconstruct after enough unique symbols
  • Multiple integrity checks are performed: per-frame CRC, RaptorQ object CRC, compressed payload CRC, and original file CRC
  • The test harness exercises the actual WebAssembly QR renderer and scanner with exposure noise and verifies production builds

Considerations

  • High-speed dual-lane modes require full-screen sender playback, receiver dual-lane mode, and a landscape phone held close and steady
  • Throughput is limited by camera capture and QR density; the 1 Mbps profile is a laboratory measurement before camera loss
  • Requires a modern browser with WebAssembly and camera access, so not all devices are supported

README quick start

QRFerry

QRFerry moves a file from one device to another as a live animated QR stream. The sender and receiver run entirely in the browser; the file is never uploaded to an application server.

Use it

  1. Open the root page on the sending screen and choose a file.
  2. Open /scan on the receiving phone and allow rear-camera access.
  3. Start the QR stream and keep the complete code inside the phone's guide.
  4. Save the file when RaptorQ recovery and the whole-file checksum reach 100%.

Robust through Turbo 30 use one stable QR target. Turbo 60 uses two V30-L lanes, updating them alternately at 30 fps each so one remains stable during every display transition. The opt-in 1 Mbps laboratory profile uses the same dual-lane design with V40-L for a nominal 1.40 Mbps optical payload channel before camera loss. Dual modes require fullscreen sender playback, the receiver's Dual lane option, and a landscape phone held close and steady.

Demo

This inline preview is generated from the final privacy-redacted demo. The full-resolution recording remains local at videos/qrferrydemo_timed_redacted.mov and is intentionally excluded from Git.

Protocol

  • Brotli quality 11 and gzip level 9 are both attempted; only the smallest representation is retained, and only when it saves optical bytes.
  • QR frames use raw byte mode, avoiding the Base45 expansion of the previous protocol.
  • Every frame carries a compact binary header, a RaptorQ symbol, and CRC-32.
  • File metadata is inside the protected RaptorQ object instead of repeating in descriptor beacons.
  • Source and repair symbols are interleaved. The receiver can join mid-cycle, discard blur, accept frames out of order, and reconstruct after receiving enough unique symbols.
  • Turbo 15 uses one V30-L code held for four refreshes on a 60 Hz screen. Turbo 30 holds one code for two refreshes. Turbo 60 alternates updates across two V30-L lanes, so each lane remains stable for two refreshes while their combined stream carries 60 symbols per second. The 1 Mbps laboratory profile applies the same scheme to two denser V40-L lanes.
  • Playback is synchronized to browser display refreshes. The sender reports its measured render rate; the receiver reports negotiated and delivered camera fps, completed scans per second, and decoder p50/p95 latency.
  • Dual scanning acquires at most two codes per exposure and

Related repositories

Similar projects matched by category, topics, and programming language.

TanStack
Featured
TanStack GitHub avatar

router

TanStack Router is a type-safe, data-driven React router with built-in caching, prefetching, and nested layouts, while TanStack Start extends it into a full-stack SSR framework.

Web DevelopmentFrontend Frameworks
14,861
vercel-labs
Featured
vercel-labs GitHub avatar

scriptc

scriptc compiles ordinary TypeScript into small, fast native executables without needing Node.js, V8, or any JavaScript runtime in the binary.

Developer ToolsCode Quality & Build
1,985
Jakubantalik
Featured
Jakubantalik GitHub avatar

thinking-orbs

A React component library that renders six hand-tuned animated thought orb loading indicators on a plain 2D canvas, with two purpose-tuned sizes and automatic theme detection for AI and agent UIs.

AI & Machine LearningAI Agents
1,191