Web · 2026
A zero-knowledge vault for logins, wallet keys, SSH keys and API keys: everything is encrypted in the browser, and the server only ever stores ciphertext.

Overview
Seed phrases, SSH keys and API keys tend to end up in notes apps and chat messages, and hosted password managers ask you to trust their servers with them. I wanted one place for all of it, where the server could never read a thing, that I could host myself for free.
ZKVault encrypts every item in the browser before it leaves. A random data key encrypts the items; that key is wrapped twice, by a key derived from the master password and by one derived from a 24-word recovery key. Supabase stores only ciphertext and the two wrapped keys, and row-level security scopes every row to its owner.
Features
Logins with a password or an OAuth provider, crypto wallets with seed phrases, SSH keys, API keys for 40 services, databases and secure notes.
Live TOTP codes with a countdown; add a secret by pasting it, picking an image or scanning the QR code with the camera.
WebAuthn's PRF extension lets the authenticator itself produce the key that opens a locally stored unlock bundle.
Flags reused, weak and year-old passwords, with an opt-in breach check that sends only a five-character hash prefix.
Fuzzy search on Ctrl K, tags with any or all matching, filters for each item type and a password generator.
A .vault export keeps every item as ciphertext and imports with the master password or the 24 words; the app reminds you when a backup is over 30 days old.
How it works
Argon2id, with 64 MiB of memory and 3 passes, turns the master password into a key; the Supabase login secret is derived separately.
A random 256-bit data key is wrapped by the master key and by the recovery key, so a new password re-wraps one key, not every item.
Each item is validated, then encrypted with AES-256-GCM under a fresh 12-byte IV.
Supabase keeps the ciphertext, the item type and a favourite flag; title, URL and tags are encrypted too.
Highlights
A guard script fails the build if any server action or route imports the crypto code, and the Supabase client refuses to run outside the browser.
The login salt is derived from the email, so a new device needs only the email and the master password, with no database read first.
Password changes and recovery-key rotation each re-read the live key settings and write only their own salt; a failed change checks what actually happened before it reports.
A strict Content Security Policy, HSTS and no framing; autofill off, auto-lock after idle, and a clipboard that wipes itself after 20 seconds.
Under the hood
v0.3.0
OAuth logins, an API key service picker and one brand-logo system across the app.
v0.2.0
A password generator, recovery-key rotation, a backup reminder and a filter bar for each item type.
v0.1.0
Envelope encryption, six item types, 2FA with QR scanning, biometric unlock, password health, encrypted backups and a PWA.
Gallery



