peach-android

@june

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

Kotlin

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

503 files
77bd226029ec
back to HEAD
app/4.8 MB · 3 weeks ago
src/4.7 MB · 3 weeks ago
androidTest/33.1 KB · 1 month ago
debug/267 B · 3 months ago
res/267 B · 3 months ago
values/267 B · 3 months ago
main/3.7 MB · 3 weeks ago
java/1.9 MB · 1 month ago
com/1.9 MB · 1 month ago
peachpasswords/1.9 MB · 1 month ago
autofill/112.9 KB · 1 month ago
AssistStructureParser.ktThe autofillable fields discovered in one [AssistStructure], plus the origin Android authenticated for ranking vault entries.13.1 KB · 1 month 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.36.3 KB · 1 month 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.8.1 KB · 1 month 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 agoAutofillOrigin.ktOrigin resolution for autofill matching.3.8 KB · 1 month agoAutofillResponseBuilder.ktTurns parsed form fields + vault entries into autofill [Dataset]s — the menu RemoteViews row, the inline keyboard chip, and the actual field values.23.2 KB · 1 month agoAutofillSave.kt3.3 KB · 1 month agoChipMonogramIcon.ktMonogram chip icons for inline autofill suggestions — the same initials and deterministic background as the vault list (titleInitials/titleBackground), rendered once per source and cached.1.7 KB · 2 months agoIdentities.ktSignup identities for the autofill picker (parity gap A4).3.6 KB · 2 months agoPasswordPolicy.ktSite password constraints detected from a password field's HTML attributes (exposed by [android.app.assist.AssistStructure.ViewNode.getHtmlInfo]).3.6 KB · 1 month agoPeachAutofillService.ktSystem autofill provider.12.2 KB · 1 month ago
codex/43.2 KB · 1 month ago
credentials/19.4 KB · 1 month ago
di/1.1 KB · 1 month ago
feedback/3.6 KB · 3 months ago
haptics/3.0 KB · 2 months ago
license/8.4 KB · 1 month ago
passkeys/72.7 KB · 1 month ago
qs/3.0 KB · 1 month ago
shared/7.8 KB · 1 month ago
sync/374.1 KB · 1 month ago
AdoptionProtocol.ktAdoption transcript v2.17.9 KB · 1 month agoBackgroundSyncCoordinator.ktOwns the "when do we actually start the sync service?" decision for the background-sync preference.1.9 KB · 1 month agoBackgroundSyncPreference.kt1.6 KB · 2 months agoBatteryExemption.ktAsks once to be left out of Doze / App Standby.3.8 KB · 2 months agoBootReceiver.ktRestarts the sync service after a reboot.770 B · 2 months agoCloudRelayDialer.ktOne relayed reconnect session where WE speak first — the mirror of [runCloudRelayResponderSession], and the half Android never had.4.6 KB · 2 months agoCloudRelayReconnectListener.kt33.1 KB · 1 month agoCryptoCompare.ktFixed-format protocol comparisons.539 B · 3 months agoDeviceIdentity.kt6.7 KB · 1 month agoDeviceManifestSupport.kt0x05 adds signed per-issuer revocation records to the vouch graph.14.7 KB · 1 month agoDeviceType.ktWhat kind of device a peer is, on the wire and in the paired-device store.936 B · 3 months agoForegroundSyncCoordinator.kt3.7 KB · 1 month agoLocalIdentityRecord.ktPersisted local-identity record codec (campaign task 2.1).4.9 KB · 1 month agoLockedSyncSpoolStore.kt11.6 KB · 1 month agoNoiseKK.kt2.3 KB · 3 months agoNoiseNK.kt4.1 KB · 3 months agoPairedDevice.kt613 B · 1 month agoPairedDeviceStore.kt24.8 KB · 1 month agoPairIdentityFrames.ktThe PAIR_IDENTITY frame: who a peer claims to be, exchanged inside the encrypted session once and pinned thereafter.6.0 KB · 2 months agoPairingFrames.ktLength-delimited frame IO for a pairing/sync connection.7.8 KB · 1 month agoPairingInvitation.kt4.1 KB · 1 month 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 its deterministic relay waiter edges and drives its dialer edges.12.8 KB · 1 month 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.kt8.9 KB · 1 month agoRelayAdoptionHost.kt13.1 KB · 1 month agoRelayAdoptionReceiver.ktReceiver half of relay-first vault adoption.19.5 KB · 1 month 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.9 KB · 1 month agoRustNoiseNative.ktThin JNI boundary over the canonical Rust snow state machine.3.2 KB · 1 month agoSASDerivation.kt543 B · 3 months agoSyncAlert.kt2.9 KB · 2 months agoSyncAlertStore.kt3.4 KB · 2 months agoSyncCoordinator.ktSync — Phase 2 manifest-diff coordinator.17.2 KB · 1 month agoSyncFrameTransport.ktE7b: split a too-large padded sync frame across multiple Noise transport messages and reassemble it on the other side.7.4 KB · 1 month agoSyncFreshStartResetter.ktClears every piece of state that can make a destroyed vault still look paired.2.1 KB · 1 month agoSyncGeneration.ktThe durable Sync-generation state machine (protocol §11).8.9 KB · 1 month agoSyncGenerationStore.ktStorage adapter for the Sync-generation state machine.6.4 KB · 1 month agoSyncIdentity.kt3.4 KB · 1 month agoSyncLimits.ktCloudflare Workers caps one WebSocket message at 32 MiB.2.8 KB · 1 month agoSyncMessage.ktSync wire protocol — exact port of the browser SyncMessage union (shared/sync-types.ts).7.3 KB · 1 month agoSyncNotificationPermission.ktA foreground service can keep running after Android notification permission is denied, but its status notification disappears from the drawer.1.3 KB · 2 months agoSyncOutcomeReason.ktWhy a sync attempt ended, in the same vocabulary the browser uses (src/shared/sync-outcome.ts).11.1 KB · 1 month 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 · 2 months agoSyncPeerRole.ktWho speaks first in a relay room.1.1 KB · 2 months agoSyncSession.ktTransport-neutral session consumed by the sync coordinator.439 B · 2 months agoVaultAdopt.ktVault adoption frame protocol — exact port of the browser shared/vault-adopt.ts.37.1 KB · 1 month agoVaultSyncAdapter.ktProduction [SyncVaultAdapter] backing the coordinator with the live [VaultRepository].20.6 KB · 1 month ago
ui/976.0 KB · 1 month ago
codex/45.5 KB · 1 month ago
components/81.9 KB · 1 month ago
BirdAnimation.ktThe three acts of the pairing animation, bound to the audio protocol.5.8 KB · 2 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.ktFavicons repository for this window; provided by MainActivity and the picker.4.6 KB · 2 months agoFavicons.ktU1: real site favicons, offline-first with a disk cache.7.4 KB · 1 month 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.4.0 KB · 2 months agoPeachSectionHeader.ktQuiet branded section identity used instead of the retired contained top bar.1.8 KB · 2 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.701 B · 2 months agoRuneGridBackground.kt6.4 KB · 3 months agoSecureFlagEffect.ktAcquires a reference-counted secure-window lease while this composable is in the composition — blocking screenshots, screen recording, and the recents thumbnail of screens that display secrets (MN-3: recovery words, export blob, codex generation).1.6 KB · 2 months agoSecureWindowPolicy.ktThe only owner of [WindowManager.LayoutParams.FLAG_SECURE] transitions.2.1 KB · 2 months agoSyncIndicatorDot.ktThe sync indicator light, shared by the vault list and the Sync settings card so the two can never disagree.2.9 KB · 2 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/49.3 KB · 1 month ago
onboarding/18.9 KB · 2 months ago
pairing/89.0 KB · 1 month ago
recovery/19.1 KB · 2 months ago
security/6.6 KB · 4 months ago
settings/153.3 KB · 1 month ago
sync/16.6 KB · 1 month ago
theme/19.1 KB · 2 months ago
updates/21.8 KB · 1 month ago
vault/432.1 KB · 1 month ago
AdditionalUrlsDetail.ktE3 — additional-URL rows for EntryDetailScreen.12.6 KB · 1 month agoAdditionalUrlsEditor.ktHard cap on additional URLs, matching the browser editor.4.0 KB · 2 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 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).30.1 KB · 1 month agoDetailTagRow.ktInline tag row for EntryDetailScreen, mirroring the browser EntryView: chips display in place, and the "+" affordance expands a same-surface tag editor.3.1 KB · 2 months agoEditableFieldRow.ktD6 — Inline per-field editing for EntryDetailScreen.14.3 KB · 2 months agoEntryDeckChrome.kt4.8 KB · 2 months agoEntryDetailGenerator.ktD4 drafts — generator access from EntryDetailScreen.7.7 KB · 1 month agoEntryDetailScreen.kt32.5 KB · 2 months agoEntryDetailViewModel.kt14.4 KB · 2 months agoEntryEditScreen.kt25.2 KB · 1 month agoEntryEditViewModel.kt19.0 KB · 1 month agoExportScreen.kt───────────────────────────────────────────────────────────────────────────── Password strength scorer (local, dependency-free) ─────────────────────────────────────────────────────────────────────────────20.0 KB · 2 months agoIdentitySuggestDropdown.ktAnchored suggestion dropdown for identity-style fields (username/email).5.5 KB · 2 months agoImportScreen.kt───────────────────────────────────────────────────────────────────────────── ViewModel ─────────────────────────────────────────────────────────────────────────────40.4 KB · 1 month agoMultiSelectUi.ktD12 multi-select per-row checkbox (spec §9).4.2 KB · 2 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, blockquote, ul, ol, li, br, hr, p — attribute-less — plus the div wrappers Chrome's contenteditable inserts for new lines.11.2 KB · 2 months agoNotesModeScreen.ktE2 — full-screen editor for NOTE-type entries.22.7 KB · 2 months agoNotesModeViewModel.ktBacks [NotesModeScreen].6.7 KB · 2 months agoPasswordHistorySection.ktShared past-password history UI, extracted from EntryEditScreen so both the editor and EntryDetailScreen render the same rows.6.5 KB · 2 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.5.4 KB · 2 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.kt14.1 KB · 1 month agoRuneResolve.ktWhich leg of the restore animation is running (browser: RestoreSymbols' animating).7.0 KB · 3 months agoTagChipEditor.ktMax tags per entry.7.5 KB · 2 months agoTagListWidgets.ktHorizontally scrollable tag filter strip for VaultListScreen, placed between the search bar and the sort bar.3.6 KB · 2 months agoTotpInlineEdit.ktE6 — TOTP double-tap to edit the 2FA secret, inline in EntryDetailScreen.15.1 KB · 2 months agoTrashScreen.kt9.4 KB · 2 months agoVaultHealthScreen.ktWarm amber used for the "reused" and "weak" advisory buckets.16.4 KB · 1 month agoVaultListScreen.kt33.8 KB · 1 month agoVaultListViewModel.kt9.7 KB · 1 month ago
PeachAppNavHost.kt19.7 KB · 2 months agoPeachNav.ktEvery navigation destination in the app.2.9 KB · 2 months ago
updates/41.0 KB · 1 month ago
vault/307.0 KB · 1 month 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.8.4 KB · 2 months agoCanary.kt325 B · 4 months agoDuressConfig.ktThe action Peach takes when the duress passphrase is entered at the lock screen.4.6 KB · 1 month agoEffShortWordList.ktEFF short word list, published 2016-09-08.7.2 KB · 1 month 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.kt1.1 KB · 2 months agoPasswordGenerator.ktCryptographically random password generator.2.2 KB · 1 month 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).37.3 KB · 1 month 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 agoPinUnlockStore.kt17.0 KB · 1 month 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.kt6.3 KB · 2 months agoSavedIdentity.kt250 B · 4 months agoSyncEntrySanitizer.ktMN-3 (2026-06-09 audit, reopened 2026-08-03): content sanitization for entries arriving from a sync peer.1.9 KB · 2 months agoTOTPGenerator.ktRFC 6238 TOTP / RFC 4226 HOTP.3.8 KB · 4 months agoVaultCrypto.kt6.5 KB · 1 month agoVaultEntry.kt3.7 KB · 1 month agoVaultHealth.kt8.3 KB · 2 months agoVaultLockTimer.ktIdle auto-lock timer.1.8 KB · 4 months agoVaultRepository.ktLenient parser for the Codex vault-blob wrapper only.149.6 KB · 1 month agoVaultSettings.kt3.1 KB · 1 month agoVaultSlotRollback.ktRestores the durable slot set after a partially committed vault transaction.1.5 KB · 1 month agoVaultSnapshot.kt729 B · 2 months agoVaultStore.ktOne encrypted slot at rest.14.4 KB · 1 month ago
widget/2.7 KB · 4 months ago
MainActivity.ktFragmentActivity (not ComponentActivity) so androidx BiometricPrompt can attach.10.6 KB · 1 month agoPeachApplication.kt5.1 KB · 1 month agoPeachIntentRouter.ktLaunch actions the app declares to the system: the three launcher shortcuts in res/xml/shortcuts.xml and the credential-provider unlock entry point in [com.peachpasswords.passkeys.PasskeyUnlockIntent].2.2 KB · 2 months ago
jniLibs/1.1 MB · 3 weeks ago
arm64-v8a/504.3 KB · 3 weeks ago
x86_64/583.0 KB · 3 weeks ago
res/697.2 KB · 1 month ago
drawable/4.9 KB · 3 months ago
font/649.0 KB · 4 months ago
layout/1.7 KB · 4 months ago
mipmap-anydpi-v26/688 B · 4 months ago
raw/28.0 KB · 2 months ago
values/4.5 KB · 3 months ago
xml/8.4 KB · 1 month ago
AndroidManifest.xml8.4 KB · 1 month ago
test/973.7 KB · 1 month ago
java/970.6 KB · 1 month ago
com/970.6 KB · 1 month ago
peachpasswords/970.6 KB · 1 month ago
autofill/60.5 KB · 1 month ago
AssistStructureNullHintsTest.ktRegression pin for the 2026-08-07 Fold 7 crash loop: Facebook Messenger presented an autofillHints array containing a null entry and classify() dereferenced it, crashing the autofill service on every fill request (One UI then surfaces the repeated "app keeps stopping" dialog).1.0 KB · 2 months agoAssistStructureOtpRegexTest.ktOTP / 2FA field detection.3.6 KB · 1 month agoAutofillBrowserVisibilityTest.kt567 B · 1 month agoAutofillCardTest.kt3.6 KB · 2 months agoAutofillChipBudgetTest.ktChip-slot budget after the v2.14.8 refinement.2.1 KB · 2 months agoAutofillMatchTest.kt6.3 KB · 1 month agoAutofillNavRepositoryTest.ktAutofillNavRepository carries the one-shot "open the new-entry editor" request from the autofill picker through MainActivity to PeachAppNavHost.2.3 KB · 2 months agoAutofillNewEntryTokenTest.ktF3: the picker→MainActivity new-entry handoff is authenticated with a one-time in-memory token.1.5 KB · 2 months agoAutofillOriginReleaseTest.kt1.1 KB · 1 month agoAutofillPickerSearchTest.kt4.8 KB · 2 months agoAutofillPickerSpecSelectionTest.ktWhich inline spec hosts the "Search Peach…" chip.2.0 KB · 2 months agoAutofillPreviewLabelsTest.kt9.0 KB · 2 months agoAutofillSaveTest.kt4.5 KB · 1 month agoAutofillTwoFactorChipLabelTest.ktConfirms the keyboard-row chip carries WHAT it will fill.2.6 KB · 2 months agoIdentitiesTest.kt4.9 KB · 2 months agoOtpDatasetTest.ktE2-fix verification: the 2FA chip and the LOGIN chip are SEPARATE datasets so the user can verify the TOTP code before it lands.3.6 KB · 2 months agoOtpDigitsTest.kt1.6 KB · 2 months agoPasswordPolicyTest.kt3.3 KB · 1 month agoPeachAutofillLoggingTest.kt641 B · 1 month agoRememberOfferTest.kt1.5 KB · 2 months ago
backup/3.8 KB · 1 month ago
codex/17.1 KB · 1 month ago
credentials/6.1 KB · 1 month ago
feedback/1.7 KB · 3 months ago
license/5.4 KB · 1 month ago
passkeys/34.9 KB · 1 month ago
qs/1.2 KB · 4 months ago
security/12.6 KB · 1 month ago
shared/4.3 KB · 1 month ago
sync/414.4 KB · 1 month ago
AdoptionAdapterCoverageTest.kt§10.5: every relay adapter must forward every v2 callback, and a callback must never be one that only fails once a peer asks for it.7.5 KB · 1 month agoBackgroundSyncCoordinatorTest.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.10.9 KB · 1 month 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.17.3 KB · 1 month agoCrossClientSyncProcessTest.ktProcess endpoint for scripts/check-cross-client-sync.mjs.18.7 KB · 1 month agoDeviceManifestSupportTest.ktBounds tests for [verifyDeviceManifest].9.1 KB · 1 month agoFakeSyncGeneration.ktIn-memory [SyncGenerationPort] for the JVM tests.3.3 KB · 1 month agoForegroundSyncCoordinatorTest.kt993 B · 1 month agoLegacyIdentityDerivation.ktRoot→device key derivation, retained for tests only — campaign task 2.4.2.4 KB · 1 month agoLocalIdentityRecordTest.ktFrozen local-identity schema (campaign task 2.1): round trip, legacy completion, and every malformed-shape rejection.4.7 KB · 1 month agoLockedSyncSpoolModelTest.kt4.4 KB · 1 month agoNoiseKKTest.kt6.8 KB · 1 month agoPairedDeviceAliasTest.kt1.2 KB · 2 months agoPairedDeviceRevocationTest.kt6.4 KB · 1 month agoPairedDeviceStoreConcurrencyTest.kt1.5 KB · 1 month agoPairIdentityFramesTest.ktRegression coverage for M-08: the hand-rolled PAIR_IDENTITY encoder escaped ", \, and control bytes; the parser stopped at the next unescaped quote and never unescaped.3.2 KB · 2 months agoPairingInvitationTest.kt3.8 KB · 1 month agoPairingRelayLimitsTest.ktPB-26-205 (Android mirror): the pairing/adoption relay inbox is bounded before any allocate/copy of attacker-controlled frame data, with the same ceilings as the browser (src/shared/pairing-dial.ts).4.7 KB · 1 month agoPeachWebSocketTest.ktExercises the server against OkHttp's RFC 6455 client rather than a hand-rolled one.5.7 KB · 3 months agoRegistryTransactionTest.ktPure failure-injection coverage for the real SharedPreferences transaction helper.1.2 KB · 2 months agoRelayAdoptionHostTest.kt24.9 KB · 1 month agoRelayAdoptionInitiatorSourceTest.ktSource-initiator counterpart to [RelayAdoptionHostTest]: the phone dials the relay room, runs Noise as initiator, and sends the grant to the (empty) responder.27.8 KB · 1 month agoRelayAdoptionReceiverTest.ktItem 2 (REVIEW_DEFERRED_ITEMS_BRIEF.md): receiver inline-snapshot happy-path.37.2 KB · 1 month 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.kt3.6 KB · 1 month agoRustNoiseNativeCoverageTest.kt1.5 KB · 1 month agoSourceConsentGateTest.ktPB-26-116: the vault-owning device must approve a pairing before the root key is read.1.5 KB · 1 month agoSyncAlertTest.kt3.8 KB · 2 months agoSyncCoordinatorTest.ktTwo in-memory [SyncSession]s wired back to back.23.2 KB · 1 month agoSyncEntryEnvelopeKatTest.kt1.9 KB · 1 month agoSyncFrameTransportTest.ktE7b end-to-end chunking — the deliverable for the wire shape.6.6 KB · 2 months agoSyncFreshStartResetterTest.kt1.1 KB · 2 months agoSyncGenerationTest.ktThe §11 secure-reset contract: the durable generation record, the six states, create-on-miss refusal, archival by generation, crash recovery at every step, and the sync gate.12.6 KB · 1 month 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.11.9 KB · 1 month agoSyncPaddingTest.kt4.5 KB · 2 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.3.4 KB · 1 month 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.5 KB · 1 month agoTrustDataCorruptedTest.kt§18.4: a corrupt persisted ledger must not be read as empty — that would silently un-revoke every device.1.0 KB · 1 month agoVaultAdoptSnapshotTest.ktInline vault snapshot protocol parity with the browser vault-adopt-snapshot.test.ts.27.8 KB · 1 month agoVaultAdoptTest.ktAdoption frame protocol parity with the browser vault-adopt.test.ts.30.4 KB · 1 month agoVaultSyncAdapterTest.kt34.3 KB · 1 month agoVaultSyncManifestEpochRaceTest.ktRegression for a stale signed manifest mutating only a prefix before relock.7.3 KB · 1 month ago
ui/95.5 KB · 1 month ago
codex/2.9 KB · 4 months ago
components/1.8 KB · 1 month ago
lock/10.0 KB · 1 month ago
onboarding/3.9 KB · 2 months ago
pairing/5.2 KB · 2 months ago
security/3.0 KB · 4 months ago
settings/5.5 KB · 1 month ago
theme/870 B · 3 months ago
vault/56.9 KB · 1 month 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.5.6 KB · 2 months ago
updates/15.1 KB · 1 month ago
vault/283.4 KB · 1 month ago
AdoptDuressSlotTest.ktAdoption duress slot install tests.9.3 KB · 1 month agoBitwardenPasskeyImportTest.kt4.6 KB · 2 months agoBrowserPasskeyJwkTest.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 · 1 month agoCodexRestoreAtomicityTest.ktC-01: a Codex restore must not touch the device's vault until the candidate has been decrypted and decoded in memory, and must roll back if any write in the commit fails.9.6 KB · 1 month 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 agoCxfImportTest.ktCXF (FIDO Alliance Credential Exchange Format) passkey import.5.6 KB · 2 months agoDecoySettingsIsolationTest.ktPB-26-120: the duress design promises that a decoy session looks like an ordinary installation and that everything it writes stays in the decoy.3.6 KB · 1 month agoDuressCodexRoundTripTest.ktEnd-to-end Codex round-trip tests for the duress (slot B / decoy) slot.10.7 KB · 1 month agoDuressPolicyRecordTest.ktPB-26-127: duress configuration and its action must not be readable from the stored record alone.1.3 KB · 1 month agoDuressSlotBTest.ktIn-memory [VaultStorage] including a decoy (slot B) slot, for the MF-6 duress model.15.9 KB · 1 month agoHiddenSessionStateTest.ktM-04: no operation may leave in-memory session state that disagrees with what is on disk, and the sync-key accessors must fail closed whenever the session is not a fully-unlocked real vault.12.9 KB · 1 month agoImportSettingsClassificationTest.ktPB-26-118: a PeachScript backup carries a settings record, and importing one used to apply the whole record — including the screen-capture control and the favicon consent flag, which the app elsewhere obtains only from the user.1.8 KB · 1 month agoLockRaceAtomicityTest.ktH-03: lock() and requireUnlocked() must serialize with in-flight state mutations in suspend operations.7.5 KB · 1 month agoOfficialCryptoVectorsTest.kt2.8 KB · 3 months agoPasskeyConsolidationTest.kt4.7 KB · 1 month agoPasskeyEntryTest.kt1.1 KB · 4 months agoPasswordGeneratorTest.kt2.3 KB · 1 month agoPasswordRotationAtomicityTest.ktH-01: a wrapping-key rotation (changePassword / resetPasswordWithRecoveryWords) must either fully commit slot A + size-matched noise slot B + version stamp or leave the at-rest state untouched.7.8 KB · 1 month agoPeachScriptHardeningTest.ktM-02 regression tests: PeachScript parser must reject attacker-controlled lengths/counts before any unbounded allocation.7.7 KB · 2 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.kt11.7 KB · 1 month agoPinUnlockStoreTest.kt1.5 KB · 1 month agoRecoveryEscrowIntegrationTest.ktIntegration coverage for the full create → confirm → seal → unlock recovery chain (brief Fix 1).4.8 KB · 1 month 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.3 KB · 1 month agoRecoveryEscrowTest.kt10.7 KB · 1 month agoReplaceEntriesAtomicityTest.ktM-01: import's REPLACE mode must be one all-or-nothing write.3.3 KB · 1 month agoSessionEpochRaceTest.ktDeterministic H-03 races.6.8 KB · 1 month agoSlotAUnlockTest.ktIn-memory [VaultStorage] for the non-committing dual-derivation path (MF-5).4.9 KB · 1 month agoSlotPaddingTest.ktExposes the raw stored slots so the padding lengths (MN-1) can be inspected.8.7 KB · 1 month agoSnapshotRestoreAtomicityTest.ktH-02: a snapshot restore must either fully commit slot A + slot B + version stamp or leave every byte of at-rest state (slot A, slot B, history) untouched.8.1 KB · 1 month agoSyncEntrySanitizerTest.ktMN-3: sync-peer entries are sanitized before merge — mirrors the browser's sanitizeRestoredEntry, with the Android allowance for flat passkey fields.3.5 KB · 2 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 · 1 month agoVaultCryptoTest.ktVaultCrypto suite (brief Suite 2): Argon2id key derivation, AES-256-GCM round-trips, AAD enforcement, and KDF parameters.10.0 KB · 1 month agoVaultHealthAdvancedTest.kt5.5 KB · 2 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 agoVaultKeyRotationHooksTest.ktPB-26-126: the PIN and biometric escrows wrap a copy of the slot-A key, so every rotation site must fire the invalidation signal.3.0 KB · 1 month agoVaultLockTimerTest.ktIn-memory [VaultStorage] so the timer can drive a real repository off-device.4.0 KB · 1 month agoVaultRepositoryExtraTest.ktSecond VaultRepository suite (brief Suite 1 expansion).17.5 KB · 1 month agoVaultRepositoryTest.ktIn-memory [VaultStorage] so the repository can be exercised without Android.26.4 KB · 1 month agoVaultSettingsDefaultsTest.ktGate for the new-install default.2.7 KB · 1 month agoVaultSlotRollbackTest.kt1.7 KB · 1 month ago
widget/761 B · 4 months ago
CrossPlatformKATTest.ktMN-4: cross-platform known-answer tests.9.0 KB · 1 month agoMainActivityManifestTest.kt1.9 KB · 1 month agoMainActivityTest.kt1.4 KB · 1 month agoPeachIntentRouterTest.kt1.5 KB · 2 months ago
resources/3.1 KB · 1 month ago
fixtures/3.1 KB · 1 month ago
build.gradle11.6 KB · 1 month agogradle.lockfile129.2 KB · 1 month agoproguard-rules.pro329 B · 1 month ago
gradle/359.2 KB · 1 month ago
releases/14.7 KB · 1 month ago
scripts/56.0 KB · 3 weeks ago
tasks/17.8 KB · 1 month ago
.gitignore99 B · 1 month ago.kohconfig766 B · 3 weeks agobuild.gradle1.0 KB · 1 month agogradle.properties222 B · 4 months agogradlew734 B · 3 weeks agokoh.build521 B · 3 weeks agoREADME.mdA free, open source, local-first password manager for Android.2.4 KB · 2 months agosettings.gradle396 B · 4 months agoVERSION8 B · 1 month ago
0d70ba6993dbstyle: Unify non-settings surfaces (v2.14.26)2 months ago96f3e805402fdocs: Record joined credential card verification (v2.14.25)2 months ago5c1d6ecabf7astyle: Join entry credentials into one card (v2.14.25)2 months agofb95dc6219e5fix: Honor screenshot preference and align Notes chrome (v2.14.24)2 months agof3653a69dc9cfix: Restore complete Vault List layout (v2.14.23)2 months agoad56fa5783bbfix: Repair focused search and discard blank note drafts (v2.14.22)2 months ago42c96fc32955feat: Make Peach identity return home (v2.14.21)2 months ago44f8e7bf1609feat: Unify vault contextual bottom surfaces (v2.14.20)2 months agof7dad03c0489feat: Simplify entry detail for thumb reach (v2.14.19)2 months ago24bcf1918eaecolor the vault-list lock FAB and entry-detail lock action with the accent token2 months ago0bcb4c35d551docs: Record v2.14.18 Kepr release2 months agobe4aaeec764erelease: v2.14.18 — cleaner animated lock screen2 months agobc423cfcf057fix: Remove static lock-screen rune row (v2.14.18)2 months ago2fb5dd5f0f7edocs: Record v2.14.17 Kepr release and notes replacement outcome2 months agoa0ae27dd8d41release: v2.14.17 — expanded user-facing release notes2 months ago31f0f0a9902drelease: v2.14.17 — Sync and Pro lock wordmark polish2 months ago2a58320abd4bdocs: Record failed unintended release attempt2 months agod256adf9dd60fix: Polish Sync controls and Pro lock wordmark (v2.14.17)2 months ago81aac3191e84docs: Correct Android v2.14.16 release notes2 months ago87acb16d23c5docs: Record Android v2.14.16 Kepr release2 months agoe7a64bcf8792feat: Rename paired devices locally (v2.14.16)2 months ago90fb2daaf151fix: Bound cumulative locked sync inbox (v2.14.15)2 months agoc7780c7fe52afeat: Add Keystore-backed locked sync spool (v2.14.14)2 months ago5979437f02d7docs: Record v2.14.13 release to Kepr2 months ago3da3ac3c8203release: v2.14.13 — animated lock-screen rune field2 months ago3e8dfd7c7d22release: v2.14.13 — animated lock-screen rune field\n\n## Highlights\n- The lock screen now has the same subtle animated PeachScript rune field as onboarding, adding a little more life while you unlock.2 months ago19d7f27945abdocs: Record v2.14.13 lock-screen emulator QA2 months agocd9879aec5e2feat: Bring animated rune field to lock screen (v2.14.13)2 months ago20510e752f69docs: continuity — record v2.14.12 Kepr release2 months ago5efd457549f9release: v2.14.12 — sync device-name safety2 months ago1a4685fd63e9feat: cap peer device names at 64 chars on every inbound seam, matching the browser (v2.14.12)2 months ago365bda1d525ddocs: continuity — record v2.14.11 release to Kepr (both ABIs, live-verified)2 months agoc1d196a196d9release: v2.14.11 — Messenger autofill crash fix2 months ago8363e706b810docs: continuity — v2.14.11 autofill crash-loop fix, diagnosis, release pending June's call2 months ago925678181f45fix: Autofill no longer crashes on third-party apps with malformed hint arrays (v2.14.11)2 months ago211e2d3269c5docs: continuity — record v2.14.10 publish to Kepr (proper notes as save body, both ABIs, live-verified)2 months ago1216bd2c81e5release: v2.14.10 — lock-screen routing test pin (no user-facing changes)2 months agoa508f94164c4docs: continuity — record v2.14.10 outcome (refactor + tests saved, NOT published, APK identical to v2.14.9)2 months agoa9bcf85ca3c9refactor: extract routeOnUnlock pure function + UnlockRoute sealed class (v2.14.10)2 months ago3165a9822d41docs: continuity — record v2.14.9 release outcome (autofill new-entry redirect root-cause fix, both ABIs published, live-verified)2 months ago098f165bba88fix: Stop post-unlock nav clobbering the autofill new-entry redirect (v2.14.9)2 months agoba1cd3cf8da3feat: chip-strip slot refinement after create-chip removal + dead-code cleanup (v2.14.8)2 months ago33d29cc2981cdocs: continuity — record v2.14.7 release outcome + chip-defensive clipboard slice2 months ago98143405dfefdocs: continuity — record v2.14.7 chip-defensive-clipboard checkpoint as released head2 months ago20bb25307f77docs: continuity — mark v2.14.6 picker fix released2 months ago0e4331fef295fix: 2FA chip collision on single-field forms (v2.14.6)2 months ago0f4da0336e83feat: 2FA countdown chip + OTP tap-to-fill (v2.14.5)2 months ago7bbba9fcd64bdocs: continuity — record v2.14.4 Kepr release (chip label + passkey default-on, live-verified)2 months agoaae41f730729feat: OTP FILL chip subtitle='2FA' + passkey default-on for new installs (v2.14.4)2 months ago4e65f38511abdocs: continuity — queue E2-fix (chip label distinction) + E4 (passkey default-on)2 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]