README.md
peach-android
The Android companion app for Peach Password Manager. Free, open source, local-first. Vault stays on the device, encrypted with AES-256-GCM, protected by Argon2id.
Current version: v2.9.20 Source: kepr.uk/peach-android License: GPL v3
What this repo is
Production Android app for Peach. Kotlin + Jetpack Compose + Hilt, single :app module. Holds the vault on-device, syncs to other paired devices over a Noise NK/KK channel through a cloud relay, and provides inline autofill, Quick Settings tile, passkey support, Codex paper backup, and updates-from-Kepr.
Not a fork and not a port — every byte-level decision (Argon2id parameters, per-entry sync envelope, Codex RS/Deflate/Aztec envelope, Noise NK/KK wire format, vault slots, recovery escrow) is verified against the browser implementation in peach-browser. See docs/browser-parity-map.md for the per-primitive parity contract.
Repository layout
app/src/main/java/com/peachpasswords/
sync/ Pairing, Noise handshakes, relay dialer, mesh manifest
autofill/ Inline + Accessibility autofill providers
codex/ Aztec encoder, RS erasure, deflate codec
passkeys/ WebAuthn / passkey storage and assertion
ui/ Compose screens (Lock, Vault, Settings, Trash, etc.)
qs/ Quick Settings tile
di/ Hilt modules
shared/ Cross-screen utilities
docs/ Cryptographic vector provenance, browser parity map, audit
app/drafts/ One-off integration drafts (often retired)
The canonical Noise core (NK and KK patterns, X25519, ChaCha20-Poly1305, BLAKE2s, nonce state) lives in ../peach-browser/crypto-core as a Rust crate. Android drives it via JNI; see docs/NOISE-CORE-PROVENANCE.md.
Building
Requires JDK 17, Android SDK 34, NDK r26+, Rust toolchain.
# 1. Build the shared Noise core (one time, or whenever the crate changes)
(cd ../peach-browser/crypto-core && cargo build --locked --release)
# 2. Build the app
./gradlew assembleRelease # signed release APK
./gradlew assembleDebug # debug APK with com.peachpasswords.debug id
./gradlew testDebugUnitTest # sync + vault + crypto unit tests
Outputs land in app/build/outputs/apk/{release,debug}/. CI uses scripts/kepr-build-apk.sh which signs and uploads to Kepr under a platform allowlist (currently android-arm64).
The single source of truth for the version is the repository-root VERSION file. versionName in app/build.gradle reads it directly; versionCode is derived deterministically from the version string.
Sync model
- Pairing — invitation over the cloud relay; Noise NK handshake establishes the rendezvous secret.
- Adoption — one device (source) commits its encrypted vault to another (receiver) via an authenticated Noise KK channel. The source ships a snapshot; the receiver reconstructs entries + tombstone state + duress slot, then exchanges a signed device-manifest for the mesh.
- Mesh propagation — every device advertises a
deviceManifestVersioninSYNC_HELLO. When both peers advertise the same version, signed device graphs are exchanged even on equal entry versions so introductions and revocations converge across multi-hop edges. - Revocations are terminal — once a device's id or long-term key lands in the revocation list, no manifest re-admits it.
isDeviceRevoked(deviceId, longTermPublicKeyHex)checks both, keyed on the key as well as the id so a revoked key can't walk back in under a fresh id.
See docs/CRYPTOGRAPHIC-TEST-VECTORS.md for the byte-level vectors that pin this implementation to RFC 9106 Argon2id, NIST CAVP AES-GCM, BLAKE3 reference input, and the Cacophony Noise NK/KK test catalog.
Audits
peach-android-audit-report.md records the most recent read-only adversarial review against peach-browser. Cryptographic primitives are clean and byte-equivalent; lifecycle and parity findings are tracked against the version that received them and resolved in subsequent saves.
Version control
This repo uses Koh, not git. Snapshots live locally and are offered to kepr.uk for review and distribution.
koh status # current working tree
koh save "feat: ..." # atomic save
koh checkpoint # pre-anything-risky restore point
koh offer peach-android # push to kepr.uk
koh offer peach-android --builds # build + publish APKs
.agent/CONTINUITY.md is the live handoff file for any session that has to stop mid-campaign.
License
GPL v3 — see LICENSE.