Skip to content

For the complete documentation index, see llms.txt. The full corpus is available at llms-full.txt. This page is also available as Markdown by appending .md to the URL.

Reading the history

Every version of an identity that has ever been published is kept, and every version is signed. The chain proves order and authorship. Bitcoin timestamps prove time. Together they mean nobody can rewrite the past quietly, including us.

Each manifest carries two fields inside the signed payload:

  • seq: its place in line. The first version is 0, and each new one adds 1.
  • prev: base64url(SHA-256(...)) of the previous version’s JWS.

Because prev is covered by the signature, editing any old version changes its hash, which breaks the link every later version depends on. The history is append-only, and it is append-only as a matter of arithmetic rather than policy.

Fetch the whole thing, oldest first:

GET https://realhandles.com/<handle>/realhandles-chain.json

verifyChain in @realhandles/verify checks all of it:

  1. Every entry’s signature verifies against the public key inside it.
  2. seq starts at 0 and increments by 1, with no gaps.
  3. Each prev equals the hash of the entry before it.
  4. The signing key stays the same, unless an entry carries a key change that was properly authorized.

On a key change it checks the authorization the same way the server did: either the previous key signed the handoff, or enough keys the identity had already published as Emergency Kits signed it. The recovery policy it judges against is the one in force before that entry, never the one the entry declares about itself. See Recovery and rotation.

If you pin a key, pin the genesis key. The chain then proves the current key from it, which is exactly the property that lets someone follow you through a rotation without having to be told.

What you seeWhat it means
Chain valid, same key throughoutNothing has changed hands.
Chain valid, key changed with a handoff signed by the old keyAn ordinary rotation. Same person, new key.
Chain valid, key changed with enough designated recovery signaturesA recovery. The identity came back through keys named in advance.
Key changed with no authorization in the entryDo not trust it. The chain says so, in the entry itself.
Key differs from the one you saw before, and no handoff anywhere in the historyThe identity you are looking at is not the one you saw before, whatever the handle says.

The chain proves order and authorship, but it does not prove when, and every entry in it lives in our database. An operator with database access could in principle fabricate a whole consistent history and date it to last year. Nothing inside the chain would contradict that.

OpenTimestamps closes it. The SHA-256 of each version’s JWS is submitted to public calendars and committed into the Bitcoin blockchain. That digest is the same one the next version records as its prev, so a timestamp on one entry transitively pins everything before it. Free, and no coins involved.

GET https://realhandles.com/<handle>/realhandles.ots

Timestamping runs on a schedule rather than at the moment you publish, because nothing about saving your own signed manifest should depend on a third party being up. The honest consequence: a proof attests “existed no later than this block”, a little after you pressed publish. An upper bound on the date is what a timestamp proves anyway.

A version showing as pending simply has not made it into a block yet. It does not mean anything is wrong.

  1. Fetch realhandles-chain.json and run verifyChain over it.
  2. Compare the resulting key to whatever you pinned last time. If you have never seen this identity before, pin the genesis key now.
  3. Fetch realhandles.ots and check it with the standard ots CLI against the corresponding JWS.

Step 3 is the one that matters if you do not want to take our word for anything. What the dashboard shows about Bitcoin status is us reporting on ourselves. The .ots file is checkable without us, and we deliberately do not verify the Bitcoin attestation for you: doing that properly needs a block header source, and handing it to your own OpenTimestamps tooling is the more honest answer.

The dashboard links it from the Publish tab. View signed history opens realhandles-chain.json, and Download .ots proof hands you the file step 3 needs. The badge beside them says whether the current version is committed to a Bitcoin block yet or still waiting for one.

Reading a history is how you decide whether to trust a stranger, so it is a different job from looking at your own and both clients keep it on a separate screen.

The RealHandles directory, listing published identities

The directory lists published identities. Every profile it links to serves its own manifest and history at fixed paths, so anything here can be audited by the steps above without asking this site to vouch for it.

For a handle you were handed rather than found, realhandles.com/verify takes the name and runs the check in your browser, using the same @realhandles/verify code the steps above call for.