Tools/Web/2026

Nepomuk

Offline-first password manager that regenerates every password from a master key instead of storing a vault to steal.

nepomuk-hero.png — 1600×900

Overview

Nepomuk is a deterministic, offline-first password manager: instead of storing your passwords, it regenerates them on demand from a master password using a keyed hash, so there is no password vault to steal, only encrypted metadata.

It ships as a PWA (installable, works fully offline) and a companion browser extension for autofill, with optional end-to-end encrypted sync across devices via Supabase.

The problem

Traditional password managers store an encrypted vault of your actual passwords, which becomes a single high-value target if the vault or its sync service is ever compromised. Nepomuk removes that target by making passwords reproducible from a master secret plus per-site parameters, so only non-sensitive generation metadata (and, optionally, small encrypted static secrets like legacy passwords or TOTP seeds) ever needs to be persisted or synced.

Architecture

The UI runs on the main thread (React + Zustand) and talks to an isolated Web Worker over a Comlink RPC boundary; the worker is the only place the derived master key and decrypted state ever live, and it auto-wipes on idle or backgrounding. The worker derives a masterKey from the master password via Argon2id, computes per-site passwords with a keyed BLAKE2b hash over version/site/login/counter, and encrypts/decrypts vault blobs with XChaCha20-Poly1305 before they touch storage. Encrypted blobs are persisted locally in IndexedDB (via Dexie) and a vite-plugin-pwa service worker precaches the app shell and WASM for full offline use. Optionally, the same encrypted blobs are pushed/pulled to Supabase (Postgres + Realtime + Auth) as an opt-in, per-vault sync identity that never sees the master password or plaintext data. A separate WXT-based browser extension talks to the same crypto worker via a port bridge to autofill on the current site.

architecture-diagramUI (React) → Comlink RPC → Crypto Worker (Argon2id, BLAKE2b, XChaCha20-Poly1305) → IndexedDB (encrypted) ⇄ optional Supabase sync

Highlights

  • Deterministic generation Passwords are derived from master password + site + login + counter via a keyed BLAKE2b hash, so the same inputs always reproduce the same password with no vault of secrets to steal.
  • Worker-isolated key handling The derived master key lives only inside an isolated Web Worker with configurable idle-timeout auto-wipe, never on the main thread or in the DOM.
  • Recovery without a backdoor A one-time 256-bit recovery key wraps the master key so a forgotten master password can be recovered without ever storing the password itself.
  • E2E encrypted, per-vault sync Optional Supabase sync uploads only opaque ciphertext, scoped per active vault so multiple people can share one device without exposing each other's data.

Screenshots

landing.pngvault-dashboard.pngsync-settings.pngquick-generate.png
Next project
Signpost
All projects