1 Overview
A NIP-01 kind:1 text note has no title field. The content field holds free text only. To show a list of notes, a client must invent a label for each one.
Without a title, a client usually falls back on the first few words of content. This is an ad hoc label. It often cuts a sentence in half and does not describe the topic.
This NIP defines one optional tag, subject, for kind:1 events. A client sets it to a short line of text. A list view can show this line instead of guessing from content. This works the way an email client lists incoming mail by subject line, not by the first words of the message body.
The subject tag was first implemented as a trial in the more-speech client.
2 The Subject Tag
A subject tag is a normal NIP-01 tag: an array of strings. The first element is the tag name, subject. The second element is the subject text.
["subject", <string>]
| Tag | Applies to | Rule |
|---|---|---|
| subject | kind:1 text note | Optional. Value is a short string that names the topic of the note. |
Three rules govern its use:
- The tag is optional. A client adds it only when the note starts a topic worth naming.
- When a client replies to a note that has a
subjecttag, the replying client SHOULD copy that tag into the reply. This keeps every note in a thread under the same subject. - A replying client MAY change the copied subject to mark it as a reply, for example by adding the prefix
Re:.
A subject SHOULD be shorter than 80 characters. A client MAY trim a longer subject before it displays the value in a list.
This tag only labels a note in a list. It does not change threading. Reply structure still comes from the e and p tags defined in NIP-10.
The source spec writes its one example as ["subject": <string>], with a colon between the elements. A tag is a JSON array, not an object, so elements must be separated by a comma: ["subject", "<string>"]. This page uses the comma form throughout, matching the tag array format defined in NIP-01.
3 Worked Example
Client A starts a thread with a subject. Client B replies, copies the subject, and adds a Re: prefix.
-- Client A opens a thread -- { "id": "a1c4e0…", "pubkey": "22a12a12…", "created_at": 1749762600, "kind": 1, "tags": [ ["subject", "Relay uptime this week"] ], "content": "My relay had two short outages, both under a minute.", "sig": "e8551d85…" } -- Client B replies, keeps the subject, adds "Re:" -- { "id": "9f2c11ab…", "pubkey": "f7234bd4…", "created_at": 1749763100, "kind": 1, "tags": [ ["e", "a1c4e0…", "wss://relay.example.com", "root"], ["p", "22a12a12…"], ["subject", "Re: Relay uptime this week"] ], "content": "Same here. Worth checking your host's network logs.", "sig": "d2b649ff…" }
A thread-list view can now show "Relay uptime this week" for both notes, instead of trimming each content string to a guessed label.
4 Version History
NIP-14 has changed little since it was published. Notable changes, newest first:
- 20232023-11-18Reformatted the tag example as a fenced JSON code block and tightened whitespace. No rule changed.
- 20232023-11-15Removed the inline
author:byline that this NIP shared with every other NIP file. - 20232023-07-12Trimmed the trailing period from the title to match the format used by other NIP pages.
- Origin2022-05-24Robert C. Martin (unclebobmartin) published NIP-14, renamed from a standalone proposal note. The tag was already running as a trial in the more-speech client.
Original Proposal - Credits
| Author | Robert C. Martin (unclebobmartin) |
| First commit | 2022-05-24 — “Nip-14 for subject tag” |
| Status | draft - optional |
| Source | 14.md on GitHub - full change history |