status.md

6.8 KB · raw

rendered · source

Peach — Project Status

Generated: 2026-04-19
Version: 1.0.4
Type: Chrome Extension (Manifest V3)


Build Status

Check Status
TypeScript ✅ Passing (tsc --noEmit)
Unit Tests ✅ 6/6 passing (vitest)
Vite Build ✅ Built (dist/)
Extension ID peach-browser

Architecture

src/
├── background/      Service worker (vault + message handling)
│   ├── entry.ts     Entry point
│   ├── aes.ts       Background-only AES helpers to avoid popup bundle leakage
│   ├── vault.ts     Vault CRUD + crypto ops (in-memory key)
│   ├── messages.ts  Message handler bridge
│   ├── clipboard.ts Auto-clear clipboard after 30s
│   └── alarms.ts    Auto-lock after 15 min idle
├── content/         Injected into all pages
│   ├── index.ts     Detects forms, injects 🍑 icon
│   ├── detect.ts    Field detection (username/password)
│   ├── fill.ts      Field filling via setNativeValue
│   ├── inject.ts    Autofill selector UI (shadow DOM)
│   └── save.ts      Detects form submits, prompts to save
├── popup/           Extension popup UI (Solid.js)
│   ├── App.tsx      Root component, view router
│   ├── views/       Lock, Vault, Entry, Add, Settings, Import, Export, Generator
│   └── components/  TOTP, Ring, Pip, Generator
├── crypto/          Zero-knowledge crypto
│   ├── argon2.ts    Key derivation (Argon2id via WASM)
│   ├── aes.ts       AES-256-GCM encrypt/decrypt
│   ├── totp.ts      TOTP generation (otpauth)
│   └── crypto.test.ts
└── shared/          Shared types, domain extraction, import parsers

Feature Inventory

Vault Core

Entry Management

Autofill (Content Script)

Save Detection (Content Script)

Import / Export

Password Generator

TOTP

UI / Visual System


Crypto Implementation

Concern Implementation
Key derivation Argon2id (hash-wasm) — 3 iterations, 64MB memory
Encryption AES-256-GCM — fresh nonce per write
Auth tag 128-bit GCM tag, stored alongside ciphertext
AAD Version byte 0x01 prevents downgrade
Key zeroing Uint8Array.fill(0) on lock

Test Status

TEST_CHECKLIST.md has 22 manual tests defined, 0 marked complete.

Recommended manual tests before daily driving:

  1. Vault create/unlock/lock cycle
  2. Entry CRUD + persistence across locks Includes popup close/reopen while the background may still be alive or already suspended
  3. Autofill on github.com (domain filter, manual trigger, visible fill)
  4. TOTP display and countdown
  5. Password generator
  6. Import CSV / Export encrypted backup
  7. Clipboard auto-clear (30s wait)
  8. Auto-lock on idle
  9. Save credential detection on form submit
  10. Wrong password → shake animation, clean error

Release blockers to verify before daily driving:


Known Gaps

Gap Status
HIBP breach check Defined in types (breach field) but not implemented
Backup restore test Checked as release blocker, not automated
Unit tests for content script None
Unit tests for vault CRUD Basic create + soft-delete coverage added; broader CRUD coverage still missing
E2E / Playwright tests Manual checklist still primary, but test-extension.mjs now exercises extension loading, vault creation, entry save, and popup reopen persistence

Dependencies

Package Purpose
hash-wasm Argon2id WASM implementation
otpauth TOTP code generation
papaparse CSV import
tldts eTLD+1 domain extraction
webextension-polyfill Cross-browser extension API
solid-js Popup UI framework
vite-plugin-solid Solid.js Vite integration
@crxjs/vite-plugin CRX packaging for Vite
vitest Unit testing

Security Considerations


Build Instructions

npm run dev      # Dev server with hot reload
npm run build    # Production build → dist/
npm run typecheck # TypeScript validation
npm test         # Unit tests (vitest)

To load in Chrome: chrome://extensions → Developer mode → Load unpacked → dist/