NIPs nostr improvement proposals

NIP-25 - Reactions

Table of Contents


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 "+".


The reaction event SHOULD include a, e and p tags pointing to the note the user is reacting to. The p tag allows authors to be notified. The e tags enables clients to pull all the reactions to individual events and a tags enables clients to seek reactions for all versions of a replaceable event.

The e tag MUST be the id of the note that is being reacted to.

The a tag MUST contain the coordinates (kind:pubkey:d-tag) of the replaceable being reacted to.

The p tag MUST be the pubkey of the event 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 {
tags.append(["p", liked.pubkey])
tags.append(["k", liked.kind])
let ev = NostrEvent(content: "+", pubkey: pubkey, kind: 7, tags: tags)
ev.sign(privkey: privkey)
return ev

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", ""]
"pubkey": "79c2cae114ea28a981e7559b4fe7854a473521a8d22a66bbab9fa248eb820ff6",
"created_at": 1682790000

The content can be set only one :shortcode:. And emoji tag should be one.