Every credential is encrypted in your browser before it ever leaves your device. Credential fields and key blobs are stored encrypted. Protecting them depends on the whole system: encryption, key exchange, authentication and session controls — not just the choice of cipher.
The Dual-Gate architecture separates identity from authorization, keeping account sign-in distinct from the keys used to decrypt credentials.
Your email and password authenticate you to our server. This proves who you are, but gives you access to nothing but encrypted blobs.
Your 3-word login phrase + your email + a global pepper are fed into Argon2id to derive a key that decrypts your Master Key - entirely in your browser. The Master Key exists only in volatile RAM for the duration of your session.
The server stores only the encrypted master_key_blob, a salt, and your public key. It never sees your 3 words, the Derived Key, or the Master Key.
On every login, your browser re-derives the key from your 3 words + email + salt, decrypts the master_key_blob, and holds the Master Key only in volatile browser memory.
Each project has its own Project Key, wrapped (encrypted) by your Master Key using XChaCha20-Poly1305. Credentials are encrypted field-by-field with unique random nonces.
Battle-tested cryptographic primitives with parameters designed to withstand modern attack vectors.
Your 3-word login phrase is transformed into a Derived Key using Argon2id, the winner of the Password Hashing Competition. This Derived Key then decrypts your Master Key (stored as an encrypted blob on the server).
Each credential (name, username, password, email, URL, notes) is encrypted field-by-field using XChaCha20-Poly1305 with a Project Key (or the Master Key for personal vault items). Each encryption operation uses a unique random 24-byte nonce prepended to the ciphertext.
Invited users never need the owner's 3-word login phrase. The Project Key is sealed to the invitee's public key; opening that sealed copy requires the corresponding private key. After acceptance, each member keeps a copy wrapped with their own Master Key.
The previous invite-code flow stored a plaintext code on the server. That contradicted our stated separation of key-exchange material. We removed the invite_code column and replaced code-derived wrapping with recipient public-key sealing.
Owner's browser already has the Project Key in memory (unwrapped from their Master Key)
The Project Key is sealed to the invitee's public key
The sealed Project Key can be stored for the recipient without storing a plaintext invite code
The invitee uses the private key corresponding to the recipient public key to open the sealed Project Key locally
The unsealed Project Key exists in browser memory
The Project Key is immediately re-wrapped with the invitee's own Master Key and stored
Subsequent access uses the member's own wrapped copy of the Project Key
The Project Key is sealed for the invitee rather than wrapped with a code-derived key.
The server-side invite_code column has been removed.
After acceptance, each user unlocks via their own 3 words → Master Key. No ongoing dependency.
All cryptographic operations happen in your browser using libsodium-js, a JavaScript implementation of the industry-standard NaCl library. This means:
Let's walk through exactly what an attacker would find with full database access.
Through SQL injection, insider threat, or server compromise
Trying to crack the encryption without the 3-word phrase
The math makes decryption impossible without the 3-word phrase
Encryption is an important boundary, not a promise that every implementation is flawless. Credential fields and key blobs are encrypted, but key exchange and access controls must uphold the same model. The October 2026 reports exposed gaps in those boundaries; the production fixes and lessons are documented openly below.
Thank you to independent researcher squ11z1 for reporting FIND-PW01, FIND-PW11 and FIND-PW12 through coordinated disclosure in October 2026. All three issues were confirmed fixed in production in our response. This acknowledgement is not a full independent audit or a claim that no other vulnerabilities exist.
Security documentation updated:
This is a realistic preview of what our production database actually stores. Even with full access, every field is an indecipherable encrypted blob.
We literally cannot read your data.
Random-looking base64 strings - encrypted blobs that are computationally indistinguishable from random noise.
Everything - site names, usernames, passwords, emails, URLs & notes. Completely unrecoverable without your 3-word login phrase.
Even if an attacker steals our entire database, they get nothing usable. Every single field is end-to-end encrypted with XChaCha20-Poly1305.
See how our zero-knowledge architecture compares to standard master password systems.
| Feature | Traditional | |
|---|---|---|
| Key Derivation | Argon2id (64MB, 3 iterations, memory-hard) | PBKDF2 / bcrypt |
| Authentication Model | Dual-Gate (Identity + 3-Word Authorization) | Single Master Password |
| Encryption Algorithm | XChaCha20-Poly1305 (authenticated, unique nonces) | AES-256-CBC / GCM |
| Key Storage | RAM only (volatile browser memory) | LocalStorage / Cookies |
| Server Breach Impact | Encrypted fields and wrapped/sealed keys; impact depends on the compromise | Potential vault exposure |
| Sharing Model | Recipient public-key sealing → independent key copy | Shared vault key or server-mediated |
| Per-Project Isolation | Unique Project Keys, wrapped by Master Key | Shared vault key |
| GPU Attack Resistance | High (64MB memory-hard per attempt) | Low to Medium |
| Recovery Option | 3-word login phrase (offline backup) | Email-based recovery |
Join teams who've upgraded from legacy password managers to true zero-knowledge architecture.
No cookies. No tracking. No banners (almost).
We use privacy-friendly, cookieless analytics (Umami) to count page views — no personal data, no profiling, no third-party scripts. Read more.