# peach-android The Android companion app for [Peach Password Manager](https://peachpasswords.com). 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](https://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`](./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`](./docs/NOISE-CORE-PROVENANCE.md). --- ## Building Requires JDK 17, Android SDK 34, NDK r26+, Rust toolchain. ```bash # 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`](./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`](./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 `deviceManifestVersion` in `SYNC_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`](./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`](./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](https://kepr.uk) for review and distribution. ```bash 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`](./LICENSE).