A login your users
actually take with them.

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.

Try the demo → Add it to your site
Everyday login
Login name + password
Locally derived
Password-locked locator key
Public relays
Encrypted capsule lookup
Result
Portable Nostr identity

Two independent ways in, one identity

Forgetting a password and losing a device are different emergencies. BitLogin keeps them cryptographically separate.

🔑 Password path

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.

🌱 Recovery phrase

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.

🪪 One everyday identity

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.

Why this is different

Every design choice traces back to one constraint: it has to work with nothing but static files and public relays.

Static-first

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.

Relay-redundant storage

Encrypted capsules are published to multiple Nostr relays with quorum reads and readback verification, so no single relay is a single point of failure.

Generated by default, never weak

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.

Argon2id + AES-256-GCM

Memory-hard key derivation, authenticated encryption, canonical JSON serialization, and fixed padding buckets so ciphertext size doesn't leak contents.

Rollback-resistant

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.

NIP-07-compatible signing

Once unlocked, BitLogin exposes a window.nostr provider — the same shape browser extensions use. Existing Nostr apps work with zero code changes.

Drop it into any static page

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>

Read the full integration guide →