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

397 files
469044a2b623
back to HEAD
app/5.2 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/5.0 MB · 2 months ago
androidTest/8.5 KB · 2 months ago
debug/267 B · 3 months ago
res/267 B · 3 months ago
values/267 B · 3 months ago
main/4.3 MB · 2 months ago
java/1.6 MB · 2 months ago
com/1.6 MB · 2 months ago
peachpasswords/1.6 MB · 2 months ago
autofill/66.4 KB · 2 months ago
codex/37.5 KB · 3 months ago
di/655 B · 3 months ago
feedback/3.6 KB · 3 months ago
haptics/3.0 KB · 2 months ago
license/7.2 KB · 3 months ago
passkeys/43.1 KB · 2 months ago
qs/3.1 KB · 4 months ago
shared/5.8 KB · 2 months ago
sync/265.8 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.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.kt28.2 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.kt0x03 adds relay routing to each introduced peer edge.10.0 KB · 2 months agoDeviceType.ktWhat kind of device a peer is, on the wire and in the paired-device store.936 B · 3 months agoForegroundSyncCoordinator.kt2.5 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).12.6 KB · 2 months 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 agoPairingAuth.kt4.7 KB · 3 months agoPairingFrames.ktLength-delimited frame IO for a pairing/sync connection.4.8 KB · 3 months agoPairingInvitation.kt3.2 KB · 2 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 its deterministic relay waiter edges and drives its dialer edges.10.9 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.kt5.7 KB · 2 months agoRelayAdoptionHost.kt10.0 KB · 2 months agoRelayAdoptionReceiver.ktReceiver half of relay-first vault adoption.15.8 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.kt6.8 KB · 2 months agoRustNoiseNative.ktThin JNI boundary over the canonical Rust snow state machine.3.4 KB · 3 months agoSASDerivation.kt543 B · 3 months agoSyncAlert.kt2.9 KB · 2 months agoSyncAlertStore.kt3.2 KB · 2 months agoSyncCoordinator.ktSync — Phase 2 manifest-diff coordinator.15.0 KB · 2 months agoSyncFrameTransport.ktE7b: split a too-large padded sync frame across multiple Noise transport messages and reassemble it on the other side.6.5 KB · 2 months agoSyncFreshStartResetter.ktClears every piece of state that can make a destroyed vault still look paired.1.7 KB · 2 months agoSyncIdentity.kt4.0 KB · 2 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.4 KB · 2 months 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).10.2 KB · 2 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.1 KB · 2 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.26.0 KB · 2 months agoVaultSyncAdapter.ktProduction [SyncVaultAdapter] backing the coordinator with the live [VaultRepository].17.8 KB · 2 months ago
ui/886.4 KB · 2 months ago
codex/45.2 KB · 3 months ago
components/70.2 KB · 2 months 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.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.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.0 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/40.9 KB · 2 months ago
onboarding/17.5 KB · 2 months ago
pairing/79.3 KB · 2 months ago
recovery/19.6 KB · 3 months ago
security/6.6 KB · 4 months ago
settings/131.4 KB · 2 months ago
sync/11.9 KB · 2 months ago
theme/18.2 KB · 2 months ago
updates/20.7 KB · 2 months ago
vault/403.9 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 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).20.5 KB · 2 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.kt14.1 KB · 2 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 ─────────────────────────────────────────────────────────────────────────────39.2 KB · 2 months 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, 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.22.4 KB · 2 months agoNotesModeViewModel.ktBacks [NotesModeScreen].5.8 KB · 2 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.kt34.2 KB · 2 months agoVaultListViewModel.kt11.3 KB · 2 months ago
PeachAppNavHost.kt18.3 KB · 2 months agoPeachNav.ktEvery navigation destination in the app.2.8 KB · 3 months ago
updates/37.2 KB · 2 months ago
vault/252.6 KB · 2 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.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.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).36.8 KB · 2 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.kt6.3 KB · 2 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.136.8 KB · 2 months agoVaultSettings.kt747 B · 3 months agoVaultSnapshot.kt729 B · 2 months agoVaultStore.ktOne encrypted slot at rest.9.9 KB · 2 months ago
widget/2.7 KB · 4 months ago
MainActivity.ktFragmentActivity (not ComponentActivity) so androidx BiometricPrompt can attach.7.8 KB · 2 months agoPeachApplication.kt3.0 KB · 2 months 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/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/668.1 KB · 2 months ago
AndroidManifest.xml7.9 KB · 2 months ago
test/678.2 KB · 2 months ago
java/678.2 KB · 2 months ago
com/678.2 KB · 2 months ago
peachpasswords/678.2 KB · 2 months ago
autofill/26.0 KB · 2 months ago
codex/9.4 KB · 4 months ago
feedback/1.7 KB · 3 months ago
license/519 B · 4 months ago
passkeys/17.2 KB · 2 months ago
qs/1.2 KB · 4 months ago
security/10.8 KB · 2 months ago
shared/3.0 KB · 4 months ago
sync/271.2 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.16.5 KB · 2 months agoDeviceManifestSupportTest.ktBounds tests for [verifyDeviceManifest].4.0 KB · 2 months agoForegroundSyncCoordinatorTest.kt1014 B · 2 months agoNoiseKKTest.kt4.3 KB · 3 months agoPairedDeviceRevocationTest.kt1.7 KB · 2 months 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 agoPairingAuthTest.kt3.8 KB · 3 months agoPairingInvitationTest.kt3.3 KB · 2 months 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.kt16.2 KB · 2 months agoRelayAdoptionInitiatorSourceTest.ktSource-initiator counterpart to [RelayAdoptionHostTest]: the phone dials the relay room, runs Noise as initiator, and sends the grant to the (empty) responder.12.8 KB · 2 months agoRelayAdoptionReceiverTest.ktItem 2 (REVIEW_DEFERRED_ITEMS_BRIEF.md): receiver inline-snapshot happy-path.24.6 KB · 2 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.7 KB · 2 months agoSyncAlertTest.kt3.8 KB · 2 months agoSyncCoordinatorTest.ktTwo in-memory [SyncSession]s wired back to back.14.7 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.10.8 KB · 2 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 agoVaultAdoptSnapshotTest.ktInline vault snapshot protocol parity with the browser vault-adopt-snapshot.test.ts.16.8 KB · 2 months agoVaultAdoptTest.ktAdoption frame protocol parity with the browser vault-adopt.test.ts.23.4 KB · 2 months agoVaultSyncAdapterTest.kt32.6 KB · 2 months agoVaultSyncManifestEpochRaceTest.ktRegression for a stale signed manifest mutating only a prefix before relock.7.2 KB · 2 months ago
ui/85.0 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/5.2 KB · 2 months ago
security/3.0 KB · 4 months ago
settings/5.0 KB · 2 months ago
theme/870 B · 3 months ago
vault/53.1 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.5.6 KB · 2 months ago
updates/14.2 KB · 2 months ago
vault/227.0 KB · 2 months ago
AdoptDuressSlotTest.ktAdoption duress slot install tests.9.3 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 · 4 months 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 · 2 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 agoDuressCodexRoundTripTest.ktEnd-to-end Codex round-trip tests for the duress (slot B / decoy) slot.10.7 KB · 2 months agoDuressSlotBTest.ktIn-memory [VaultStorage] including a decoy (slot B) slot, for the MF-6 duress model.13.5 KB · 2 months 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 · 2 months agoLockRaceAtomicityTest.ktH-03: lock() and requireUnlocked() must serialize with in-flight state mutations in suspend operations.7.5 KB · 2 months agoOfficialCryptoVectorsTest.kt2.8 KB · 3 months agoPasskeyEntryTest.kt1.1 KB · 4 months agoPasswordGeneratorTest.kt1.2 KB · 4 months 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 · 2 months 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.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.6 KB · 2 months agoReplaceEntriesAtomicityTest.ktM-01: import's REPLACE mode must be one all-or-nothing write.3.2 KB · 2 months agoSessionEpochRaceTest.ktDeterministic H-03 races.6.4 KB · 2 months agoSlotAUnlockTest.ktIn-memory [VaultStorage] for the non-committing dual-derivation path (MF-5).4.9 KB · 2 months agoSlotPaddingTest.ktExposes the raw stored slots so the padding lengths (MN-1) can be inspected.3.1 KB · 4 months 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 · 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 · 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).17.4 KB · 2 months agoVaultRepositoryTest.ktIn-memory [VaultStorage] so the repository can be exercised without Android.21.3 KB · 2 months ago
widget/761 B · 4 months ago
CrossPlatformKATTest.ktMN-4: cross-platform known-answer tests.8.8 KB · 2 months agoPeachIntentRouterTest.kt1.5 KB · 2 months ago
build.gradle8.6 KB · 2 months agoproguard-rules.pro44 B · 4 months ago
gradle/73.7 KB · 2 months ago
scripts/16.7 KB · 2 months ago
build.gradle667 B · 3 months agogradle.properties222 B · 4 months agogradlew734 B · 4 months agokepr.build521 B · 2 months agoREADME.mdA free, open source, local-first password manager for Android.2.4 KB · 2 months agosettings.gradle396 B · 4 months agoVERSION7 B · 2 months ago
55df24f34e6epoint Android feedback at the same Web3Forms inbox the extension already uses, finish the chirp-era rename the browser did months ago, delete the dead audio-frame and pairing-phase files, and tell the user when a pull-to-refresh has nobody to sync with (v2.5.3)3 months ago98aa064967a2record that the QR-action rule was already in place for pairing, that the real gap was a missing reconnect initiator, and why the role must be derived rather than negotiated3 months ago4f2161320ccfgive Android the relay initiator it never had, and assign the role per peer so two phones cannot both wait: an extension is always dialled by, and between phones the lower long-term key opens the room (v2.5.2)3 months agoa7ef4b655fa4cut the sync blurb to one line: people know what sync is, 'in step' reads oddly, and spelling out that one device shows a code and the other scans it is telling them what the two buttons below already say (v2.5.1)3 months ago944cf61526abrestructure Android sync around public/private/off relay modes and delete the LAN stack: the ServerSocket listener, the phone-as-relay hub and frames, the code pairing server, mDNS and discovery all go, keeping the relay responder as the only transport (v2.5.0)3 months agoc74f60633f23point at the consolidated queue in peach-browser and name Android's share of it, so a session starting here does not build a competing list3 months agoa28c55655805stop the QR scanner killing the app by building decode strategies lazily and rotating the luma plane ourselves, retract the pull-to-refresh spinner unconditionally, and cut the sync card down to one pairing block (v2.4.15)3 months ago10d155fee98bdrop the legacy word-list fallback so decoding has one unambiguous path; words written under the pre-2.4.13 ordering are no longer accepted (v2.4.14)3 months ago0f3f0e36bc4areplace the word list that duplicated abandon at index 1 with the browser's canonical 2048, so the same vault stops printing different recovery words on each platform, and decode old phrases through a legacy fallback (v2.4.13)3 months ago8d5c5d9501a7let a device that already has a vault join another one: take the source root key, keep every entry, and gate it behind a disclosure before connecting and a second one showing the incoming recovery words before anything is written (v2.4.12)3 months ago4f8a9094ec9bstop reporting coroutine cancellation as a pairing rejection, and cancel the previous transport collector on restart, so switching to the local-network code cannot be overwritten by the relay session it replaced (v2.4.11)3 months ago1f887b74dd3arecord the version label, the gesture-bar inset it first missed, the 2.3.68 phone that could never have paired, and the two serial-matching bugs in peach-push.sh3 months agoc9c647429f78show the build faintly at the foot of the settings deck, above the gesture bar, matching the extension's stk-version-corner (v2.4.10)3 months ago210b78739ec1pad sync frames to size buckets before encryption, matching the browser ladder byte for byte (v2.4.8)3 months ago3b1a8ee6b9fbstop the duress session presenting a sync identity, while leaving codex and recovery words working on the decoy root key so neither becomes a duress tell (v2.4.7)3 months ago1a3d936afbabsay plainly at the point of removal that revocation stops future changes but recovery words survive it, and stop the monotonic entry clock leaking between tests (v2.4.6)3 months ago2ce28477fa2cclamp remote entry and tombstone timestamps before merging, closing the HV-1 pinning gap the browser had already fixed (v2.4.5)3 months agof4ade7ac52ccpropagate device revocation as terminal signed records in manifest v0x02, and refuse a revoked peer at the reconnect listener (v2.4.4)3 months ago2c0edcf5291aname a rotating device from local state instead of the vouching peer's manifest claim, and stop a third-party issuer renaming a paired record (v2.4.3)3 months ago536cb610f6f6widen the pairing SAS to 8 digits over 64 PRF bits and route key comparisons through CryptoCompare (v2.4.2)3 months agob4bbb429a17etest: pin official cryptographic vectors (v2.4.1)3 months ago3c69d09c658ffeat: replace Kotlin Noise with shared Rust JNI core (v2.4.0)3 months ago5e73e5d32f84feat: add safe relay vault adoption receiver (v2.3.79)3 months agoa3694f583c46feat: add relay-first vault adoption source (v2.3.78)3 months agob7c31dd4fa00fix: gate vault adoption on both confirmations (v2.3.77)3 months agobdf1f16e8bcffix: propagate mesh relay settings (v2.3.76)3 months agocd7deee44786feat: wait for secure relay sync (v2.3.75)3 months agob7a2b0329555feat: require mutual KK reconnect auth (v2.3.74)3 months ago123cd1686b6bfeat: verify pairing key proof (v2.3.73)3 months agoe8eabfde0283feat: add rotating relay rendezvous state (v2.3.72)3 months ago78bdfd653a67refactor: remove retired sync transport paths (v2.3.71)3 months agoc6504350b98cfix: enforce relay-safe sync frame limits (v2.3.70)3 months agod0174f9b05d3fix: bind sync manifests to authenticated peer identity (v2.3.69)3 months ago43e6d3efc508add a vault-wide search field, a plus button that pre-fills from the host form, and the navigation hand-off to EntryEdit3 months agoc0512b43fe9frecord that Codex restore is fixed on June's real device, and the long-press diagnosis path3 months agoc83ebe04e301reorder the entry-row pointer chain so long-press wins over the swipe detector, and rewire it to enter multi-select3 months ago2a3b3c774a14continuity: record the android-arm64 platform-name sync, the three-way name constraint, and the JDK 21 gradle requirement3 months ago1b8f5ed1c0a4updates: adopt kepr's android-arm64 platform name in ANDROID_PLATFORM_KEY and kepr.build so koh offer --builds APK uploads match the allowlist kepr v1.56.237 added (v2.3.68)3 months ago65ac906cdbe1trust device manifests from any directly paired issuer and try a peer's cached address before mDNS3 months ago9970711d78f6record the privateKeyJwk root cause, the diagnosis path and the Kepr android-platform blocker3 months ago560859fe0eefadd VERSION, kepr.build and a signed-APK build script so Kepr Builds can publish releases3 months ago98f9187ed004read a passkey's privateKeyJwk as an object or a string, which is what made every browser vault with a passkey unreadable3 months ago0a5587e2c57dlog a masked structural diagnostic when a Codex restore throws, and strip bucket padding in the browser-slot and root-key paths3 months agob61ca4e4a735name the debug build peach-debug and surface the real pairing rejection reason in debug builds3 months ago8b5c0b5f6a0arecord the pairing frame-type root cause, the closed pairing-code-length item and the reconnect-path check3 months ago49472b1df6f3accept a binary PEACH_HELLO and answer with a binary ACK, which is what the browser's pairing socket speaks3 months agodd4d47fe6cffrecord release signing verification, the adoption request-label constraint and the unconfigured feedback endpoint on both platforms3 months ago1373ec751bc8name ADOPT_REQUEST's device_id sessionRequestId and pin that only the identity frame's key is persisted3 months agofa7286f1a4f6enable v2+v3 APK signing so the release key carries a rotation lineage3 months ago844ea5e10c98record the relay dispatch, Kepr update flow, notes routing fix and the port-49142 squatter in CONTINUITY.md3 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]