README.md

4.8 KB · raw

rendered · source

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

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.