QRBeam MVP
QRBeam transfers a small file through an animated QR stream without a network, cable, or cloud service. A computer can send through the Python CLI, or one iPhone can display the same QRB1 stream for another iPhone to scan. The React Native iOS app verifies CRC32 and SHA-256 before saving or sharing the restored file.
Use QRBeam only for files you are authorized to move. It is a technical feasibility MVP, not a way to bypass company security or DLP controls.
Sender
Requirements: Python 3.10 or newer.
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
.venv/bin/qrbeam send ./example.zip
The page listens only on 127.0.0.1:8765 and normally opens automatically. Click Enter full screen, open the receiver on the iPhone, and point the rear camera at the QR code.
qrbeam send FILE [--profile safe|fast] [--port 8765] [--no-open]
| Profile | Chunk | Target rate | QR correction | Intended use |
|---|---|---|---|---|
safe |
480 B | 6 fps | M | Default, more tolerant of distance and movement |
fast |
900 B | 10 fps | L | Fixed phone, bright display, larger files |
The sender rejects files larger than 5 MiB. It repeats the manifest every 20 data frames and loops until stopped with Ctrl+C.
iOS app
Requirements: Node 20.19.4+, Xcode, CocoaPods, and an iPhone for camera validation.
cd mobile
npm install
bundle install
cd ios && bundle exec pod install && cd ..
npm start
Open mobile/ios/QRBeamReceiver.xcworkspace, select the QRBeamReceiver scheme and an iPhone, then Run. The development bundle identifier is com.leoliu.qrbeamreceiver.
The app has two tabs:
- 电脑传手机 scans a QRBeam from the Python CLI or another iPhone. Frames may arrive out of order and missing frames are recovered on the next loop.
- 手机传手机 selects one file from the system document picker, verifies its SHA-256, and plays a looping
safeorfastQR stream. The receiving phone uses the first tab.
Files can also be shared to Send with QRBeam from another iOS app. The Share Extension copies one file of at most 5 MiB into the App Group, then asks the user to open QRBeam. The main app consumes the pending file and opens the send confirmation screen.
The main app and Share Extension require the App Group group.com.leoliu.qrbeam. Add that capability to both identifiers in the Apple Developer account and refresh their provisioning profiles before installing on a physical device. The extension bundle id is com.leoliu.qrbeamreceiver.ShareExtension.
The Simulator can verify builds, navigation, document picker, App Group consumption, QR playback, fixture assembly, native save, and the share sheet. It exposes no rear camera here and therefore cannot prove the optical transfer; two physical iPhones are required for phone-to-phone acceptance.
Verification
.venv/bin/pytest -q
cd mobile
npx tsc --noEmit
npm run lint
npm test -- --runInBand
The shared Python/TypeScript fixture is in protocol/test-vector.json; the wire format is documented in protocol/PROTOCOL.md.
Current local verification:
- Python protocol/server tests: passing.
- TypeScript compile, ESLint, and 10 Jest protocol/sender/assembler tests: passing.
- iOS 18.2 Simulator Debug build and launch: passing, including the embedded Share Extension.
- Dual-tab navigation, document picker presentation, App Group pending-file consumption and cleanup: passing.
- On-device QR playback fixture: rendered at about 6.1 FPS in
safe, with pause and restart controls available. - Saved fixture verified as 13 bytes with SHA-256
764a2dca7d4481299879e4059ad2bd73cf5fa762571ac4a3174372a0ffb83aec. - Generic arm64 iOS device Debug build without signing: passing.
- Signed device installation is currently blocked because the local Xcode account/profile does not include the required App Group capability.
- Physical computer-to-phone and phone-to-phone camera transfers remain pending.
Benchmark worksheet
Do not infer feasibility from a successful build. Record real optical transfers here.
| Date | Device | Display / brightness | Distance | File | Profile | Result | Time | Effective KB/s | Notes |
|---|---|---|---|---|---|---|---|---|---|
| Pending | iPhone 15 Pro Max | Pending | Pending | 100 KB | safe | Not run | — | — | Basic byte-identical loop |
| Pending | iPhone 15 Pro Max | Pending | Pending | 1 MB | safe | Not run | — | — | Target: 3/3, median ≤ 8 min |
| Pending | iPhone 15 Pro Max | Pending | Pending | 5 MB | fast | Not run | — | — | Target: 2/3, median ≤ 15 min |
| Pending | iPhone → iPhone | Pending | Pending | 100 KB | safe | Not run | — | — | Phone-to-phone byte-identical loop |
| Pending | iPhone → iPhone | Pending | Pending | 1 MB | safe | Not run | — | — | Target: 3/3, median ≤ 10 min |
| Pending | iPhone → iPhone | Pending | Pending | 5 MB | fast | Not run | — | — | Target: 2/3, median ≤ 15 min |
If these thresholds are not met, the correct conclusion is: the software loop works, but the MVP is not yet product-viable. Fountain coding, encryption, compression, Android, npm distribution, MP4 output, TestFlight, and App Store distribution are intentionally out of scope.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qrbeam-0.1.0.tar.gz.
File metadata
- Download URL: qrbeam-0.1.0.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a8e3bffd2e23154fb6bd4a22ce47bf16f1d169cfbc2519c24bf37cd7b88236e
|
|
| MD5 |
850e6609231c0cd615ab23d5a3298f7b
|
|
| BLAKE2b-256 |
c093f6dc9df9cba6ba791d072450641ff1acf0d64d47eaefdec19ea93f0077ca
|
Provenance
The following attestation bundles were made for qrbeam-0.1.0.tar.gz:
Publisher:
publish.yml on Heipiao/qrbeam
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qrbeam-0.1.0.tar.gz -
Subject digest:
8a8e3bffd2e23154fb6bd4a22ce47bf16f1d169cfbc2519c24bf37cd7b88236e - Sigstore transparency entry: 2389425317
- Sigstore integration time:
-
Permalink:
Heipiao/qrbeam@a152d557ab2d3a0bb13db868c5912f4d5cf738ba -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Heipiao
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a152d557ab2d3a0bb13db868c5912f4d5cf738ba -
Trigger Event:
release
-
Statement type:
File details
Details for the file qrbeam-0.1.0-py3-none-any.whl.
File metadata
- Download URL: qrbeam-0.1.0-py3-none-any.whl
- Upload date:
- Size: 11.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a025b5271d72a2b79d293557c086b3064ca6561613c763335c63caacd6cafe93
|
|
| MD5 |
be144cf0adf3d7d527cc608131238982
|
|
| BLAKE2b-256 |
f23969516727db89f892e1d3e67f825be88320e5d25ff53ec762a0437c72042d
|
Provenance
The following attestation bundles were made for qrbeam-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Heipiao/qrbeam
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
qrbeam-0.1.0-py3-none-any.whl -
Subject digest:
a025b5271d72a2b79d293557c086b3064ca6561613c763335c63caacd6cafe93 - Sigstore transparency entry: 2389425445
- Sigstore integration time:
-
Permalink:
Heipiao/qrbeam@a152d557ab2d3a0bb13db868c5912f4d5cf738ba -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Heipiao
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a152d557ab2d3a0bb13db868c5912f4d5cf738ba -
Trigger Event:
release
-
Statement type: