33507f973788

docs: add README.md with repo overview, build, and sync model

time
2026-08-01 14:03 UTC · 2 months ago
machine
koh2
parent
6bc0390a2127
1 file README.md+95 −0
README.md+95 −0
@@ -0,0 +1,95 @@1+# peach-android2+3+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.4+5+**Current version:** v2.9.206+**Source:** [kepr.uk/peach-android](https://kepr.uk/peach-android)7+**License:** GPL v38+9+---10+11+## What this repo is12+13+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.14+15+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.16+17+---18+19+## Repository layout20+21+```22+app/src/main/java/com/peachpasswords/23+  sync/          Pairing, Noise handshakes, relay dialer, mesh manifest24+  autofill/      Inline + Accessibility autofill providers25+  codex/         Aztec encoder, RS erasure, deflate codec26+  passkeys/      WebAuthn / passkey storage and assertion27+  ui/            Compose screens (Lock, Vault, Settings, Trash, etc.)28+  qs/            Quick Settings tile29+  di/            Hilt modules30+  shared/        Cross-screen utilities31+32+docs/            Cryptographic vector provenance, browser parity map, audit33+app/drafts/      One-off integration drafts (often retired)34+```35+36+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).37+38+---39+40+## Building41+42+Requires JDK 17, Android SDK 34, NDK r26+, Rust toolchain.43+44+```bash45+# 1. Build the shared Noise core (one time, or whenever the crate changes)46+(cd ../peach-browser/crypto-core && cargo build --locked --release)47+48+# 2. Build the app49+./gradlew assembleRelease       # signed release APK50+./gradlew assembleDebug         # debug APK with com.peachpasswords.debug id51+./gradlew testDebugUnitTest     # sync + vault + crypto unit tests52+```53+54+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`).55+56+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.57+58+---59+60+## Sync model61+62+- **Pairing** — invitation over the cloud relay; Noise NK handshake establishes the rendezvous secret.63+- **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.64+- **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.65+- **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.66+67+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.68+69+---70+71+## Audits72+73+[`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.74+75+---76+77+## Version control78+79+This repo uses Koh, not git. Snapshots live locally and are offered to [kepr.uk](https://kepr.uk) for review and distribution.80+81+```bash82+koh status                        # current working tree83+koh save "feat: ..."              # atomic save84+koh checkpoint                    # pre-anything-risky restore point85+koh offer peach-android           # push to kepr.uk86+koh offer peach-android --builds  # build + publish APKs87+```88+89+`.agent/CONTINUITY.md` is the live handoff file for any session that has to stop mid-campaign.90+91+---92+93+## License94+95+GPL v3 — see [`LICENSE`](./LICENSE).

view file