Chapter 7D - Social
7D
Nostr Implementation Possibility - Hex № 7D

Forum Threads

A titled thread event for forum-style boards, with flat replies that always answer the root post.

1 Overview

A classic forum has topics. A user opens a topic with a title. Other users reply under the topic. Replies do not nest. This NIP maps that model onto Nostr with one event kind.

A thread is a kind 11 event. The thread text lives in content. The thread title lives in a title tag. Replies are not a new kind. Replies reuse the kind 1111 comment format from NIP-22.

The result is a flat discussion. Every reply points at the root thread event. Clients render the thread as one ordered list, like a forum topic page. This NIP was split out of the group-chat work in NIP-29 so that threads work on any relay.

Hint!

Threads are not text notes. A kind 1 note (see NIP-10) has no title and nests freely. Use kind 11 when you want a titled topic with a flat reply list.

2 The Thread Event — Kind 11

A thread is a regular event with kind set to 11. All base rules from NIP-01 apply: the event is signed, hashed, and published like any other event. Threads SHOULD include a title tag.

Wire format - kind 11 thread
{
  "kind": 11,
  "content": "Good morning",
  "tags": [
    ["title", "GM"]
  ]
}
Kind 11 reference
ItemValueRule
kind11Marks the event as a forum thread. Regular storage class per NIP-01.
contentstringThe body text of the thread's opening post.
title["title", <string>]The thread title. Threads SHOULD include this tag.

3 Replies — Kind 1111

Replies to a kind 11 thread MUST use NIP-22 kind 1111 comment events. A reply SHOULD always point to the root kind 11 event. Do not reply to a reply. This rule avoids arbitrarily nested reply hierarchies.

Wire format - kind 1111 reply
{
  "kind": 1111,
  "content": "Cool beans",
  "tags": [
    ["K", "11"],
    ["E", <event-id>, <relay-url>, <pubkey>]
  ]
}
Reply tags (from NIP-22)
TagFormRule
K["K", "11"]The kind of the root event. Always "11" for forum threads.
E["E", <event-id>, <relay-url>, <pubkey>]Points to the root kind 11 event: its id, a relay URL hint, and the author's pubkey.
Tech Note

The reply example in the source shows only the uppercase root tags K and E. NIP-22 also defines lowercase parent tags (k, e, p). Because every reply targets the root, the parent equals the root; the source does not state whether the lowercase set is still required. Follow NIP-22 for the full comment tag rules.

Thread kind 11 - "GM" Reply 1 kind 1111 Reply 2 kind 1111 Reply 3 kind 1111 E → root E → root
Fig. 7D-1 — Flat threading. Every reply carries an E tag to the root thread. Replies never point at other replies.

4 Worked Example

Alice opens a thread. Bob loads the thread and its replies, then posts one reply. Orange lines go to the relay. Blue lines come from the relay.

Session transcript - wss://forum.example.com
-- Alice opens a thread --
→ ["EVENT", {"id":"a3f1c02d9e…","pubkey":"8a2f11bc…","created_at":1749800000,
     "kind":11,"tags":[["title","GM"]],"content":"Good morning","sig":"91bb04c2…"}]
← ["OK", "a3f1c02d9e…", true, ""]

-- Bob fetches the thread and all replies to it --
→ ["REQ", "topic", {"ids":["a3f1c02d9e…"]},
     {"kinds":[1111], "#E":["a3f1c02d9e…"]}]
← ["EVENT", "topic", {"id":"a3f1c02d9e…", "kind":11, "content":"Good morning", …}]
← ["EOSE", "topic"]

-- Bob replies to the root --
→ ["EVENT", {"id":"c9d24be071…","pubkey":"5e90aa47…","created_at":1749800180,
     "kind":1111,"tags":[["K","11"],
     ["E","a3f1c02d9e…","wss://forum.example.com","8a2f11bc…"]],
     "content":"Cool beans","sig":"7fe210da…"}]
← ["OK", "c9d24be071…", true, ""]
-- the reply streams into Bob's open subscription --
← ["EVENT", "topic", {"id":"c9d24be071…", "kind":1111, "content":"Cool beans", …}]
Client Relay ["REQ", "topic", {"kinds":[1111],"#E":[root]}] ["EVENT", "topic", {kind 1111}] × stored replies ["EOSE", "topic"] ["EVENT", "topic", {kind 1111}] live replies The E tag is indexed, so one #E filter returns the whole flat thread.
Fig. 7D-2 — Loading a topic. One #E filter on the root id fetches every reply, stored and live.

5 Version History

NIP-7D began as part of the relay-based groups work and was split into its own document in late 2024. Notable changes, newest first:

  • 20262026-05Editorial sanity fix by fiatjaf; no rule change.
  • 20252025-04Renamed the thread title tag from subject to title (#1874).
  • Origin2024-11hodlbod broke chat and threads out of NIP-29; kind 11 threads became this standalone NIP (#1591).

Original Proposal - Credits

Authorhodlbod
First commit2024-11-21 — “Break out chat and threads from nip 29” (PR #1591)
Statusdraft - optional
Source7D.md on GitHub - full change history

6 See Also

  • NIP-01 — the base event format, kinds, and filters that threads build on.
  • NIP-22 — the kind 1111 comment format that all thread replies MUST use.
  • NIP-29 — relay-based groups; the document this NIP was split out of.
  • NIP-10 — kind 1 text notes with nested replies; the contrasting model.
  • NIP-C7 — chats; the sibling kind split out of NIP-29 in the same change.