peach-browser
A free, open source, local-first password manager for Chrome, Firefox, and Android.
timeline
atlas398 files
public/
codex/
fonts/
models/
scripts/
src/
background/
setSyncRunner.chirp-sync-static.test.tsIV.7 — Static safety assertions for Chirp Sync.chirp-sync-vault-adapter.test.tschirp-sync-vault-adapter.tsProduction adapter that backs runChirpSyncInitiator with the live vault.clipboard.double-failure.test.tsT-037: clipboard double-failure / alreadyWritten pathclipboard.test.tsclipboard.tsClipboard write + reliable auto-clear — audit fix HV-2.codex-handlers.test.tsTests for src/background/codex-handlers.ts.codex-handlers.tscodex-handlers.ts — message handlers that back the Peach Codex flow.commands.tsKeyboard command handler — routing for summon-inline: 1.entry.lock-port.test.tsLV-5: the lock-on-close onConnect listener accepts only our popup port (legacy bare "popup" or nonce'd "popup-<uuid>") and ignores anything else.entry.tshealth.test.tshealth.tshealth.ts — Pro advanced vault health analysis.license.tslicense.verification.test.tsT-009: License Ed25519 signature verificationmessages.adversarial.test.tsmessages.adversarial.test.ts — Layer 3 §3.3 adversarial message handler tests.messages.batch-sanitize.test.tsT-008: PCH-01-016 batch-add canary/tag sanitizationmessages.edit-origin.test.tsT-022: GET_ENTRY_FOR_EDIT via sender.url + locked-vault AUTOFILL_QUERYmessages.test.tsmessages.tsmessages.ts — the only background message handler.ml.predictbatch.test.tsT-030: ml.ts predictBatch — batch sizes, softmax stability with extreme weightsml.tsnotes.test.tsoffscreen.htmloffscreen.tsOffscreen document script — audit fix HV-2c.paired-devices.test.tspaired-devices.tsPaired-device registry — v3 chirp-sync.passkey-chrome-ceremony.test.tspasskey-chrome-ceremony.test.ts — covers the Chrome chrome.webAuthenticationProxy ceremony path that the Firefox-proxy test file does NOT exercise.passkey-crypto.test.tspasskey-crypto.tspasskey-deny-on-close.test.tspasskey-deny-on-close.test.ts — M8/COR-009passkey-firefox-proxy.test.tspasskey-firefox-proxy.test.ts — covers the v2.12.0 Firefox content-script proxy path.passkey.ed25519.test.tsT-015: Ed25519 passkey round-trippasskey.tspending-vouched-devices.tsPending vouched devices — audit fix MV-7.recovery-pending.tsPersistent flag set while the user has just created a vault and is reading their 12 recovery words but has not yet typed the 3 confirmation words.recovery-words.test.tsrecovery.adversarial.test.tsrecovery.adversarial.test.ts — Layer 3 §3.2 adversarial recovery words tests.self-test.test.tsself-test.tsself-test.ts — Known-Answer Test (KAT) for the Peach crypto stack.sync-alerts.tsPending sync alerts — audit fix HV-1b.sync-trigger.test.tssync-trigger.tssync-trigger.ts — central sync dispatcher.vault-history.test.tsVault history tests.vault.adversarial.test.tsvault.adversarial.test.ts — Layer 3 §3.1 adversarial vault tests.vault.consolidate-passkeys.test.tsT-023: vault.consolidatePasskeyEntries — passkey merge with lastUsed rankingvault.corruption.test.tsT-018: Vault corruption vs wrong-password discrimination (M7/COR-007)vault.hibp-padding.test.tsPCH-02-007 regression tests — the HIBP k-anonymity range request must ask for response padding, and the parser must stay correct on padded responses.vault.purge-trash.test.tsT-024: vault.purgeExpiredTrash — retention cutoff boundaryvault.rotate-sync-identity.test.tsT-016: rotateSyncIdentity — new root key, cleared peers, recovery pendingvault.session-escrow.test.tsvault.sync-clamp.test.tsUnit tests for HV-1 — sync timestamp clamp + remote-mutation alerts.vault.test.tsvault.tsvault.ts — sole owner of vault state and chrome.storage vault keys.vault.update-entry-sanitize.test.tsPCH-02-001 regression tests — UPDATE_ENTRY patch path must route canary/tags/passkey through the same sanitizers the add/restore/sync funnels use (sanitizeCanary / sanitizePasskey / sanitizeTags).content/
passkey-toast/
crypto/
drafts/
DESKTOP-PAIRING/A six-change plan, each pinned to verified source in both repos (peach-browser and peach-sync):
tests/
vault_id in the PAIR_IDENTITY frame so the desktop helper can persist which vault it was paired to.02-desktop-device-type.mdThe brief assumed "desktop" was missing from DeviceType and that the type "likely" lives in src/shared/types.ts.03-desktop-pairing-handler.mdA net-new browser-side code pairing client.04-desktop-pairing-ui.mdThis is the popup-side counterpart to the background pairing client in Change 3.05-subnet-probe.mdThere IS an existing /24 probe, and its port is already parameterized:06-sync-coordinator-desktop.mdThe brief assumed the sync runner/coordinator might branch on device type and exclude "desktop".INTEGRATION-CONTRACT.mdApply in this sequence; each step compiles on its own.README.mdA six-change plan, each pinned to verified source in both repos (peach-browser and peach-sync):PCH-02-FIXES/Drafts for all 10 findings of peach-code-review.md (Fable 5, 2026-06-12): 1 Low (PCH-02-001), 9 Informational.
src/background/vault.ts — sanitizeEntryPatch, lines 2375–2388 Report: peach-code-review.md, Finding PCH-02-001PCH-02-002-noise-xx-msg1-hash.patch.mdSeverity: Informational Target file: src/shared/noise-xx.ts:93-97 (initiator), 184-191 (responder) Also touched: src/shared/noise-js.ts:11-14 (doc comment correction — landable NOW) Report: peach-code-review.md, Finding PCH-02-002PCH-02-003-sas-trust-model-comment.patch.mdSeverity: Informational Target file: src/shared/chirp-handshake.ts:125-154 (the SECURITY block) Report: peach-code-review.md, Finding PCH-02-003PCH-02-004-exact-pin-deps.patch.mdSeverity: Informational Target files: package.json:40-46, bun.lock (regenerated), new WASM-PROVENANCE.md (see deviation note) Report: peach-code-review.md, Finding PCH-02-004PCH-02-005-legacy-pbkdf2-doc.patch.mdSeverity: Informational Target files: src/shared/backup.ts:146 (derivePeachExportKey), src/popup/views/Import.tsx (re-export notice) Report: peach-code-review.md, Finding PCH-02-005PCH-02-006-vault-id-privacy-note.patch.mdSeverity: Informational Target file: src/shared/sync-identity.ts:62-67 (computeVaultId docblock) Report: peach-code-review.md, Finding PCH-02-006PCH-02-007-hibp-add-padding.patch.mdSeverity: Informational Target file: src/background/vault.ts:230 (checkBreach) Report: peach-code-review.md, Finding PCH-02-007PCH-02-008-binaryreader-bounds.patch.mdSeverity: Informational Target file: src/crypto/peachPayload.ts:940-969 (BinaryReader) Report: peach-code-review.md, Finding PCH-02-008PCH-02-009-reject-zero-dh.patch.mdSeverity: Informational Target files: src/shared/noise-xx.ts (6 DH sites), src/shared/noise-js.ts (6 DH sites) Report: peach-code-review.md, Finding PCH-02-009PCH-02-010-clipboard-hash-match.patch.mdSeverity: Informational Target files: src/background/clipboard.ts:124-178 (clearClipboardNow), src/background/offscreen.ts, manifest.json (⚠ permission), comment in clipboard.ts:18-19 Report: peach-code-review.md, Finding PCH-02-010peachPayload.binaryreader-bounds.test.tsPCH-02-008 regression tests — BinaryReader must bound every read and fail with the decoder's existing PAYLOAD_TOO_SHORT code on truncated input.README.mdDrafts for all 10 findings of peach-code-review.md (Fable 5, 2026-06-12): 1 Low (PCH-02-001), 9 Informational.vault.hibp-padding.test.tsPCH-02-007 regression tests — the HIBP k-anonymity range request must ask for response padding, and the parser must stay correct on padded responses.vault.update-entry-sanitize.test.tsPCH-02-001 regression tests — UPDATE_ENTRY patch path must route canary/tags/passkey through the same sanitizers the add/restore/sync funnels use (sanitizeCanary / sanitizePasskey / sanitizeTags).WASM-PROVENANCE.mdPeach's vault security rests on a small set of third-party packages that either ship WebAssembly blobs or sit directly on a security path.TEST-EXPANSION/
test coverage expansion Agent: claude-sonnet-4-6 Priority 1: T-001–T-010 (10 files), Priority 2: T-011–T-024 (11 files, T-011–T-014 in one file), Priority 3: T-025, T-030, T-037 (3 files)license.verification.test.tsT-009: License Ed25519 signature verificationmessages.batch-sanitize.test.tsT-008: PCH-01-016 batch-add canary/tag sanitizationmessages.edit-origin.test.tsT-022: GET_ENTRY_FOR_EDIT via sender.url + locked-vault AUTOFILL_QUERYml.predictbatch.test.tsT-030: ml.ts predictBatch — batch sizes, softmax stability with extreme weightspasskey.ed25519.test.tsT-015: Ed25519 passkey round-trippdf-import.sandbox.test.tsT-007: MV-9 pdf.js sandbox flags regression testpeachPayload.bomb.test.tsT-005: peachPayload declared-length decompression bomb (MV-4)recovery-words.checksum.test.tsT-002: BIP39 checksum rejectionrecovery-words.integrity.test.tsT-001: BIP39 word-list integrityrecovery-words.kek.test.tsT-003: 128-bit prefix-KEK invariant (PCH-01-005 sibling)sync.disconnect.test.tsT-020: WebSocket sync-disconnect handling (PCH-01-026 #9)totp.rfc6238.test.tsT-004: TOTP RFC 6238 known-answer vectorsvault.consolidate-passkeys.test.tsT-023: vault.consolidatePasskeyEntries — passkey merge with lastUsed rankingvault.corruption.test.tsT-018: Vault corruption vs wrong-password discrimination (M7/COR-007)vault.purge-trash.test.tsT-024: vault.purgeExpiredTrash — retention cutoff boundaryvault.rotate-sync-identity.test.tsT-016: rotateSyncIdentity — new root key, cleared peers, recovery pendingpopup/
codex/
components/
views/
if (signal()) return <X/>).Health.test.tsx@vitest-environment jsdomHealth.tsxImport.tsxSignal-conditioned views in this file must use <Show>, never a signal-conditioned early return — see Projects.md §4.1.Lock.tsxNoteEditor.toHtml.test.ts@vitest-environment jsdomNoteEditor.tsxNotesEditor.tsxNotesMode.tsxNotesTOC.tsxOnboarding.tsxPanic.tsxPasskeyApproval.tsxProCelebration.tsxRecoveryWordDisplay.tsxRecoveryWordEntry.tsxSettings.tsxTrashView.tsxvault-search.test.tsvault-search.tsVault.tsxview-test-utils.tsxzxcvbn-strength.test.tsLV-8: the @zxcvbn-ts replacement must score the master-password strength meter on the same 0-4 scale as the old zxcvbn, with dictionaries loaded (language-common is what keeps weak passwords from scoring optimistically).shared/
any is intentional throughout this module (L17/I3/QUA-010): import files are user-supplied external JSON whose schemas vary by source app and version (1Password CPG, Bitwarden, CXF, generic CSV).local-network.tsLocal network discovery — minimal helper used by chirp pairing.ml.tsnative.tsMobile platform detection helpers used by popup views to gate Capacitor-only paths.noise-blake2s-kat.test.tsnoise-js.test.tsNoise NK auth proof regression test.noise-js.tsNoise NK initiator for Android / Capacitor.noise-xx.test.tsnoise-xx.tsNoise XX (mutual auth) — used for every Phase-2 WebSocket connection after the audio chirp pairing has stamped each side into the other's paired-device registry.noise.reject-zero-dh.test.tsPCH-02-009 regression tests — every Noise XX/NK DH must reject an all-zero shared secret (low-order / identity peer point) instead of feeding it into the key schedule.passkey-flags.tspasskey-flags.ts — single switch for the Firefox passkey content-script proxy.passkey-utils.test.tspasskey-utils.tspasskey-utils.ts — WebAuthn relying-party-id validation.recovery-word-list.tsrecovery-word-list.ts — 2048-word recovery word list for Peach vault recovery.recovery-words.checksum.test.tsT-002: BIP39 checksum rejectionrecovery-words.integrity.test.tsT-001: BIP39 word-list integrityrecovery-words.kek.test.tsT-003: 128-bit prefix-KEK invariant (PCH-01-005 sibling)recovery-words.tsrecovery-words.ts — BIP39-compatible recovery word encoding for Peach vault recovery.shortcuts.test.ts@vitest-environment jsdomshortcuts.tsshortcuts.ts — keybinding schema, defaults, matcher, formatter.storage.tssync-identity.test.tssync-identity.tsSync identity — long-term X25519 keypair tied to the vault, not the device installation.sync-limits.tsSync trust + resource bounds — audit fixes HV-1 (timestamp clamp) and MV-3 (receive-path size bounds).sync-types.tsChirp Sync — type definitions (Master Brief v2).sync.disconnect.test.tsT-020: WebSocket sync-disconnect handling (PCH-01-026 #9)types.tstypes.ts — cross-boundary types and the MessageType union.tests/
fixtures/
7100d7d25214 (v3.9.8) Method: Full read of src/ (130 source modules, 43,826 LOC) cross-referenced against the test suite (109 test files).tsconfig.background.jsontsconfig.jsontsconfig.tests.jsonvite.config.mobile.tsvite.config.tsvitest.config.tsWASM-PROVENANCE.mdPeach's vault security rests on a small set of third-party packages that either ship WebAssembly blobs or sit directly on a security path.history
details
Peach
A free, open source, local-first password manager for Chrome, Firefox, and Android.
Peach encrypts your vault on your device. No hosted vault, subscription, or account is required to use it.
Features
- Passwords, cards, and secure notes — keep your private data together in one encrypted vault
- Inline autofill — fill and save credentials without leaving the page
- TOTP built in — generate two-factor codes without a separate authenticator
- Password health — find weak, reused, and exposed passwords
- Portable backups — export and restore with PeachScript or a
.peachfile
Peach Pro adds:
- Peach Sync — end-to-end encrypted sync across paired devices
- Passkeys — save and use passkeys in Chrome and Firefox
- Peach Codex — print an encrypted, scannable backup of your vault
- Advanced vault health, Canary Entries, and duress tools
See the Peach website for current availability and Pro details.
Install
Open Source
Peach is released under the GPL v3. This repository contains Peach's Chrome and Firefox browser extensions. Android is maintained separately.
The source is hosted on Kepr, Asha Software's version control platform.
Security
Vault data is encrypted with AES-256-GCM and protected by Argon2id key derivation. Peach Sync authenticates paired devices and encrypts data in transit.
Implementation details live alongside the code:
Building
bun install --frozen-lockfile
bun run build
Builds are written to dist-chrome/ and dist-firefox/.
Built by Asha Software · [email protected]