Offline file transfer and QR code generation. Share files between devices using animated QR codes with no internet required.
Demo: qrsecure.kuvi.dev
- Generate QR codes from text or URLs
- Transfer files using QR codes only - no internet, servers, or third-party services
- Fountain codes (LT codes) for robust large file transfers with error correction
- Sequential QR mode for simpler transfers
- CRC32 checksums for data integrity verification
- Camera-based scanning with rxing-reader WASM
- Image upload support
- Frontend: React 19 + TypeScript + Vite
- Styling: Tailwind CSS + Radix UI
- QR Scanning:
@andrewtheguy/rxing-wasmfrom rxing-reader - QR Generation:
@andrewtheguy/fast-qr-wasmfrom fast_qr - Binary QR Transport: Fountain transfer worker path only (raw byte mode)
- Fountain Codes: Custom Rust/WASM implementation (architecture docs)
- Node.js 18+
- Rust toolchain with
wasm-pack(for building the in-repo WASM crates) - GitHub Packages npm access for
@andrewtheguy/rxing-wasm
# Clone and install
git clone <repository-url>
cd qrcodesecureshare
npm install
# Development (uses pre-built WASM)
npm run dev
# Production build (rebuilds WASM)
npm run build- Go to "Generate QR Code" tab
- Enter text or URL
- Download or share the QR code
- Go to "Scan QR" tab
- Use camera or upload an image
- Scanned data is displayed and can be copied
- Go to "Send File" tab
- Select a file to transfer
- Choose transfer mode (Fountain Code recommended for large files)
- Display animated QR codes for receiver to scan
- Go to "Send File" > "Receive a file"
- Scan the metadata QR code from sender
- Continue scanning animated QR codes until transfer completes
- Download the reconstructed file
src/
├── components/
│ ├── GenerateQR.tsx # Text/URL QR generator
│ ├── Scan.tsx # QR scanner (camera/upload)
│ ├── OfflineTransfer.tsx # File transfer workflow
│ ├── fountain_qr/ # Fountain code transfer UI
│ └── ui/ # Shared UI components (shadcn)
├── workers/ # Web Workers (QR scanning, decoding)
└── wasm/ # WASM bindings
rust/
└── fountain-wasm/ # LT fountain codes implementation
Mobile-optimized scanning:
- Reduced scan rates (8 fps mobile, 15+ fps desktop)
- Resolution limiting to reduce processing overhead
- Smart throttling for battery preservation
- Offline by design: No servers or internet required for file transfers
- Local processing: All QR operations happen in-browser via WebWorkers
- No intermediaries: Data stays on participating devices only
- Integrity checks: CRC32 checksums verify transfer completeness
# Run development server
npm run dev
# Run tests (Rust)
npm run test
# Lint
npm run lint
# Build WASM only
npm run build:wasmThe QR reader WASM is built and published from
andrewtheguy/rxing-reader; this
app consumes it as the pinned npm package @andrewtheguy/rxing-wasm. The QR
generator WASM is built and published from
andrewtheguy/fast_qr; this app
consumes it as the pinned npm package @andrewtheguy/fast-qr-wasm. Both are
pulled in as GitHub release tarball URLs declared in package.json.
# Build for production
npm run build
# Preview build locally
npm run preview
# Deploy dist/ folder to any static hostingSee CLOUDFLARE_DEPLOY.md for Cloudflare Pages deployment.
MIT License - see LICENSE file for details.