NextKey

Passphrase

Passphrase recovery with a human-in-the-loop

Create a passphrase here with social recovery to a human-in-the-loop. Only that human can recover the wallet with their Ledger.

1

Create a passphrase

A fresh twelve-word phrase.

2

Choose your grant

An ENS name that publishes a key — that record is the whole of the opt-in, and there is no registration with NextKey. Nobody in mind? A demo grant made here works just as well for trying it out.

3

Seal and grant it

One AES-256-GCM key for the content, then wrapped to the recipient with X25519 and HKDF-SHA256. What is sealed here opens there.

For AI-agents — the same loop without a browser

Every step above has a command-line equivalent, and the page reports what it did in a form a program can read. Nothing here needs a person watching.

nextkey.mjs new <label>
nextkey.mjs share <label> <identity> <recipient>
nextkey.mjs open  <name>  <identity>
nextkey.mjs revoke <label> <recipient>

A prepared state is one link. The address chooses what is being sent — /demo/passphrase or /demo/message — and two parameters do the rest: ?to=anna.nextkey.eth fills in the recipient and reads their key, ?lang=de sets the language. A secret is never accepted in a URL — a URL is written down in more places than anybody expects.

In the page, window.NEXTKEY.state() returns what has happened so far as JSON, and every result panel carries the same thing on a data-nk attribute. Private keys are not in either.

What just happened, and what it proves

The ciphertext and the grant were public from the moment they existed. Anyone could read them; nobody could use them. What separated the recipient from everyone else was a private key that was never published, never uploaded and never held by us.

The stranger's failure is the part worth dwelling on. It was not a permission check that a different build could skip: a different key derives a different wrapping key, and AES-GCM refuses. Access control that is arithmetic cannot be configured away.