<feed xmlns='http://www.w3.org/2005/Atom'>
<title>android/rsend/app/build.gradle, branch master</title>
<subtitle>[no description]</subtitle>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/'/>
<entry>
<title>app: release 0.2.1</title>
<updated>2026-08-23T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-08-23T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=4bc9e8522099deaa3de25d4cb6fb721dc9f42878'/>
<id>4bc9e8522099deaa3de25d4cb6fb721dc9f42878</id>
<content type='text'>
Advance the version once from the released 0.2.0 base and publish the
matching changelog. No transfer, protocol or storage behaviour changed,
so the store description stands.

The dashboard screenshot prints BuildConfig.VERSION_NAME, so it is the
one store image a version bump invalidates. Recaptured on the same
1080x2400 profile with the same demo state.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Advance the version once from the released 0.2.0 base and publish the
matching changelog. No transfer, protocol or storage behaviour changed,
so the store description stands.

The dashboard screenshot prints BuildConfig.VERSION_NAME, so it is the
one store image a version bump invalidates. Recaptured on the same
1080x2400 profile with the same demo state.
</pre>
</div>
</content>
</entry>
<entry>
<title>doc: correct drift and move the build notes to the root</title>
<updated>2026-08-23T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-08-23T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=780d3167a427d6964806694ef5282be0c6f4cd33'/>
<id>780d3167a427d6964806694ef5282be0c6f4cd33</id>
<content type='text'>
The Rsync comment about draining a hostile remote's pipe sat on the
Tally type, where it means nothing; it describes boundedLines. Scheduler
explained itself with what happened during development instead of the
constraint that WorkManager persists unique names across upgrades, and
MainActivity and SyncLog did the same. Keys pointed at a pin() that does
not exist. The App header restated the class name and omitted half of
what onCreate does. OUT_FORMAT had no caller outside its file.

The README layout list omitted fastlane. The e2e test hardcodes a copy
of the app's rsync vector with nothing saying so. useradd already writes
a locked password field, so "skip passwd -l" does not leave a non-locked
one and key auth is still refused; verified against sshd with UsePAM no.
The CI file also runs verify-repro on a tag, and the NDK and build-tools
are pinned by revision and verified against Google's manifest rather
than a checksum this repository owns, which the reproducibility notes
claimed for every input.

metadata/ held one document and nothing else, and reads as a store
metadata directory beside fastlane/metadata. Root, extensionless,
beside THIRD_PARTY.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The Rsync comment about draining a hostile remote's pipe sat on the
Tally type, where it means nothing; it describes boundedLines. Scheduler
explained itself with what happened during development instead of the
constraint that WorkManager persists unique names across upgrades, and
MainActivity and SyncLog did the same. Keys pointed at a pin() that does
not exist. The App header restated the class name and omitted half of
what onCreate does. OUT_FORMAT had no caller outside its file.

The README layout list omitted fastlane. The e2e test hardcodes a copy
of the app's rsync vector with nothing saying so. useradd already writes
a locked password field, so "skip passwd -l" does not leave a non-locked
one and key auth is still refused; verified against sshd with UsePAM no.
The CI file also runs verify-repro on a tag, and the NDK and build-tools
are pinned by revision and verified against Google's manifest rather
than a checksum this repository owns, which the reproducibility notes
claimed for every input.

