Testimony
Testimony
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 #p tooling. 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 greater
created_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 first p value differs from d, or whose d equals its own pubkey. This validation is what enforces one-per-pair — relays do not. An event carrying a second d tag gets its own address but still matches a #d query, 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.