No description
This repository has been archived on 2026-09-12. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
Find a file
2026-09-12 12:01:49 +02:00
app Make re-pairing and transfer dispatch reliable 2026-09-12 12:01:49 +02:00
docs Make re-pairing and transfer dispatch reliable 2026-09-12 12:01:49 +02:00
gradle Use Retrofit's own kotlinx converter, and stop suspending inside a cursor walk 2026-09-11 23:06:03 +02:00
.gitignore The Android sync client 2026-09-11 19:13:08 +02:00
build.gradle.kts Align the Kotlin toolchain up to 2.2.0, not down to 2.0.21 2026-09-11 23:01:43 +02:00
gradle.properties The Android sync client 2026-09-11 19:13:08 +02:00
gradlew The Android sync client 2026-09-11 19:13:08 +02:00
gradlew.bat The Android sync client 2026-09-11 19:13:08 +02:00
README.md The Android sync client 2026-09-11 19:13:08 +02:00
settings.gradle.kts The Android sync client 2026-09-11 19:13:08 +02:00

GPB Sync for Android

Backs up an Android phone's gallery to your own GPB server: scan the pairing code, choose everything or specific albums, and it runs in the background from then on.

It is a source, not a node. The node app (gpb-node) is a phone that uploads to Google Photos on a server's behalf; this one is a phone whose photographs need backing up. The two are different roles, they can run on the same handset, and they pair from the same QR code.


Why it exists

Backing up a phone meant mounting WebDAV and dragging folders across, one at a time, forever. This is one tap.

The thing that makes it affordable is the server: since v5 it can ask Google directly whether a hash is already in the target library, with no bytes. A phone's gallery is mostly already in Google Photos — the handset's own app put it there — so a first run over fifty thousand items resolves almost all of them for a metadata round trip each, and only what is genuinely missing is uploaded.

Without that, "back up my entire gallery" would push tens of gigabytes through the server to be told it was already there.

Documentation

Document Covers
ARCHITECTURE.md The component map and what runs where
PIPELINE.md An item's life, and the states it passes through
SOURCES.md MediaStore, buckets, permissions
TRANSPORT.md Chunks, resume, and the two routes
BUILD.md Building and testing it

Status

Not yet compiled. It was written on a machine with no Android toolchain, so the first ./gradlew assembleDebug is also its first compile. The pure logic — chunk arithmetic, the selection rules, failure classification, pairing-link parsing — has JUnit tests that run without a device; everything touching the framework has not been exercised at all.