metadata/ held one document and nothing else, and reads as a store
metadata directory beside fastlane/metadata. Root, extensionless,
beside THIRD_PARTY.
</pre>
</div>
</content>
</entry>
<entry>
<title>app: release 0.2.0</title>
<updated>2026-08-16T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-08-16T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=6578dc47a7d1f7946528e9540d9cfa2e9a5d88d2'/>
<id>6578dc47a7d1f7946528e9540d9cfa2e9a5d88d2</id>
<content type='text'>
Document the multi-remote release, publish matching store metadata,
and advance the version once from the released 0.1.3 base.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Document the multi-remote release, publish matching store metadata,
and advance the version once from the released 0.1.3 base.
</pre>
</div>
</content>
</entry>
<entry>
<title>build: pin and verify release inputs</title>
<updated>2026-08-16T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-08-16T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=8c6390571d28ff21a98ed3802458aceddbb6d2a0'/>
<id>8c6390571d28ff21a98ed3802458aceddbb6d2a0</id>
<content type='text'>
Support Alpine/musl and Debian/glibc hosts, lock downloaded and
Gradle artifacts, and verify native and APK security properties.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Support Alpine/musl and Debian/glibc hosts, lock downloaded and
Gradle artifacts, and verify native and APK security properties.
</pre>
</div>
</content>
</entry>
<entry>
<title>app: release 0.1.3</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=4217fb8a1f430b0b4c63d6fe388d2e14d23653ff'/>
<id>4217fb8a1f430b0b4c63d6fe388d2e14d23653ff</id>
<content type='text'>
versionCode 4. Bound the SSH handshake so a stalled server cannot hang
a sync. Persist config, key, and host pin atomically so an interrupted
write cannot corrupt state. Replace the chained one-time jobs with
periodic work that survives reboots; the schedule floor is now
WorkManager's 15-minute minimum.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
versionCode 4. Bound the SSH handshake so a stalled server cannot hang
a sync. Persist config, key, and host pin atomically so an interrupted
write cannot corrupt state. Replace the chained one-time jobs with
periodic work that survives reboots; the schedule floor is now
WorkManager's 15-minute minimum.
</pre>
</div>
</content>
</entry>
<entry>
<title>ci: pin toolchains and verify release artifacts</title>
<updated>2026-07-13T22:00:29+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=2aa6920fb1568249d2466fa1b13760d1a51c0e8f'/>
<id>2aa6920fb1568249d2466fa1b13760d1a51c0e8f</id>
<content type='text'>
Checksum-pin every downloaded toolchain archive. Before publishing,
verify the APK was built from HEAD, the tag matches versionName,
apksigner passes, and the tree is clean; publish a sha256 sidecar
and treat published assets as immutable. Compare full unsigned APKs
in verify-repro and run the Android unit tests in CI.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Checksum-pin every downloaded toolchain archive. Before publishing,
verify the APK was built from HEAD, the tag matches versionName,
apksigner passes, and the tree is clean; publish a sha256 sidecar
and treat published assets as immutable. Compare full unsigned APKs
in verify-repro and run the Android unit tests in CI.
</pre>
</div>
</content>
</entry>
<entry>
<title>app: release 0.1.2</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=8141ea0b4e29644327e3ba579e2caf083c50f6f6'/>
<id>8141ea0b4e29644327e3ba579e2caf083c50f6f6</id>
<content type='text'>
versionCode 3. Drop --mkpath so remotes with an rsync older than 3.2.3
(stock macOS included) can receive syncs; rsync still creates the final
remote path component on its own. NDK host toolchain detection so the
native build also runs on macOS hosts.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
versionCode 3. Drop --mkpath so remotes with an rsync older than 3.2.3
(stock macOS included) can receive syncs; rsync still creates the final
remote path component on its own. NDK host toolchain detection so the
native build also runs on macOS hosts.
</pre>
</div>
</content>
</entry>
<entry>
<title>app: release 0.1.1</title>
<updated>2026-07-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-07-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=48a9af712d13ac885d8945df29e88c291dfc07f6'/>
<id>48a9af712d13ac885d8945df29e88c291dfc07f6</id>
<content type='text'>
versionCode 2. Empty-path and config-corruption fixes, rsync process
cleanup on stopped syncs, keygen error reporting, and the store icon.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
versionCode 2. Empty-path and config-corruption fixes, rsync process
cleanup on stopped syncs, keygen error reporting, and the store icon.
</pre>
</div>
</content>
</entry>
<entry>
<title>rsend: push phone folders to a home SSH host over rsync</title>
<updated>2026-01-01T00:00:00+00:00</updated>
<author>
<name>Lena</name>
<email>lena@omega</email>
</author>
<published>2026-01-01T00:00:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/commit/?id=7e04941bccb2683f8a6e3ee38a99c50129234dd1'/>
<id>7e04941bccb2683f8a6e3ee38a99c50129234dd1</id>
<content type='text'>
A small Android app for one-way folder backup, a KISS alternative to
Syncthing. It bundles rsync (built from pinned source via the NDK) and
a pure-Go SSH transport, both shipped in the APK as lib*.so and run from
the native library directory.

rsend pins the host key, stores the ed25519 identity Keystore-encrypted,
pushes each folder additively or as a mirror, and runs on demand or on a
WiFi-only schedule. The build is self-contained and reproducible: make
setup provisions the toolchain, make builds rsync, rsh, and the APK.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
A small Android app for one-way folder backup, a KISS alternative to
Syncthing. It bundles rsync (built from pinned source via the NDK) and
a pure-Go SSH transport, both shipped in the APK as lib*.so and run from
the native library directory.

rsend pins the host key, stores the ed25519 identity Keystore-encrypted,
pushes each folder additively or as a mirror, and runs on demand or on a
WiFi-only schedule. The build is self-contained and reproducible: make
setup provisions the toolchain, make builds rsync, rsh, and the APK.
</pre>
</div>
</content>
</entry>
</feed>
