VaultKeeper
Local-First Password Manager with End-to-End Encryption and Optional Self-Hosted Sync
Features
- Local-first — All data stored encrypted in your browser's localStorage
- E2E encryption — AES-256-GCM with PBKDF2 key derivation (600,000 iterations)
- Zero-knowledge — The server never sees your plaintext data or master password
- Optional self-hosted sync — Sync across devices with your own server
- Password generator — Configurable length, character sets, passphrase mode
- Password strength meter — Real-time entropy calculation
- Categories & tags — Organize entries with categories and tags
- Favorites — Mark frequently used entries
- Search & filter — Full-text search across all fields
- Auto-lock — Vault locks after 15 minutes of inactivity
- Modern UI — Dark theme with TailwindCSS, Lucide icons
Security Architecture
Master Password
│
▼
PBKDF2 (600,000 iterations, SHA-256, 32-byte salt)
│
▼
AES-256-GCM Key (non-extractable)
│
├──► Encrypt each vault entry (individual IV per entry)
├──► Create verifier token (to validate password on unlock)
└──► Never stored, never sent to server
- Key derivation: PBKDF2 with 600,000 iterations and SHA-256
- Encryption: AES-256-GCM (authenticated encryption)
- Key storage: CryptoKey objects are non-extractable (never serialized)
- Sync: Only encrypted vault data is sent to the server
- Server: Stores encrypted blobs, never has access to plaintext
Quick Start
Frontend (Web App)
npm install
npm run dev
Sync Server (Optional)
npm run dev:server
Server runs on http://localhost:3001
Docker
docker-compose up
Usage
- Create your vault — Choose a strong master password (min 12 chars)
- Add entries — Store passwords, usernames, URLs, notes
- Generate passwords — Use the built-in generator with configurable options
- Organize — Use categories, tags, and favorites
- Sync (optional) — Set up your sync server to sync across devices
Project Structure
vaultkeeper/
├── src/
│ ├── components/
│ │ ├── LockScreen.tsx
│ │ ├── SetupScreen.tsx
│ │ ├── Sidebar.tsx
│ │ ├── EntryList.tsx
│ │ ├── EntryDetail.tsx
│ │ ├── EntryForm.tsx
│ │ ├── SyncSettings.tsx
│ │ └── SearchBar.tsx
│ ├── crypto.ts # Web Crypto API wrapper
│ ├── vault.ts # Vault management class
│ ├── sync.ts # Sync client
│ ├── passwordGenerator.ts
│ ├── types.ts
│ ├── App.tsx
│ ├── main.tsx
│ └── index.css
├── server/
│ ├── index.ts # Express sync server
│ └── tsconfig.json
├── tests/
│ └── passwordGenerator.test.ts
├── Dockerfile
├── docker-compose.yml
├── nginx.conf
└── package.json
Development
npm install
npm run dev # Start frontend dev server
npm run dev:server # Start sync server
npm test # Run tests
npm run typecheck # Type checking
npm run lint # Lint
npm run build # Build for production
License
MIT