rsend ===== Push configured phone folders to a home SSH host using real rsync. rsend backs up folders such as DCIM, WhatsApp media, and call recordings to a remote host over SSH. One-way push only, on an unmetered network by default, periodic or manual. Small, boring, self-contained: real rsync and a pure-Go SSH transport, both built from source and shipped inside the APK. No foreign prebuilt binaries. What it does ------------ - Pushes one or more local folders to remote paths over rsync-over-SSH. - Incremental: only changed files move; large videos resume (rsync --partial). - Per-folder deletion policy: additive backup (default) or mirror (--delete). - Runs on an unmetered network, periodically (WorkManager) or on demand. - ed25519 key auth with strict, pinned host-key verification. Layout ------ - rsh/ pure-Go SSH transport used as rsync's remote shell (-e). - rsync/ build script that compiles pinned rsync from source via the NDK. - app/ Android app (Kotlin, classic Views); bundles both as lib*.so. - ci/ CI-agnostic build and test scripts; the Makefile drives them. - metadata/ reproducibility and F-Droid build notes. - versions pinned toolchain and source versions; the single source of truth. Build ----- The repository is self-contained: clone it and the build fetches everything else. The host prerequisites are a POSIX shell, coreutils, make, curl, python3, tar, and git. The toolchain archives and rsync source are version- and checksum-pinned by the build (see versions for every pin). make setup # provision the toolchain into $HOME/toolchains . "$HOME/toolchains/env.sh" # put it on PATH (do this in each shell) make # rsync (NDK) -> rsh (Go) -> APK make test # Go, real-rsync integration, and Kotlin tests make verify-repro # build twice, compare the unsigned APKs `make test` also requires host rsync. The APK lands under app/build/outputs/apk/. It is unsigned by default and cannot be installed until signed. Continuous integration runs the same scripts: ci/setup-toolchain.sh, ci/build.sh, and ci/test.sh. For a locally installable APK, create a keystore and a gitignored keystore.properties before building: keytool -genkeypair -keystore rsend.jks -alias rsend -keyalg EC -validity 3650 cat > keystore.properties <