<feed xmlns='http://www.w3.org/2005/Atom'>
<title>android/rsend, branch 0.2.0</title>
<subtitle>[no description]</subtitle>
<link rel='alternate' type='text/html' href='http://git.0xlena.dev/android/rsend/'/>
<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: harden backup execution</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=0e8a87f2ad2bd40d34996374aebb6dff070e4b5f'/>
<id>0e8a87f2ad2bd40d34996374aebb6dff070e4b5f</id>
<content type='text'>
Validate persisted state and destination boundaries, make interruption
and mirror deletion explicit, and keep scheduled work singular.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Validate persisted state and destination boundaries, make interruption
and mirror deletion explicit, and keep scheduled work singular.
</pre>
</div>
</content>
</entry>
<entry>
<title>native: harden rsync and SSH transport</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=beaa0c970d6c3538119b8a34a3f2f754b45e54cf'/>
<id>beaa0c970d6c3538119b8a34a3f2f754b45e54cf</id>
<content type='text'>
Update rsync to 3.5.0 and Go to 1.26.6. Bound SSH handshakes, pin
host-key types, and build 16 KB-aligned hardened executables.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Update rsync to 3.5.0 and Go to 1.26.6. Bound SSH handshakes, pin
host-key types, and build 16 KB-aligned hardened executables.
</pre>
</div>
</content>
</entry>
<entry>
<title>app: support multiple named remotes</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=0890d139e5fa501561e469aca7854791a936fcb6'/>
<id>0890d139e5fa501561e469aca7854791a936fcb6</id>
<content type='text'>
Let each folder select a named SSH endpoint and migrate the published
0.1.x configuration without discarding its folders or host pin.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Let each folder select a named SSH endpoint and migrate the published
0.1.x configuration without discarding its folders or host pin.
</pre>
</div>
</content>
</entry>
<entry>
<title>ci: drop the Codeberg release script</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=6c0e672432dc466214c0838db378e8269d090ab4'/>
<id>6c0e672432dc466214c0838db378e8269d090ab4</id>
<content type='text'>
Migrating the project off Codeberg to GitLab. The release publisher was
written against the Forgejo API and hardcodes codeberg.org; remove it
rather than port it for now.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Migrating the project off Codeberg to GitLab. The release publisher was
written against the Forgejo API and hardcodes codeberg.org; remove it
rather than port it for now.
</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: harden sync execution and persisted state</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=2593151ca2c67256442ad25b074504e3ecd3371f'/>
<id>2593151ca2c67256442ad25b074504e3ecd3371f</id>
<content type='text'>
Persist config, key blob, and host pin via AtomicFile so an
interrupted write cannot corrupt state. Validate the port, clear the
host pin when the remote changes, cap imported key size, time out
native helpers, and escalate rsync termination to destroyForcibly.
Serialize manual and scheduled syncs behind a mutex.

Replace the chained one-time jobs with plain periodic work: it
survives reboots without a boot receiver and cannot silently die
like a broken chain. Costs the sub-15-minute interval, which photo
backup does not need. Document the floor and that syncs run on any
unmetered network, not only WiFi.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Persist config, key blob, and host pin via AtomicFile so an
interrupted write cannot corrupt state. Validate the port, clear the
host pin when the remote changes, cap imported key size, time out
native helpers, and escalate rsync termination to destroyForcibly.
Serialize manual and scheduled syncs behind a mutex.

Replace the chained one-time jobs with plain periodic work: it
survives reboots without a boot receiver and cannot silently die
like a broken chain. Costs the sub-15-minute interval, which photo
backup does not need. Document the floor and that syncs run on any
unmetered network, not only WiFi.
</pre>
</div>
</content>
</entry>
<entry>
<title>rsh: bound the SSH handshake</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=a6640c603b7a15d3531980116fdce15d1743c865'/>
<id>a6640c603b7a15d3531980116fdce15d1743c865</id>
<content type='text'>
ssh.Dial applies its Timeout only to the TCP connect, so a host that
accepts the connection and then stalls the SSH handshake hangs the
sync forever. Dial with a timeout, run the handshake under a deadline,
and clear the deadline once the connection is established.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
ssh.Dial applies its Timeout only to the TCP connect, so a host that
accepts the connection and then stalls the SSH handshake hangs the
sync forever. Dial with a timeout, run the handshake under a deadline,
and clear the deadline once the connection is established.
</pre>
</div>
</content>
</entry>
</feed>
