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.

Anchoring

An anchor is a copy of your signed identity, hosted somewhere you control. It is optional, it is one pointer among possible many, and it is never the identity. Your key is.

One thing, and it is a big thing: if RealHandles disappears, the file you hosted is still there and still verifies against your key. Somebody who saved your keyId years ago can check it with no working RealHandles and no cooperation from anyone.

That is the whole value. An anchor does not make you more verified, it does not raise your trust score, and it does not affect which handle you can hold.

A full manifest is self-contained. It survives us being gone, which is the point. It needs re-hosting every time you publish a new version, or the copy on your domain goes stale.

A pointer is signed once and hosted once. It proves you control the location and points at the always-current proof on RealHandles. Publishing again never means touching your server. The trade is that it is not self-contained: if RealHandles is gone, the pointer proves you control the domain but cannot show anyone what you claimed.

Either form goes at /.well-known/realhandles.json on your domain, or at a raw file URL you control.

Why a lapsed domain cannot take your identity

Section titled “Why a lapsed domain cannot take your identity”

Every check asks the same question: is this file signed by the key we already trust?

A domain that lapses, or gets seized, or gets bought by somebody with your name hands over control of an address and nothing to sign with. Any file hosted at that location fails verification, because the signature is not yours and cannot be made to be.

So the worst case is that your anchor goes from verified to lapsed. Your key, your handle, your accounts, and your signed history are untouched, and nobody verifying you is misled for a moment. This is the did:plc property: follow the key, not the name.

The reverse also holds. Moving your anchor to a different domain changes nothing about who you are. It drops back to unchecked until the new location is confirmed, and that is all.

  • You moved it, or changed where we look.
  • You rotated your key. The hosted file was signed by the retired key, so it no longer proves anything about the current one. Re-host and re-verify.
  • The check ran and the file was missing, unreadable, or signed by a key that is not yours.

A check only reads the file. It never writes anything and never changes your identity, so running it as often as you like costs nothing.

Anchoring is not the same as a domain proof

Section titled “Anchoring is not the same as a domain proof”

They are easy to confuse because both involve a domain you own.

Domain proofAnchor
What it provesYou control the domainA copy of your signed identity lives at a place you control
HowA one-time token in a file or a DNS TXT recordA signed file hosted at a known path
Effect on trust scoreYesNone
Effect on which handle you can holdYes, and it is the strongest kind of matchNone
Why you want itStronger identity, scarcer handleYour proof outlives RealHandles

You can do both with the same domain. They are separate actions and either works without the other. See Verifying an account for the proof side.

A Gist is the route when there is no domain to host on, and it is the one worth walking through because two steps in it are not obvious.

  1. On the Publish tab, under Where to host it, choose GitHub Gist (no domain needed).

  2. Press Download pointer file while the URL box is still empty.

    This looks like it cannot work, since the box wants a Gist that does not exist and the Gist wants a file you do not have. It works anyway: saving the location is skipped when the box is blank, so the download goes ahead. The file is small and contains nothing private, just your key id, your public key, the canonical URL of your profile, and a signature over the three.

  3. Create a public Gist with a file named realhandles.json and paste the downloaded contents into it.

    Public rather than secret, because an anchor exists to be found. Nothing in the file is secret either: it is the same public key already published on your profile.

  4. Copy the Raw URL, then delete the commit hash from it.

    This is the step that quietly breaks anchors. GitHub hands you a Raw link pinned to the exact revision:

    https://gist.githubusercontent.com/you/GIST_ID/raw/4cc92f1bffca7219246de.../realhandles.json

    That URL will serve this version of the file forever, so if you ever replace the pointer the anchor keeps reading the old one. Remove the hash segment and use the form that always follows the latest revision:

    https://gist.githubusercontent.com/you/GIST_ID/raw/realhandles.json
  5. Paste that URL into Gist raw URL, press Save anchor location, then press Verify anchor.

    The anchor panel showing a verified Gist, with the Anchored badge and the time it was last checked

    A pass reads Anchored, and says what it found: a signed pointer by a key it already trusts. It is checking the signature, not just that a file exists, so a Gist containing somebody else’s pointer fails here rather than passing quietly.

A pointer never needs touching again. It names your profile rather than copying it, so publishing a new version of your manifest does not invalidate it. A full manifest is the other trade: self-contained, and therefore stale the moment you re-sign unless you re-host it.

The anchor panel is on the Publish tab of the dashboard.

The anchor panel, offering a domain or a GitHub Gist as the host

A pointer file is signed once and hosted once. A full manifest is self-contained and keeps working even if RealHandles is gone, which is the case the anchor exists for. A Gist works when there is no domain to host on.

Save anchor location records where we should look, the two download buttons hand you the file to put there, and Verify anchor reads it back.