NIP-25 - Reactions
Table of Contents
Reactions
draft
optional
A reaction is a kind 7
event that is used to react to other events.
The generic reaction, represented by the content
set to a +
string, SHOULD
be interpreted as a "like" or "upvote".
A reaction with content
set to -
SHOULD be interpreted as a "dislike" or
"downvote". It SHOULD NOT be counted as a "like", and MAY be displayed as a
downvote or dislike on a post. A client MAY also choose to tally likes against
dislikes in a reddit-like system of upvotes and downvotes, or display them as
separate tallies.
The content
MAY be an emoji, or NIP-30 custom emoji in this case it MAY be interpreted as a "like" or "dislike",
or the client MAY display this emoji reaction on the post. If the content
is an empty string then the client should
consider it a "+".
Tags
The reaction event SHOULD include e
and p
tags from the note the user is reacting to (and optionally a
tags if the target is a replaceable event). This allows users to be notified of reactions to posts they were mentioned in. Including the e
tags enables clients to pull all the reactions associated with individual posts or all the posts in a thread. a
tags enables clients to seek reactions for all versions of a replaceable event.
The last e
tag MUST be the id
of the note that is being reacted to.
The last p
tag MUST be the pubkey
of the event being reacted to.
The a
tag MUST contain the coordinates (kind:pubkey:d-tag
) of the replaceable being reacted to.
The reaction event MAY include a k
tag with the stringified kind number of the reacted event as its value.
Example code
func make_like_event(pubkey: String, privkey: String, liked: NostrEvent) -> NostrEvent {
var tags: [[String]] = liked.tags.filter {
tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p")
}
tags.append(["e", liked.id])
tags.append(["p", liked.pubkey])
tags.append(["k", liked.kind])
let ev = NostrEvent(content: "+", pubkey: pubkey, kind: 7, tags: tags)
ev.calculate_id()
ev.sign(privkey: privkey)
return ev
}
Reactions to a website
If the target of the reaction is a website, the reaction MUST be a kind 17
event and MUST include an r
tag with the website's URL.
{
"kind": 17,
"content": "⭐",
"tags": [
["r", "https://example.com/"]
],
// other fields...
}
URLs SHOULD be normalized, so that reactions to the same website are not omitted from queries. A fragment MAY be attached to the URL, to react to a section of the page. It should be noted that a URL with a fragment is not considered to be the same URL as the original.
Custom Emoji Reaction
The client may specify a custom emoji (NIP-30) :shortcode:
in the
reaction content. The client should refer to the emoji tag and render the
content as an emoji if shortcode is specified.
{
"kind": 7,
"content": ":soapbox:",
"tags": [
["emoji", "soapbox", "https://gleasonator.com/emoji/Gleasonator/soapbox.png"]
],
// other fields...
}
The content can be set only one :shortcode:
. And emoji tag should be one.