- Kotlin 100%
| app | ||
| docs | ||
| gradle | ||
| .gitignore | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
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.