Login name and password on the outside. A portable Nostr identity underneath — encrypted and stored on public relays, with no account server, no password-reset email, and no vendor lock-in.
Forgetting a password and losing a device are different emergencies. BitLogin keeps them cryptographically separate.
Login name + password deterministically derive a private "locator" key and an encryption key. That key finds and decrypts a small credential capsule on public relays — no lookup table, no server, no email.
A 12-word phrase derives a completely independent recovery identity. A cracked password can never sign, replace, or delete the recovery capsule — it has no authority over that path at all.
Both paths unlock the exact same everyday Nostr keypair — your real, canonical, portable identity. Change your password as often as you like; the identity never moves.
Every design choice traces back to one constraint: it has to work with nothing but static files and public relays.
The whole client — crypto, UI, worker — ships as files. Host it anywhere: Pages, IPFS, a folder on a CDN. No backend to run or pay for.
Encrypted capsules are published to multiple Nostr relays with quorum reads and readback verification, so no single relay is a single point of failure.
A downloadable encrypted capsule can be attacked offline forever, so BitLogin generates a high-entropy passphrase for you by default. Prefer your own? It's allowed, but it has to clear a real entropy floor and a common-password check — no "password123", ever.
Memory-hard key derivation, authenticated encryption, canonical JSON serialization, and fixed padding buckets so ciphertext size doesn't leak contents.
A local generation high-water mark and monotonic timestamps mean a stale or malicious relay can't quietly roll a logged-in device back to an older capsule.
Once unlocked, BitLogin exposes a window.nostr provider — the same shape browser extensions use. Existing Nostr apps work with zero code changes.
One script tag, one custom element. No build step, no framework required.
<script type="module" src="/vendor/bitlogin/bitlogin.js"></script>
<bitlogin-auth vault-relays="wss://relay.example,wss://relay2.example"></bitlogin-auth>