upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/32.md
diff options
context:
space:
mode:
Diffstat (limited to '32.md')
-rw-r--r--32.md126
1 files changed, 126 insertions, 0 deletions
diff --git a/32.md b/32.md
new file mode 100644
index 0000000..ddd364a
--- /dev/null
+++ b/32.md
@@ -0,0 +1,126 @@
1NIP-32
2======
3
4Labeling
5---------
6
7`draft` `optional` `author:staab` `author:gruruya` `author:s3x-jay`
8
9A label is a `kind 1985` event that is used to label other entities. This supports a number of use cases, from distributed moderation and content recommendations to reviews and ratings.
10
11Label Target
12----
13
14The label event MUST include one or more tags representing the object or objects being
15labeled: `e`, `p`, `a`, `r`, or `t` tags. This allows for labeling of events, people, relays,
16or topics respectively. As with NIP-01, a relay hint SHOULD be included when using `e` and
17`p` tags.
18
19Label Tag
20----
21
22This NIP introduces a new tag `l` which denotes a label, and a new `L` tag which denotes a label namespace.
23A label MUST include a mark matching an `L` tag. `L` tags refer to a tag type within nostr, or a nomenclature
24external to nostr defined either formally or by convention. Any string can be a namespace, but publishers SHOULD
25ensure they are unambiguous by using a well-defined namespace (such as an ISO standard) or reverse domain name notation.
26
27Namespaces starting with `#` indicate that the label target should be associated with the label's value.
28This is a way of attaching standard nostr tags to events, pubkeys, relays, urls, etc.
29
30Some examples:
31
32- `["l", "footstr", "#t"]` - the publisher thinks the given entity should have the `footstr` topic applied.
33- `["l", "<pubkey>", "#p"]` - the publisher thinks the given entity is related to `<pubkey>`
34- `["l", "IT-MI", "ISO-3166-2"]` - Milano, Italy using ISO 3166-2.
35- `["l", "VI-hum", "com.example.ontology"]` - Violence toward a human being as defined by ontology.example.com.
36
37`L` tags containing the label namespaces MUST be included in order to support searching by
38namespace rather than by a specific tag. The special `ugc` ("user generated content") namespace
39MAY be used when the label content is provided by an end user.
40
41`l` and `L` tags MAY be added to other event kinds to support self-reporting. For events
42with a kind other than 1985, labels refer to the event itself.
43
44Label Annotations
45-----
46
47A label tag MAY include a 4th positional element detailing extra metadata about the label in question. This string
48should be a json-encoded object. Any key MAY be used, but the following are recommended:
49
50- `quality` may have a value of 0 to 1. This allows for an absolute, granular scale that can be represented in any way (5 stars, color scale, etc).
51- `confidence` may have a value of 0 to 1. This indicates the certainty which the author has about their rating.
52- `context` may be an array of urls (including NIP-21 urls) indicating other context that should be considered when interpreting labels.
53
54Content
55-------
56
57Labels should be short, meaningful strings. Longer discussions, such as for a review, or an
58explanation of why something was labeled the way it was, should go in the event's `content` field.
59
60Example events
61--------------
62
63A suggestion that multiple pubkeys be associated with the `permies` topic.
64
65```json
66{
67 "kind": 1985,
68 "tags": [
69 ["L", "#t"],
70 ["l", "permies", "#t"],
71 ["p", <pubkey1>, <relay_url>],
72 ["p", <pubkey2>, <relay_url>]
73 ],
74 "content": "",
75 ...
76}
77```
78
79A review of a relay.
80
81```json
82{
83 "kind": 1985,
84 "tags": [
85 ["L", "com.example.ontology"],
86 ["l", "relay/review", "com.example.ontology", "{\"quality\": 0.1}"],
87 ["r", <relay_url>]
88 ],
89 "content": "This relay is full of mean people.",
90 ...
91}
92```
93
94Publishers can self-label by adding `l` tags to their own non-1985 events.
95
96```json
97{
98 "kind": 1,
99 "tags": [
100 ["L", "com.example.ontology"],
101 ["l", "IL-frd", "com.example.ontology"]
102 ],
103 "content": "Send me 100 sats and I'll send you 200 back",
104 ...
105}
106```
107
108Other Notes
109-----------
110
111When using this NIP to bulk-label many targets at once, events may be deleted and a replacement
112may be published. We have opted not to use parameterizable/replaceable events for this due to the
113complexity in coming up with a standard `d` tag. In order to avoid ambiguity when querying,
114publishers SHOULD limit labeling events to a single namespace.
115
116Before creating a vocabulary, explore how your use case may have already been designed and
117imitate that design if possible. Reverse domain name notation is encouraged to avoid
118namespace clashes, but for the sake of interoperability all namespaces should be
119considered open for public use, and not proprietary. In other words, if there is a
120namespace that fits your use case, use it even if it points to someone else's domain name.
121
122Vocabularies MAY choose to fully qualify all labels within a namespace (for example,
123`["l", "com.example.vocabulary:my-label"]`. This may be preferred when defining more
124formal vocabularies that should not be confused with another namespace when querying
125without an `L` tag. For these vocabularies, all labels SHOULD include the namespace
126(rather than mixing qualified and unqualified labels).