30817:testimony
Testimony
- signed by
- npub1jafe6...l5zy7y
- published
- 2026-08-21
- event
- 1c7e470434...e2eb
draft optional
A testimony is one person's written opinion about another person.
Event
Kind 31675, addressable.
{
"kind": 31675,
"tags": [
["d", "<subject pubkey, 64 lowercase hex>"],
["p", "<same pubkey>"]
],
"content": "She flagged the data-loss bug nobody else wanted to look at, three weeks before it would have bitten us. I would work with her again without hesitating."
}
d— the subject. Exactly one, always the raw 64-char lowercase-hex pubkey, never annpub.p— the same pubkey, so the testimony routes to the subject's inbox relays (NIP-65) and shows up in normal#ptooling. A relay hint MAY be added as the second value.content— free-form plain text. This NIP says nothing about what a testimony may say. Social convention decides that.
Nothing else. No rating, no score, no label, no relationship field, no expiration.
Because the address is 31675:<author>:<subject>, an author has one testimony per person.
Writing another one about the same person replaces it. Writing about someone else is a
different address, so there is no limit on how many people you may write about.
Rules
Authors:
- MUST NOT write a testimony about themselves (
dequal to their own pubkey). That iskind:0. - Revise by republishing at the same address.
- Retract by republishing at the same address with empty
contentand a strictly greatercreated_at. (Equal timestamps are resolved by lowest event id, so a same-second retraction loses about half the time.)
Clients:
- MUST ignore any
31675event that does not have exactly onedtag, whosedis not 64 lowercase hex, whose firstpvalue differs fromd, or whosedequals its ownpubkey. This validation is what enforces one-per-pair — relays do not. An event carrying a seconddtag gets its own address but still matches a#dquery, so an unvalidating client can be flooded. - MUST discover testimonies about a person with
#d, never with#p.#pis for routing and notifications only, and is unconstrained. - MUST fold results by
(kind, pubkey, d)keeping the highestcreated_at. Relays serve stale versions. - MUST treat empty
contentas retracted and not render it. - SHOULD scope the default view of testimonies about a person to the reader's own social graph rather than showing every one that exists.
- SHOULD NOT derive a count, average or score from testimonies.
Relays need no changes to store and serve testimonies. They MAY validate the rules above at ingest, and MAY refuse the kind entirely.
Queries
{"kinds":[31675],"#d":["<subject>"]} // about a person
{"kinds":[31675],"authors":["<author>"]} // written by a person
{"kinds":[31675],"authors":["<me>"],"#d":["<subject>"]} // have I already written one?
Notes
A subject cannot suppress a testimony about themself, only decline to endorse it. Relays that
honour NIP-62 (Request to Vanish) SHOULD also drop 31675 events whose d is the vanishing
pubkey — otherwise erasure removes a person's own history and leaves what others wrote standing.
Replacing in place means there is no record of earlier versions. A testimony is a current standing statement, not a historical one.
Prior art
- NIP-87 kind
38000is this exact shape — addressable,d= the subject's pubkey, free prose, no rating, no consent gate — applied to mints. This applies it to people. - NIP-56 kind
1984is the only merged kind where one person writes prose about another's pubkey. Testimony is that with the sign flipped and the taxonomy removed. - PR #2198 (kind
63) proposes testimonials as a regular, recipient-approved event. This is the opposite trade: public, unilateral, and capped at one per pair.
Discussion
Connect a key to comment.