peach-android

@june

A free, open source, local-first password manager for Android.

Kotlin

v2.17.43 · 814 saves · 50,983 lines · updated 3 weeks ago

365 files
c13446e90fea
back to HEAD
app/4.8 MB · 2 months ago
drafts/221.1 KB · 4 months ago
C1/11.5 KB · 4 months ago
C7/17.6 KB · 4 months ago
MF1MF2/177.5 KB · 4 months ago
BROWSER-SPEC.mdExtracted from peach-browser source (read-only; never modified).26.8 KB · 4 months agoExportRoundTripTest.kt2.6 KB · 4 months agogen_peach_fixture.mjs1.9 KB · 4 months agoImportParsersTest.kt2.5 KB · 4 months agoImportScreen.kt───────────────────────────────────────────────────────────────────────────── ViewModel ─────────────────────────────────────────────────────────────────────────────26.0 KB · 4 months agomf1_kat_gen.mjsGenerates an MF-1 known-answer vector using the BROWSER's exact recovery algorithm (recovery-words.ts) against the REAL browser word list.4.1 KB · 4 months agoparse_android_export.mjs1011 B · 4 months agoPeachPayloadCodec.ktPeachScript binary payload (PCHS) — a byte-for-byte port of the browser's peachPayload.ts (MF-2).31.5 KB · 4 months agoPeachScript.ktPeachScript outer codec — maps each payload byte to one Private-Use-Area code point in U+E000..U+E0FF, and back.1.9 KB · 4 months agoPeachScriptExport.ktPeachScript export (MF-2) — writes the browser's PCHS binary payload (Argon2id + AES-256-GCM, zstd sections, BLAKE3 checksum, size-bucket padding, string-table entry packing) re-encoded into Private-Use-Area text.1.0 KB · 4 months agoPeachScriptImport.ktPeachScript import (MF-2) — parses the browser's PCHS binary payload back into full vault entries.2.2 KB · 4 months agoPeachScriptTest.kt9.9 KB · 4 months agoRecoveryEscrowTest.kt10.0 KB · 4 months agoRecoveryWords.kt6.0 KB · 4 months agoVaultCrypto.kt4.5 KB · 4 months agoVaultRepository.kt38.1 KB · 4 months agoVaultStore.ktOne encrypted slot at rest.7.5 KB · 4 months ago
B2-INTEGRATION.mdDraft implementation of spec B2 (lines 110–163).7.4 KB · 4 months agoC2-INTEGRATION.mdDraft implementation of spec C2 (lines 289–337).7.1 KB · 4 months ago
src/4.5 MB · 2 months ago
androidTest/3.5 KB · 3 months ago
debug/267 B · 3 months ago
res/267 B · 3 months ago
values/267 B · 3 months ago
main/4.1 MB · 2 months ago
java/1.4 MB · 2 months ago
com/1.4 MB · 2 months ago
peachpasswords/1.4 MB · 2 months ago
autofill/52.4 KB · 3 months ago
AssistStructureParser.ktThe autofillable fields discovered in one [AssistStructure], plus the origin (web domain for browsers, package name otherwise) used to rank vault entries.4.9 KB · 4 months agoAutofillEnablement.ktWhether Peach is actually the system's autofill service, and the one-time offer to make it so.2.1 KB · 3 months agoAutofillEntryPickerActivity.ktBranded bottom sheet shown when the user taps "Search Peach…"/"Unlock Peach" in the system autofill drop-down.22.7 KB · 3 months agoAutofillIntents.ktPendingIntents the autofill surfaces hand to the framework: a no-op attribution target the inline chip requires, the authentication IntentSender that opens the branded [AutofillEntryPickerActivity], and the "open new entry" launcher that the picker fires when the user taps the "+ Create new entry" affordance.3.8 KB · 3 months agoAutofillNavRepository.ktCarries a one-shot "open the new-entry editor" request from the autofill picker to the nav host.1.5 KB · 3 months agoAutofillNavViewModel.ktThin Compose-friendly wrapper around [AutofillNavRepository] so the NavHost can grab the singleton via hiltViewModel() without reaching for an EntryPoint accessor.499 B · 3 months agoAutofillResponseBuilder.ktTurns parsed form fields + vault entries into autofill [Dataset]s — the menu RemoteViews row, the inline keyboard chip, and the actual field values.5.5 KB · 4 months agoAutofillSave.kt3.0 KB · 4 months agoPeachAutofillService.ktSystem autofill provider.7.3 KB · 4 months agoTrustedBrowsers.ktConservative allowlist of apps permitted to request autofill for a web origin (MF-7).1.2 KB · 4 months ago
codex/37.5 KB · 3 months ago
di/655 B · 3 months ago
feedback/3.6 KB · 3 months ago
haptics/2.3 KB · 4 months ago
license/7.2 KB · 3 months ago
passkeys/33.8 KB · 4 months ago
qs/3.1 KB · 4 months ago
shared/4.3 KB · 4 months ago
sync/210.7 KB · 2 months ago
BackgroundSyncCoordinator.ktOwns the "when do we actually start the sync service?" decision for the background-sync preference.1.5 KB · 2 months agoBackgroundSyncPreference.kt1.6 KB · 2 months agoBatteryExemption.ktAsks once to be left out of Doze / App Standby.2.0 KB · 3 months agoCloudRelayDialer.ktOne relayed reconnect session where WE speak first — the mirror of [runCloudRelayResponderSession], and the half Android never had.4.7 KB · 2 months agoCloudRelayReconnectListener.kt26.4 KB · 2 months agoCryptoCompare.ktFixed-format protocol comparisons.539 B · 3 months agoDeviceIdentity.ktThe persisted keys keep their original names on purpose.3.3 KB · 2 months agoDeviceManifestSupport.kt0x02 added the revoked array to the signed body.7.5 KB · 3 months agoDeviceType.ktWhat kind of device a peer is, on the wire and in the paired-device store.936 B · 3 months agoForegroundSyncCoordinator.kt2.4 KB · 2 months agoNoiseKK.kt2.3 KB · 3 months agoNoiseNK.kt4.1 KB · 3 months agoPairedDevice.kt548 B · 3 months agoPairedDeviceStore.ktPersistent registry of paired devices, encrypted at rest with EncryptedSharedPreferences (same construction as DuressConfigStore / LicenseRepository, v2.1.36).10.3 KB · 2 months agoPairIdentityFrames.ktThe PAIR_IDENTITY frame: who a peer claims to be, exchanged inside the encrypted session once and pinned thereafter.4.7 KB · 3 months agoPairingAuth.kt4.7 KB · 3 months agoPairingFrames.ktLength-delimited frame IO for a pairing/sync connection.4.8 KB · 3 months agoPairingInvitation.kt1.9 KB · 3 months agoPairingSession.ktThe user's SAS decision, handed to the UI and awaited by the live pairing session.721 B · 3 months agoPeachSyncService.ktKeeps this device reachable on the relay so an already-paired peer can reconnect.11.4 KB · 2 months agoPeachWebSocket.ktA minimal RFC 6455 server endpoint — just enough of the protocol to talk to a browser extension's new WebSocket(...).7.5 KB · 3 months agoPendingVouchedDeviceStore.kt3.1 KB · 2 months agoRelayAdoptionHost.kt8.1 KB · 2 months agoRelayAdoptionReceiver.ktReceiver half of relay-first vault adoption.4.2 KB · 2 months agoRelaySettingsStore.ktSync is exactly three named choices (docs/sync-lan-retirement.md, mirroring the browser's sync-settings.ts):6.7 KB · 2 months agoRendezvous.kt5.5 KB · 3 months agoRustNoiseNative.ktThin JNI boundary over the canonical Rust snow state machine.3.4 KB · 3 months agoSASDerivation.kt543 B · 3 months agoSyncAlert.kt2.5 KB · 2 months agoSyncAlertStore.kt2.4 KB · 2 months agoSyncCoordinator.ktSync — Phase 2 manifest-diff coordinator.12.9 KB · 2 months agoSyncFrameTransport.ktE7b: split a too-large padded sync frame across multiple Noise transport messages and reassemble it on the other side.5.4 KB · 3 months agoSyncFreshStartResetter.ktClears every piece of state that can make a destroyed vault still look paired.1.7 KB · 2 months agoSyncIdentity.kt3.7 KB · 3 months agoSyncLimits.ktCloudflare Workers caps one WebSocket message at 32 MiB.1.6 KB · 3 months agoSyncMessage.ktSync wire protocol — exact port of the browser SyncMessage union (shared/sync-types.ts).4.2 KB · 3 months agoSyncOutcomeReason.ktWhy a sync attempt ended, in the same vocabulary the browser uses (src/shared/sync-outcome.ts).8.7 KB · 3 months agoSyncOutcomeStore.ktThe single place a sync attempt is allowed to end.3.1 KB · 3 months agoSyncPadding.ktE7: frame padding at the relay boundary.2.7 KB · 3 months agoSyncPeerRole.ktWho speaks first in a relay room.1.4 KB · 3 months agoSyncSession.ktTransport-neutral session consumed by the sync coordinator.439 B · 3 months agoVaultAdopt.ktVault adoption frame protocol — exact port of the browser shared/vault-adopt.ts.13.0 KB · 2 months agoVaultSyncAdapter.ktProduction [SyncVaultAdapter] backing the coordinator with the live [VaultRepository].11.9 KB · 2 months ago
ui/855.9 KB · 2 months ago
codex/45.2 KB · 3 months ago
components/67.9 KB · 3 months ago
BirdAnimation.ktThe three acts of the pairing animation, bound to the audio protocol.5.8 KB · 3 months agoCharEnterText.ktPer-character entrance: each glyph fades in and rises into place with a staggered delay.2.8 KB · 4 months agoCopyButton.ktCopy button with the two-effect copy feedback (spec §4.4): a diagonal sheen sweeps once over ~600ms and an accent drain bar fills 0→100% over 1.4s.3.6 KB · 4 months agoCopyFeedbackOverlay.kt3.2 KB · 3 months agoFaviconInitials.ktInitials chip used in place of a network favicon (offline-first).2.9 KB · 4 months agoLockRuneString.kt2.4 KB · 4 months agoPairingBirds.ktThe two pairing birds, ported path-for-path from the browser extension's PairDeviceFlow.tsx (a finch and a swallow) rather than redrawn by eye.14.4 KB · 3 months agoPeachEmptyOrEndState.kt2.0 KB · 3 months agoPeachExpandableCard.kt2.7 KB · 3 months agoPeachField.kt3.7 KB · 3 months agoPeachMark.ktThe Peach brand mark — a peach fruit with a single leaf.3.2 KB · 3 months agoPeachSegmentedControl.kt5.2 KB · 3 months agoPeachTopBar.kt2.7 KB · 3 months agoQaFlags.ktDebug-only, opt-in escape hatch so automated visual QA (screenshot-based Gate 2 comparisons) can capture screens that are normally FLAG_SECURE-protected.630 B · 3 months agoRuneGridBackground.kt6.4 KB · 3 months agoSecureFlagEffect.ktSets WindowManager.FLAG_SECURE while this composable is in the composition and clears it on dispose — blocking screenshots, screen recording, and the recents thumbnail of screens that display secrets (MN-3: recovery words, export blob, codex generation).1.4 KB · 3 months agoSyncIndicatorDot.ktThe sync indicator light, shared by the vault list and the Sync settings card so the two can never disagree.2.8 KB · 3 months agoTOTPRing.ktA small ring that sweeps once per TOTP period and turns breach-red in the final 5 seconds.2.1 KB · 3 months ago
lock/35.6 KB · 2 months ago
onboarding/17.5 KB · 2 months ago
pairing/61.4 KB · 2 months ago
recovery/19.6 KB · 3 months ago
security/6.6 KB · 4 months ago
settings/127.5 KB · 2 months ago
sync/10.9 KB · 2 months ago
theme/18.1 KB · 3 months ago
updates/20.4 KB · 3 months ago
vault/406.1 KB · 2 months ago
AdditionalUrlsDetail.ktE3 — additional-URL rows for EntryDetailScreen.11.4 KB · 4 months agoAdditionalUrlsEditor.ktE3 — hard cap on additional URLs, matching the spec.4.7 KB · 4 months agoCardDetailFields.ktD2 — EntryDetail CARD display block.8.6 KB · 4 months agoCardEditFields.ktD2 — EntryEdit CARD field block.4.0 KB · 4 months agoCardFieldUtils.ktShared card formatting/detection helpers for D2 (card type fields).6.2 KB · 4 months agoContextMenuSheet.ktD12 long-press context menu (spec §9).6.0 KB · 4 months agoCsvExport.ktPure-Kotlin CSV serialisation for the C2 Export screen (CSV sub-view).2.2 KB · 4 months agoCsvImport.ktPure-Kotlin CSV / JSON import parsing for the Import screen (spec B2).19.0 KB · 4 months agoDetailTagRow.ktInline tag row for EntryDetailScreen, mirroring the browser EntryView: chips display in place, and the "+" affordance expands a same-surface tag editor.4.0 KB · 4 months agoEditableFieldRow.ktD6 — Inline per-field editing for EntryDetailScreen.13.8 KB · 3 months agoEntryDetailGenerator.ktD4 drafts — generator access from EntryDetailScreen.7.0 KB · 3 months agoEntryDetailScreen.kt38.2 KB · 3 months agoEntryDetailViewModel.kt13.5 KB · 3 months agoEntryEditScreen.kt20.7 KB · 3 months agoEntryEditViewModel.kt15.3 KB · 3 months agoExportScreen.kt───────────────────────────────────────────────────────────────────────────── Password strength scorer (local, dependency-free) ─────────────────────────────────────────────────────────────────────────────20.5 KB · 3 months agoIdentitySuggestDropdown.ktAnchored suggestion dropdown for identity-style fields (username/email).5.0 KB · 4 months agoImportScreen.kt───────────────────────────────────────────────────────────────────────────── ViewModel ─────────────────────────────────────────────────────────────────────────────37.5 KB · 3 months agoMultiSelectUi.ktD12 multi-select per-row checkbox (spec §9).4.1 KB · 4 months agoNoteHtml.ktNote bodies are authored in the browser's contenteditable, so a synced note arrives as HTML: the extension's sanitizer allow-list (NoteEditor.tsx) is b, strong, i, em, u, s, h2, h3, ul, ol, li, br, hr, p — attribute-less — plus the div wrappers Chrome's contenteditable inserts for new lines.10.8 KB · 3 months agoNotesModeScreen.ktE2 — full-screen editor for NOTE-type entries.19.8 KB · 3 months agoNotesModeViewModel.ktBacks [NotesModeScreen].4.7 KB · 4 months agoPasswordHistorySection.ktShared past-password history UI, extracted from EntryEditScreen so both the editor and EntryDetailScreen render the same rows.6.4 KB · 4 months agoPeachField.ktThe Peach text field used across the entry-edit screens: a bare underline (no border box), drawn in t3 and lit to the accent while focused — matching the lock screen's credential inputs.4.2 KB · 4 months agoPeachScriptExport.ktPeachScript export (MF-2) — writes the browser's PCHS binary payload (Argon2id + AES-256-GCM, zstd sections, BLAKE3 checksum, size-bucket padding, string-table entry packing) re-encoded into Private-Use-Area text.1.4 KB · 4 months agoPeachScriptImport.ktPeachScript import (MF-2) — parses the browser's PCHS binary payload back into full vault entries.2.7 KB · 4 months agoRecoveryWordsScreen.kt12.1 KB · 3 months agoRuneResolve.ktWhich leg of the restore animation is running (browser: RestoreSymbols' animating).7.0 KB · 3 months agoTagChipEditor.ktMax tags per entry.7.2 KB · 4 months agoTagListWidgets.ktHorizontally scrollable tag filter strip for VaultListScreen, placed between the search bar and the sort bar.3.6 KB · 4 months agoTotpInlineEdit.ktE6 — TOTP double-tap to edit the 2FA secret, inline in EntryDetailScreen.12.3 KB · 4 months agoTrashScreen.kt9.8 KB · 3 months agoVaultHealthScreen.ktWarm amber used for the "reused" and "weak" advisory buckets.13.1 KB · 3 months agoVaultListScreen.kt37.6 KB · 2 months agoVaultListViewModel.kt11.7 KB · 3 months ago
PeachAppNavHost.kt16.5 KB · 3 months agoPeachNav.ktEvery navigation destination in the app.2.8 KB · 3 months ago
updates/23.2 KB · 3 months ago
vault/176.6 KB · 3 months ago
BrowserSlot.ktReads the browser extension's slot A so Android can restore a vault that was created there — a Codex printed from the extension, most importantly.6.7 KB · 3 months agoCanary.kt325 B · 4 months agoDuressConfig.ktThe action Peach takes when the duress passphrase is entered at the lock screen.3.4 KB · 4 months agoJwkString.ktReads a passkey's privateKeyJwk whether it arrives as a JSON object or a string, and writes it back as an object.2.4 KB · 3 months agoLastViewedEntryStore.ktRemembers the id of the entry the user last opened so a fresh unlock can land straight back on it (matching the extension, which opens the last entry rather than the list).1.7 KB · 4 months agoPasskeyData.kt771 B · 3 months agoPasswordGenerator.ktCryptographically random password generator.1.6 KB · 4 months agoPasswordHistoryItem.ktOne past password kept in [VaultEntry.passwordHistory].758 B · 4 months agoPeachPayloadCodec.ktPeachScript binary payload (PCHS) — a byte-for-byte port of the browser's peachPayload.ts (MF-2).34.5 KB · 4 months agoPeachScript.ktPeachScript outer codec — maps each payload byte to one Private-Use-Area code point in U+E000..U+E0FF, and back.1.9 KB · 4 months agoRecoveryWordList.ktRecovery word list — byte-identical to the browser's src/shared/recovery-word-list.ts: the canonical 2048-word BIP39 English list, 0-indexed, no duplicates.20.6 KB · 3 months agoRecoveryWords.kt5.4 KB · 3 months agoSavedIdentity.kt250 B · 4 months agoTOTPGenerator.ktRFC 6238 TOTP / RFC 4226 HOTP.3.8 KB · 4 months agoVaultCrypto.kt6.4 KB · 3 months agoVaultEntry.kt3.6 KB · 3 months agoVaultHealth.kt3.9 KB · 4 months agoVaultLockTimer.ktIdle auto-lock timer.1.8 KB · 4 months agoVaultRepository.ktLenient parser for the Codex vault-blob wrapper only.66.7 KB · 3 months agoVaultSettings.kt747 B · 3 months agoVaultSnapshot.kt269 B · 4 months agoVaultStore.ktOne encrypted slot at rest.9.3 KB · 3 months ago
widget/2.7 KB · 4 months ago
MainActivity.ktFragmentActivity (not ComponentActivity) so androidx BiometricPrompt can attach.7.2 KB · 3 months agoPeachApplication.kt2.4 KB · 3 months ago
jniLibs/2.0 MB · 3 months ago
arm64-v8a/502.8 KB · 3 months ago
armeabi-v7a/379.1 KB · 3 months ago
x86/634.1 KB · 3 months ago
x86_64/581.5 KB · 3 months ago
res/664.0 KB · 3 months ago
AndroidManifest.xml7.4 KB · 2 months ago
test/442.3 KB · 2 months ago
java/442.3 KB · 2 months ago
com/442.3 KB · 2 months ago
peachpasswords/442.3 KB · 2 months ago
autofill/10.5 KB · 3 months ago
codex/9.4 KB · 4 months ago
feedback/1.7 KB · 3 months ago
license/519 B · 4 months ago
passkeys/11.2 KB · 4 months ago
qs/1.2 KB · 4 months ago
security/6.5 KB · 4 months ago
shared/3.0 KB · 4 months ago
sync/173.4 KB · 2 months ago
BackgroundSyncCoordinatorTest.ktThe v2.5.13 gate if (enabled && vault.isUnlocked.value) was wrong: the user almost always enables background sync from Settings while the vault is locked, so the service never started and the device stayed invisible to paired peers.5.7 KB · 2 months agoBackgroundSyncPreferenceTest.kt573 B · 2 months agoC7TransportTest.ktC7 transport tests.9.5 KB · 3 months agoCloudRelayDialerTest.ktPhone-to-phone: the case that had no initiator at all.11.4 KB · 2 months agoCloudRelayReconnectListenerTest.ktEnough of a vault to send SYNC_HELLO; the peer stalls before anything else.13.2 KB · 2 months agoForegroundSyncCoordinatorTest.kt996 B · 4 months agoNoiseKKTest.kt4.3 KB · 3 months agoPairedDeviceRevocationTest.kt1.7 KB · 2 months agoPairingAuthTest.kt3.8 KB · 3 months agoPairingInvitationTest.kt1.2 KB · 3 months agoPeachWebSocketTest.ktExercises the server against OkHttp's RFC 6455 client rather than a hand-rolled one.5.7 KB · 3 months agoRelayAdoptionHostTest.kt14.7 KB · 3 months agoRelayGateTest.ktThe fail-closed relay gate, mirroring the browser's sync-settings.test.ts.3.5 KB · 3 months agoRelaySettingsPropagationTest.ktWhat a relay change does to the existing mesh, mirroring the browser's setSyncMode / setRelayUrl.3.0 KB · 2 months agoRendezvousTest.kt4.1 KB · 3 months agoSyncAlertTest.kt3.2 KB · 2 months agoSyncCoordinatorTest.ktTwo in-memory [SyncSession]s wired back to back.6.9 KB · 2 months agoSyncFrameTransportTest.ktE7b end-to-end chunking — the deliverable for the wire shape.6.6 KB · 3 months agoSyncFreshStartResetterTest.kt1.0 KB · 2 months agoSyncNotificationPersistenceTest.kt1013 B · 2 months agoSyncOutcomeTest.ktThe indicator light is the whole point of this vocabulary, so the mapping is swept exhaustively rather than sampled: a reason added later has to be given a place here or the sweep fails.9.8 KB · 3 months agoSyncPaddingTest.kt4.5 KB · 3 months agoSyncServiceStartTest.ktThe service start is the first step of every sync path, and it was the one step that could throw straight out of a button press: Android 12+ refuses a foreground service started from the background, and startForegroundService was called bare.2.7 KB · 2 months agoSyncSuiteTest.ktSync suite (brief Suite 13): length-prefixed pairing frames, SAS derivation KAT, and cross-device entry sync through the [VaultSyncAdapter] (two repositories made to share a sync root key via the Codex blob).9.4 KB · 3 months agoVaultAdoptTest.ktAdoption frame protocol parity with the browser vault-adopt.test.ts.15.9 KB · 2 months agoVaultSyncAdapterTest.kt29.1 KB · 3 months ago
ui/82.8 KB · 2 months ago
codex/2.9 KB · 4 months ago
lock/5.6 KB · 4 months ago
onboarding/3.9 KB · 2 months ago
pairing/6.0 KB · 2 months ago
security/3.0 KB · 4 months ago
settings/4.9 KB · 3 months ago
theme/870 B · 3 months ago
vault/50.9 KB · 2 months ago
NavigationFlowTest.ktNavigation suite (brief Suite 9): route construction and the flow-decision functions that route the app — onboarding gate, list-tap, and post-unlock.4.8 KB · 3 months ago
updates/3.8 KB · 3 months ago
vault/131.5 KB · 3 months ago
BrowserPasskeyJwkTest.ktA passkey's privateKeyJwk is a JSON OBJECT in the browser (JsonWebKey in shared/types.ts); Android holds it as a compact string.2.9 KB · 3 months agoBrowserSlotTest.ktPins the browser→Android slot-A translation that Codex restore depends on.4.8 KB · 3 months agoCardSerializationTest.ktIn-memory [VaultStorage] for exercising last4 derivation on save (MF-3).3.4 KB · 4 months agoCrossPlatformRecoveryWordsTest.ktRecovery words are only a human-readable encoding of the root key's first 16 bytes, so the two platforms MUST agree on the word list byte for byte.2.8 KB · 3 months agoDuressSlotBTest.ktIn-memory [VaultStorage] including a decoy (slot B) slot, for the MF-6 duress model.5.3 KB · 3 months agoOfficialCryptoVectorsTest.kt2.8 KB · 3 months agoPasskeyEntryTest.kt1.1 KB · 4 months agoPasswordGeneratorTest.kt1.2 KB · 4 months agoPeachScriptRoundTripTest.ktPeachScript + CSV round-trip suite (brief Suite 7): large-vault fidelity, ciphertext tamper detection, size-bucket padding, and CSV column/injection behavior.6.5 KB · 4 months agoPeachScriptTest.kt10.5 KB · 4 months agoRecoveryEscrowIntegrationTest.ktIntegration coverage for the full create → confirm → seal → unlock recovery chain (brief Fix 1).4.8 KB · 4 months agoRecoveryEscrowSuiteTest.ktRecoveryEscrow suite (brief Suite 3): word validation/autocomplete, partial and wrong-word failures, missing-escrow handling, recovery-driven password reset, and the duress-mode guard that recovery escrows are never sealed for the decoy.8.2 KB · 3 months agoRecoveryEscrowTest.kt10.5 KB · 3 months agoSlotAUnlockTest.ktIn-memory [VaultStorage] for the non-committing dual-derivation path (MF-5).3.1 KB · 4 months agoSlotPaddingTest.ktExposes the raw stored slots so the padding lengths (MN-1) can be inspected.3.1 KB · 4 months agoTOTPGeneratorTest.kt1.3 KB · 4 months agoVaultCryptoKdfTest.ktMF-4: the Argon2id KDF must hash the password's explicit UTF-8 bytes (matching the browser's TextEncoder().encode), not its UTF-16 code units.1.9 KB · 4 months agoVaultCryptoTest.ktVaultCrypto suite (brief Suite 2): Argon2id key derivation, AES-256-GCM round-trips, AAD enforcement, and KDF parameters.9.1 KB · 3 months agoVaultHealthTest.ktVaultHealth suite (brief Suite 8): the pure [VaultHealth.buildReport] scoring — breach / reused / weak / aged / sensitivity detection, section counts, and the sensitivity-weighted vault score.7.5 KB · 4 months agoVaultLockTimerTest.ktIn-memory [VaultStorage] so the timer can drive a real repository off-device.3.9 KB · 4 months agoVaultRepositoryExtraTest.ktSecond VaultRepository suite (brief Suite 1 expansion).16.6 KB · 3 months agoVaultRepositoryTest.ktIn-memory [VaultStorage] so the repository can be exercised without Android.20.1 KB · 3 months ago
widget/761 B · 4 months ago
CrossPlatformKATTest.ktMN-4: cross-platform known-answer tests.6.1 KB · 3 months ago
build.gradle7.9 KB · 2 months agoproguard-rules.pro44 B · 4 months ago
gradle/73.4 KB · 4 months ago
scripts/1.6 KB · 3 months ago
build.gradle667 B · 3 months agogradle.properties222 B · 4 months agogradlew734 B · 4 months agokepr.build524 B · 3 months agopeach-android-audit-report.mdDate: 2026-06-09 Base version (per brief): v2.1.40 — note: app/build.gradle actually declares versionName "2.2.0" / versionCode 202000.41.5 KB · 4 months agosettings.gradle396 B · 4 months agoVERSION7 B · 2 months ago
4f2c5bf3279bfix: redirect locked vault destinations (v2.7.14)2 months ago47e77d4ba508fix: open populated phones directly at pairing (v2.7.13)2 months ago7c32509a6aa3phone reads vaultStatus from the scanned invitation and switches roles: 'empty' → grantAdoption (send the vault to the empty browser), 'populated' or missing → existing receiver flow unchanged. Defaults to 'populated' for older invitations so historical sync is unaffected. (v2.7.12)2 months ago4e097b1b4521chaos destroy screen: red header 'THIS IS YOUR LAST CHANCE', three single-sentence warnings in breach red, solid red 'DESTROY MY VAULT FOREVER' button, 'No — take me back' escape (v2.7.11)2 months agoe8637519f572drop the first-contact block on populated vault adoption: a second browser, tablet, or phone is now welcome to scan a QR and join an existing mesh as long as the vault id matches. The vault-id check in createVaultFromRootKey is the real security boundary; the prior known-peer gate prevented the intended N-device mesh and is removed (v2.7.10)2 months ago7c92cad1f1f8restore the QR scan entry point in Sync > Add a device: alongside 'show code', a 'scan' button opens the camera-driven AdoptVault flow so a phone can join an existing browser-only vault (v2.7.9)2 months ago727903630472treat a peer's post-DONE hang-up as a completed sync, not errored; add CONNECTION_LOST outcome and a WARN indicator tier so network-class misses (relay/handshake/timeout/connection_lost) read amber, not red, mirroring the browser fix (v2.7.8)2 months ago33515d267786docs: Record v2.7.7 physical install2 months agoee76db7f27e3feat: Add long-press selection to vault and Notes (v2.7.7)2 months ago916249d84985fix: Require a visible background sync notification (v2.7.6)2 months ago99fee5aa1ebcfix: Move Sync security alerts to notifications (v2.7.5)2 months agocca4cca7f47efix: Flush final adoption acknowledgement (v2.7.4)2 months agoc13446e90feadocs: Record v2.7.3 device validation2 months agobee916190cd6fix: Show adoption password validation feedback (v2.7.3)2 months ago8d6cf9d4e33bfix: Keep relay capabilities out of logs (v2.7.2)2 months agoea87fc9113f8fix: Default private relay fields to wss scheme (v2.7.1)2 months agoaeae7c03641ffeat: Let vault presence direct pairing (v2.7.0)2 months agoe4607bb6696bfix: Make vault destruction reset Sync state (v2.6.2)2 months agofb46840009b2feat: Keep routine sync quiet (v2.6.1)2 months agoccf5e6f8b042feat: Simplify Sync Settings with progressive disclosure (v2.6.0)2 months agod7406e5e9d9dfix: Collapse stacked sync updates in the vault (v2.5.23)2 months agod620000dab23feat: Make pairing safe, QR-only, and single-confirm (v2.5.22)2 months agod2b3473d34edfix: Clear receiver re-pair revocation (v2.5.21)2 months ago7b366ada2ceafix: Replace relay waiters without reconnect storms (v2.5.20)2 months ago6d4f0fd4366afix: Refresh stale relay waiters on sync now (v2.5.19)2 months agoe5e2965ac456chore: Trace sync protocol receive stages (v2.5.18)2 months agoec914e23f6d4fix: Restore dismissed sync notification (v2.5.17)2 months ago2dfe4d9c3398fix: Remove stale revoked device rows (v2.5.16)2 months agof90df691e6d2add PeachSync relay reconcile, room, socket, and dial diagnostics with log-capture coverage (v2.5.15)2 months agod115d87bd22aremove the locked-state gate from setBackgroundSyncEnabled and add a vault-unlock observer so the sync service starts whenever preference is on (v2.5.14)2 months ago4b98699ba304ask paired users about persistent background sync, honor manual-only opt-out in settings, and default existing installs on (v2.5.13)2 months ago4ebae050a135mirror chunking on Android with the marker wire shape from peach-browser sync-transport.ts; route every encrypt-of-padded-frame callsite through sendSyncFrame/receiveSyncFrame, slice non-last chunks at MAX-1 to leave room for the marker, and pin the constants and the bucket ladder in cross-platform KAT (v2.5.12)3 months ago7b389c585363add SyncFrameTransport chunking helper and cross-platform KAT constants; route every encrypt-of-padded-frame callsite through it3 months agodcb2093343f2the dialler's outer bound stops racing the coordinator's session timeout: DIAL_SESSION_TIMEOUT_MS is now derived as SESSION_TIMEOUT_MS + 15s of handshake headroom (45s) instead of a hand-written 30s equal to it, so a stalled peer is always named SYNC_TIMEOUT by the coordinator rather than cancelled by whichever of two equal deadlines the scheduler reached first; the outer bound now only fires for the empty-room case it was written for, and reports it as HANDSHAKE_FAILED with a distinguishing detail line instead of rethrowing a cancellation nobody reports (v2.5.11)3 months ago0c5ab4dfdcdfa foreground-service start Android refuses becomes a reported FOREGROUND_START_BLOCKED instead of a crash or silence: PeachSyncService.start and onStartCommand's own startForeground both route through startOrReportBlocked, which catches IllegalStateException (the supertype of API 31's ForegroundServiceStartNotAllowedException, so no minSdk guard is needed) and reports through SyncOutcomeStore, fetched via a Hilt EntryPoint so all six call sites are covered by the one guard; a refused START_STICKY restart now stops itself rather than returning to be refused again3 months agocf0e3a2db9ddrelay changes reach existing pairs: setSyncMode/setRelayUrl push the in-force relay into every paired device through the relayInForce gate, so private-unset and off push nothing; adoption records the source's relay so the Sync card stops claiming Public on a phone dialling a private one (v2.5.10)3 months ago90740782e940fail closed on private relay with no address: relayInForce gate, PRIVATE_RELAY_UNSET outcome, honest empty relay field (v2.5.9)3 months ago29ce33a356c2note why PeachSyncService's locked-vault early return stays silent3 months ago4b1a7052c2deversion 2.5.8 / build 240108 (v2.5.8)3 months agoce4aae51c322route every terminating sync path through SyncOutcomeStore: relay sessions report failures instead of swallowing them, syncNow drops the unearned LastSynced claim3 months agof7bb934c823badd SyncOutcomeReason vocabulary and persistent SyncOutcomeStore mirroring the browser's sync-outcome contract3 months ago729a9f19fd13version 2.5.7 / build 240107 (v2.5.7)3 months ago140731f8bafbentry detail and the entry edit form take the same note round trip as notes mode: the notes row displays parsed HTML and copies plain text, the form loads markup and writes the tags back, so a login's formatted note is no longer flattened by an edit on the phone3 months ago052628df2835note bodies parse the browser's tag vocabulary (b/strong, i/em, u, s, h2, h3, ul, ol, li, br, hr, p, plus contenteditable's divs) into an AnnotatedString: notes mode opens rendered and edits a plain-text markup that serialises back to the same tags on save, so a formatted note survives a phone edit; the TOC preview line and note search read rendered text instead of raw markup3 months ago231dc4b86232text size control and the fictional Shortcuts card removed — neither had any reader; continuity records the per-control audit (v2.5.6)3 months ago3492ddd79dbdpeach on android is dark-only: light palette, theme-mode branching, the inverted values-night light resources and the theme setting all gone (v2.5.6)3 months ago49be2ef5e42ematch device revocation on the revoked long-term key, not just the self-asserted deviceId, so a revoked device cannot return under a fresh id (v2.5.5)3 months ago3831ea3a2d15correct the feedback record: the old key had no account behind it, so the 200 success it returned was never evidence of delivery3 months agofa9a48cf0dc1point Android feedback at the Web3Forms account that actually exists, matching the extension's new key (v2.5.4)3 months ago6e1ed815b3b9record the feedback wiring, the completed chirp rename, why the persisted identity keys keep their stale names, and how to get a file name out of a failing kapt run3 months ago

← newerolder →

details

Peach for Android

A free, open source, local-first password manager for Android.

No accounts. No subscription. Your passwords stay on the device, encrypted with AES-256-GCM and protected by Argon2id key derivation. Sync, backup, and autofill happen without trusting any cloud in the middle.

peachpasswords.com


Features

  • Zero-knowledge vault — AES-256-GCM encryption, Argon2id KDF, keys never leave your device
  • End-to-end encrypted sync — pairs with your other Peach devices over a Noise channel; the relay only forwards ciphertext it cannot read
  • Inline autofill — fills directly in apps, no copy-paste detour
  • Passkeys — WebAuthn credentials alongside your passwords
  • Quick Settings tile — copy a credential from anywhere with a single tap
  • Biometric unlock — hardware-backed AndroidKeyStore escrow, invalidated on enrollment change
  • Codex — prints your encrypted vault as Aztec codes on paper. Physical offline backup

Open Source

Peach is free and open source under the GPL v3 license. Both the browser extension and the Android app.

The source is hosted on Kepr — Asha Software's own version control platform.


Security

Peach has undergone two adversarial analysis sessions against this codebase. The most recent findings have been resolved.

Cryptographic primitives:

  • Key derivation: Argon2id (m=64MiB, t=3, p=4)
  • Encryption: AES-256-GCM with fresh random nonces
  • Sync handshake: Noise NK / Noise KK (25519, ChaChaPoly, BLAKE2s)
  • Backup codec: GF(2⁸) Reed-Solomon with zstd compression
  • BLAKE3 checksums throughout

The canonical Noise core lives in a shared Rust crate with the browser extension — Android drives it via JNI. See docs/CRYPTOGRAPHIC-TEST-VECTORS.md for the byte-level vectors that pin each primitive.


Building

./gradlew assembleRelease

Outputs to app/build/outputs/apk/release/. The shared Noise core is built from ../peach-browser/crypto-core.


License

GPL v3 — see LICENSE.


Peach Pro

Pro features (end-to-end encrypted sync, Codex, Canary) are available for $39 one-time at peachpasswords.com. Purchasing Pro supports continued development.


Built by Asha Software · [email protected]