Table of contents Show Hide
What you can build
A password manager with no vault: each service’s secret is derived from the user’s seed phrase and that service’s name — the same result on every device, forever, and never persisted anywhere. A new phone plus the twelve words restores every password.
How it works
A Handle per persona derives one secret per service context:
const work = await identity.deriveHandle('work');
const githubSecret = work.derivePassword('github.com', 32);
const jiraSecret = work.derivePassword('jira.internal', 32);
@me2em/crypto adds the guard rails: Argon2id profiles for secrets a user
must type rather than derive, and HIBP breach checks for the rare hand-chosen
password.
Benefits
- Zero storage. No vault file, no cloud sync, no breach surface — the password exists only at the moment of use.
- Deterministic restoration. Same seed + same context → same secret, on every device, with nothing to sync.
- Per-context isolation. A compromise of the work Handle never derives the personal Handle’s secrets.
- No reset flows. No “forgot password” exists because no password is stored.
Trade-offs
- The seed is the single point of failure. Lose the phrase — every derived password is gone; there is no recovery by design.
- Rotation is structural. Changing a secret means changing its context name — plan per-service rotation instead of in-place updates.
- Alpha. Package APIs are pre-1.0; pin versions.
References
- Scenario 8 in the protocol Use Cases guide
- Blog post why we don’t store your seed — the zero-storage model
- Blog post a password manager that stores nothing