sendmecongo moves files out of a physically isolated machine in one direction only — a fountain-coded QR stream on the screen, a phone camera on the other side, and a byte-identical file at the end. No network, no USB, no Bluetooth.
The Android receiver: no recording, just point and scan
Until now, receiving meant recording the screen with a camera app and handing the video to sendmecongo-recv. v0.5.2 ships an Android app that closes that loop in real time: it scans the QR stream straight off the camera preview. Point the phone at the screen, hold it there, done — there is no recording step and nothing to copy off the phone afterwards.
- Same protocol, same core. The receiver inside is the identical pure-Rust
sendmecongo-core(RaptorQ per RFC 6330, four CRC layers), compiled to an arm64 JNI.sobehind a one-screen Kotlin shell built on CameraX. - Phone presets in the sender.
mp15…mp40-30x2tune module size, per-code hold time, and repair percentage for a phone camera instead of a 4K recording. They ship in the send GUI dropdown as of this release — a v0.5.1 sender does not know them, so upgrade both ends. - Manual camera control where it matters. Fixed exposure (ISO 800 / 4 ms), 60fps target with 30fps fallback, 1440×1080 analysis resolution — enough pixels per module for two side-by-side V40 codes.
- Icon. The launcher icon is the recv light-cone, rendered from the same geometry code as the desktop icon (
sendmecongo-bench icon --variant recv), extracted to transparency for the adaptive foreground. - Signing. The APK is signed with a project keystore that is committed to the build repository on purpose — for a public tool this signature proves build reproducibility, not identity. Rebuilds produce the same signature.
Measured on real hardware (incompressible random data, every run verified byte-identical):
| Preset | QR | Lanes | sym/s | Nominal | Measured goodput |
|---|---|---|---|---|---|
mp40 |
V40-L | 1 | 10 | 29.3 KB/s | 29 KB/s |
mp40-30 |
V40-L | 1 | 30 | 87.9 KB/s | 80+ KB/s |
mp40-30x2 |
V40-L | 2 | 60 | 175.9 KB/s | 130 KB/s stable |
That last row is the headline: two codes side by side on screen, phone held landscape, 130 KB/s into a live camera — roughly 4× the first working single-lane build two days ago. The dual-lane push surfaced three real bugs, all fixed here: a Y-plane row-stride contract violation (the Kotlin side compacted rows the Rust side then re-addressed by stride — invisible at 640×480 where stride equals width, fatal at 1440), ImageAnalysis silently defaulting to 640×480, and a Rust panic crossing the JNI boundary and killing the whole process (now caught and surfaced as an error string).
Changes for the desktop apps
No functional change — version bump only, plus the new phone presets in the sender's dropdown. The DMGs are rebuilt from this same commit so both ends agree on the preset list.
Assets
| File | Size | SHA-256 |
|---|---|---|
sendmecongo-recv-android-0.5.2.apk |
9.6 MB | 9E30E41B698D75683865A9809634BFF7BCDCC2EFF9DBABF9F35A9EF0D5AAA7CC |
sendmecongo-recv-0.5.2.dmg |
4.7 MB | B4D47BE579AFFAF98B9DBE7CE49171C5594E80C3D220A76AAAE7DD3B8BBB5A5B |
sendmecongo-send-0.5.2.dmg |
4.4 MB | B1DA91A861CA4047A973B2522A3DC9425F2E22064D495A85142F4BBF653D72EF |
The DMGs are Apple-Silicon-only, ad-hoc signed as before; the APK targets Android 10+ (API 29), arm64-v8a.
112 tests green across the workspace.