Skip to content

v0.5.2 — Android real-time receiver

Latest

Choose a tag to compare

@BeatoutC BeatoutC released this 03 Oct 02:34

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 .so behind a one-screen Kotlin shell built on CameraX.
  • Phone presets in the sender. mp15 … mp40-30x2 tune 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.