Step 1 of 4
List your accounts
Publish kind 10011 with one i tag per account: "platform:identity", for example "github:alice-nostr". Platform names use only a-z, 0-9 and ._-/ and never a colon.
NIP-39
DraftEvents
Prove you also own accounts elsewhere (GitHub, Mastodon, Bluesky, Telegram, Discord…): list them in a kind 10011 event, each pointing at a public post where that account names your npub.
Edit the form or the JSON: both stay in sync, the badge says whether the result is valid, and tapping any field explains it.
Not signed yet · Demo keys only. These personas' secret keys are public on purpose.
Select any field in the form or the JSON to see what it does.
Step 1 of 4
Publish kind 10011 with one i tag per account: "platform:identity", for example "github:alice-nostr". Platform names use only a-z, 0-9 and ._-/ and never a colon.
No course chapter covers this NIP yet. The editor above is the quickest way in.
Proofs quote your NIP-19 npub.
NIP-05 links your key to a domain name; NIP-39 links it to accounts on other platforms.
NIP-73 also uses platform-prefixed ids in i tags, for content rather than identities.
Specification text is quoted in English from the nostr-protocol/nips repository. Our explanations and the interface are translated. Source on GitHub at commit 0046368
Users can declare their control over one or more online identities such as usernames, profile pages, keypairs in kind 10011 using i tags.
{
"kind": 10011,
"tags": [
["i", "github:semisol", "9721ce4ee4fceb91c9711ca2a6c9a5ab"],
["i", "twitter:semisol_public", "1619358434134196225"],
["i", "mastodon:bitcoinhackers.org/@semisol", "109775066355589974"],
["i", "telegram:1087295469", "nostrdirectory/770"]
],
// other fields...
}
An i tag MUST have two parameters, which are defined as the following:
platform:identity: This is the platform name (for example github) and the identity on that platform (for example semisol) joined together with :.proof: String or object that points to the proof of owning this identity.Clients SHOULD process any i tags with more than 2 values for future extensibility.
Identity provider names SHOULD only include a-z, 0-9 and the characters ._-/ and MUST NOT include :.
Identity names SHOULD be normalized if possible by replacing uppercase letters with lowercase letters, and if there are multiple aliases for an entity the primary one should be used.
For every claim type, the proof SHOULD have the text:
Verifying that I control the following Nostr public key: <npub encoded public key>
Clients verifying a claim SHOULD accept any proof published by <identity> that contains the user's npub, because proofs created under earlier versions of this NIP use different text.
githubIdentity: A GitHub username.
Proof: A GitHub Gist ID. This Gist should be created by <identity> with a single file that has the verification text.
This can be located at https://gist.github.com/<identity>/<proof>.
twitterIdentity: A Twitter username.
Proof: A Tweet ID. The tweet should be posted by <identity> and have the verification text.
This can be located at https://twitter.com/<identity>/status/<proof>.
mastodonIdentity: A Mastodon instance and username in the format <instance>/@<username>.
Proof: A Mastodon post ID. This post should be published by <username>@<instance> and have the verification text.
This can be located at https://<identity>/<proof>.
telegramIdentity: A Telegram user ID.
Proof: A string in the format <ref>/<id> which points to a message published in the public channel or group with name <ref> and message ID <id>. This message should be sent by user ID <identity> and have the verification text.
This can be located at https://t.me/<proof>.
blueskyIdentity: A Bluesky handle, without the leading @ (for example alice.bsky.social).
Proof: The record key of a Bluesky post. This post should be published by <identity> and have the verification text.
This can be located at https://bsky.app/profile/<identity>/post/<proof>.
discordIdentity: A Discord username.
Proof: A string in the format <guild>/<channel>/<message> which points to a message with ID <message> in the channel with ID <channel> of the server with ID <guild>. This message should be sent by <identity> and have the verification text.
This can be located at https://discord.com/channels/<proof>.
Discord messages can only be read by members of the server they were posted in, so clients that cannot access the server will not be able to verify this claim.