Chapter 18 - Social
18
Nostr Implementation Possibility - Hex № 18

Reposts

A repost tells followers that another user's note is worth reading. This chapter defines kind 6, kind 16, and the q tag for quote reposts.

1 Overview

A repost is a signal, not a copy. A client publishes a repost event to tell its followers: "read this note." It does not replace the original event or change who wrote it.

NIP-18 defines three ways to repost. Kind 6 reposts a kind-1 text note. Kind 16, the generic repost, reposts any other kind of event. A quote repost is not a new kind at all. It is a normal event that mentions another event inline, marked with a q tag.

All three forms point back to the original event with an e, a, or q tag. A client that renders a repost should show the original author, the original content, and who reposted it.

Hint!

Think of kind 6 as "retweet this note" and a quote repost as "retweet with comment." Kind 16 covers everything that is not a kind-1 note, such as a repost of a long-form article or a highlight.

Author Reposting user Relay Follower kind 1 kind 6, e tag
Fig. 18-1 — A repost points back. The e tag in the kind-6 event carries the original note's ID and a relay URL so any follower can fetch it.

2 Kind 6 - Reposting a Note

Kind 6 reposts are reserved for kind-1 text notes only. Use kind 16 for every other kind. A kind-6 event follows these rules:

Kind 6 rules
FieldRule
kind6.
contentThe stringified JSON of the reposted kind-1 event. May be empty, but an empty content is not recommended.
e tagRequired. ["e", <id of the reposted note>, <relay URL>]. The relay URL is required, so any client can fetch the original.
p tagRecommended. ["p", <pubkey of the reposted note's author>].
Warning!

Reposts of events protected by NIP-70 should always have an empty content. Do not copy a protected event's JSON into a repost.

3 Quote Reposts

A quote repost is any event that mentions another event inline, using an NIP-21 entity such as nevent, note, or naddr inside its content. When a client builds this kind of event, it must add a matching q tag for every mention.

The q tag keeps quote reposts out of reply threads. Without it, a thread-rendering client could mistake a quote for a reply. The q tag also lets a client count every quote of one event with a single filter.

Tag shape - q tag
["q", <event id or event address>, <relay URL>, <pubkey, only if a regular event>]
q tag reference
PositionValue
0"q", the tag name.
1The 32-byte hex event ID for a regular event, or the kind:pubkey:d-tag address for an addressable event.
2A relay URL where the quoted event can be found.
3The author's pubkey. Only present when position 1 is a regular event ID, not an address.
Hint!

A quote repost is not restricted to kind 1. Any event kind may quote another event this way, as long as it adds the q tag for the mention.

4 Kind 16 - Generic Reposts

Kind 6 only covers kind-1 notes. To repost any other kind of event, publish a kind 16 generic repost instead.

Kind 16 rules
FieldRule
kind16.
k tagRecommended. ["k", <stringified kind number of the reposted event>].
a tagRecommended when the reposted event is replaceable. ["a", "<kind>:<pubkey>:<d-tag>"], the event coordinate. See NIP-01 for the coordinate format.
contentRequired to hold the full JSON string of the reposted event, but only when the a tag is absent.

The a tag changes what the repost means. If a kind-16 repost of a replaceable event includes an a tag, it reposts the address in general, whatever version is current. If the a tag is absent, the repost points at one specific version. In that case content must carry the full JSON of that exact reposted event.

Tech Note

The source spec does not say whether a kind-16 repost of a non-replaceable, regular event needs an e tag. Earlier drafts of this NIP used an e tag for all reposts; the current text only spells out k and a for kind 16. In practice, implementations still add an e tag pointing at the reposted event's ID for non-replaceable kinds, by analogy with kind 6.

Event to repost kind 1? → kind 6, e tag any other kind → kind 16, k tag replaceable? → add a tag
Fig. 18-2 — Choosing the repost kind. A kind-1 note uses kind 6. Everything else uses kind 16 with a k tag, plus an a tag for replaceable events.

5 Worked Examples

Example A: a plain kind-6 repost of a kind-1 note. Orange lines go to the relay.

Example A - kind 6 repost
-- original note, kind 1 --
{
  "id": "b1a649ebe8…", "pubkey": "22a12a12…", "kind": 1,
  "content": "Running nostr.", "tags": [], "created_at": 1749762600
}

-- repost, kind 6 --
→ ["EVENT", {
     "id": "9f2c11ab…", "pubkey": "44bb0e02…", "kind": 6, "created_at": 1749762700,
     "tags": [
       ["e", "b1a649ebe8…", "wss://relay.example.com"],
       ["p", "22a12a12…"]
     ],
     "content": "{\"id\":\"b1a649ebe8…\",\"pubkey\":\"22a12a12…\",\"kind\":1,\"content\":\"Running nostr.\",\"tags\":[],\"created_at\":1749762600,\"sig\":\"e8551d85…\"}",
     "sig": "77af1d22…"
   }]
← ["OK", "9f2c11ab…", true, ""]

Example B: a quote repost. The kind-1 note mentions another note inline and adds a matching q tag.

Example B - quote repost
→ ["EVENT", {
     "id": "d048ac21…", "pubkey": "44bb0e02…", "kind": 1, "created_at": 1749762800,
     "content": "This is worth reading: nostr:nevent1qqs…qpp0",
     "tags": [
       ["q", "b1a649ebe8…", "wss://relay.example.com", "22a12a12…"]
     ],
     "sig": "3fbb2c40…"
   }]
← ["OK", "d048ac21…", true, ""]

Example C: a kind-16 generic repost of a replaceable long-form article (NIP-23, kind 30023). The a tag is present, so content stays empty.

Example C - kind 16 repost, replaceable event
→ ["EVENT", {
     "id": "c7e3a901…", "pubkey": "44bb0e02…", "kind": 16, "created_at": 1749762900,
     "tags": [
       ["k", "30023"],
       ["a", "30023:22a12a12…:my-article-slug"],
       ["p", "22a12a12…"]
     ],
     "content": "",
     "sig": "ab19fe02…"
   }]
← ["OK", "c7e3a901…", true, ""]

6 Version History

NIP-18 has been rewritten several times, including one removal and reinstatement. Notable changes, newest first:

  • 20252025-12-03Updated NIP-18's section headings for clarity.
  • 20252025-12-02Improved the rules for kind-16 generic reposts of replaceable events: the a tag is now recommended, and content is required only when it is absent.
  • 20252025-10-16Normalized the q tag definition to match NIP-22.
  • 20252025-08-04Included the missing k tag guidance for generic reposts.
  • 20252025-01-10Specified that reposts of protected events must not stringify the original event into content.
  • 20242024-10-31Added explicit support for quoting addressable events (address quotes).
  • 20242024-10-02Recommended the k tag for quote-repost-adjacent generic reposts and clarified quote-repost behavior.
  • 20242024-02-22Switched quote reposts from e tags to a dedicated q tag.
  • 20232023-06-16Reworded the NIP back to its original intent and added kind 16 generic reposts.
  • 20232023-03-25 to 2023-03-29Brought the NIP back after removal; added the optional content comment, then dropped the requirement to copy the full event.
  • Origin2023-01-02fiatjaf published NIP-18: Reposts (#140). Briefly removed on 2023-01-16 as "not really a standard," then reinstated.

Original Proposal - Credits

Authorfiatjaf
First commit2023-01-02 — “NIP18: Reposts (#140)”
Statusdraft - optional
Source18.md on GitHub - full change history

7 See Also

  • NIP-01 — defines the kind-1 text note, event coordinates, and the base e/p tags this chapter builds on.
  • NIP-10 — reply threading with e tags; reposts use the q tag precisely so they are not mistaken for replies.
  • NIP-21 — the nostr: URI scheme and nevent/note/naddr entities used inline in quote reposts.
  • NIP-27 — general text note references and mentions, the broader mechanism that quote reposts are one case of.
  • NIP-70 — protected events; their reposts must keep content empty.
  • NIP-22 — comments; its tag conventions were used to normalize the q tag definition here.
  • NIP-23 — long-form content, a common target of kind-16 generic reposts.