upleb.uk

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

summaryrefslogtreecommitdiff
path: root/54.md
diff options
context:
space:
mode:
Diffstat (limited to '54.md')
-rw-r--r--54.md121
1 files changed, 121 insertions, 0 deletions
diff --git a/54.md b/54.md
new file mode 100644
index 0000000..3a02150
--- /dev/null
+++ b/54.md
@@ -0,0 +1,121 @@
1NIP-54
2======
3
4Wiki
5----
6
7`draft` `optional`
8
9This NIP defines `kind:30818` (an _addressable event_) for descriptions (or encyclopedia entries) of particular subjects, and it's expected that multiple people will write articles about the exact same subjects, with either small variations or completely independent content.
10
11Articles are identified by lowercase, normalized ascii `d` tags.
12
13### Articles
14```json
15{
16 "content": "A wiki is a hypertext publication collaboratively edited and managed by its own audience.",
17 "tags": [
18 ["d", "wiki"],
19 ["title", "Wiki"],
20 ]
21}
22```
23
24### `d` tag normalization rules
25
26- Any non-letter character MUST be converted to a `-`.
27- All letters MUST be converted to lowercase.
28
29### Content
30
31The `content` should be Asciidoc with two extra functionalities: **wikilinks** and **nostr:...** links.
32
33Unlike normal Asciidoc links `http://example.com[]` that link to external webpages, wikilinks `[[]]` link to other articles in the wiki. In this case, the wiki is the entirety of Nostr. Clicking on a wikilink should cause the client to ask relays for events with `d` tags equal to the target of that wikilink.
34
35Wikilinks can take these two forms:
36
37 1. `[[Target Page]]` -- in this case it will link to the page `target-page` (according to `d` tag normalization rules above) and be displayed as `Target Page`;
38 2. `[[target page|see this]]` -- in this case it will link to the page `target-page`, but will be displayed as `see this`.
39
40`nostr:...` links, as per [NIP-21](21.md), should link to profiles or arbitrary Nostr events. Although it is not recommended to link to specific versions of articles -- instead the _wikilink_ syntax should be preferred, since it should be left to the reader and their client to decide what version of any given article they want to read.
41
42### Optional extra tags
43
44 - `title`: for when the display title should be different from the `d` tag.
45 - `summary`: for display in lists.
46 - `a` and `e`: for referencing the original event a wiki article was forked from.
47
48### Merge Requests
49
50Event `kind:818` represents a request to merge from a forked article into the source. It is directed to a pubkey and references the original article and the modified event.
51
52[INSERT EVENT EXAMPLE]
53
54### Redirects
55
56Event `kind:30819` is also defined to stand for "wiki redirects", i.e. if one thinks `Shell structure` should redirect to `Thin-shell structure` they can issue one of these events instead of replicating the content. These events can be used for automatically redirecting between articles on a client, but also for generating crowdsourced "disambiguation" pages ([common in Wikipedia](https://en.wikipedia.org/wiki/Help:Disambiguation)).
57
58[INSERT EVENT EXAMPLE]
59
60How to decide what article to display
61-------------------------------------
62
63As there could be many articles for each given name, some kind of prioritization must be done by clients. Criteria for this should vary between users and clients, but some means that can be used are described below:
64
65### Reactions
66
67[NIP-25](25.md) reactions are very simple and can be used to create a simple web-of-trust between wiki article writers and their content. While just counting a raw number of "likes" is unproductive, reacting to any wiki article event with a `+` can be interpreted as a recommendation for that article specifically and a partial recommendation of the author of that article. When 2 or 3-level deep recommendations are followed, suddenly a big part of all the articles may have some form of tagging.
68
69### Relays
70
71[NIP-51](51.md) lists of relays can be created with the kind 10102 and then used by wiki clients in order to determine where to query articles first and to rank these differently in relation to other events fetched from other relays.
72
73### Contact lists
74
75[NIP-02](02.md) contact lists can form the basis of a recommendation system that is then expanded with relay lists and reaction lists through nested queries. These lists form a good starting point only because they are so widespread.
76
77### Wiki-related contact lists
78
79[NIP-51](51.md) lists can also be used to create a list of users that are trusted only in the context of wiki authorship or wiki curationship.
80
81Forks
82---------
83Wiki-events can tag other wiki-events with a `fork` marker to specify that this event came from a different version. Both `a` and `e` tags SHOULD be used and have the `fork` marker applied, to identify the exact version it was forked from.
84
85Deference
86---------
87Wiki-events can tag other wiki-events with a `defer` marker to indicate that it considers someone else's entry as a "better" version of itself. If using a `defer` marker both `a` and `e` tags SHOULD be used.
88
89This is a stronger signal of trust than a `+` reaction.
90
91This marker is useful when a user edits someone else's entry; if the original author includes the editor's changes and the editor doesn't want to keep/maintain an independent version, the `link` tag could effectively be a considered a "deletion" of the editor's version and putting that pubkey's WoT weight behind the original author's version.
92
93Why Asciidoc?
94-------------
95
96Wikitext is [garbage](nostr:nevent1qqsqt0gcggry60n72uglhuhypdlmr2dm6swjj69jex5v530gcpazlzsprpmhxue69uhhyetvv9ujumn0wdmksetjv5hxxmmdqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hsygpm7rrrljungc6q0tuh5hj7ue863q73qlheu4vywtzwhx42a7j9n5ueneex) and Markdown is not powerful enough (besides being too freeform and unspecified and prone to generate incompatibilities in the future).
97
98Asciidoc has a strict spec, multiple implementations in many languages, and support for features that are very much necessary in a wiki article, like _sidebars_, _tables_ (with rich markup inside cells), many levels of _headings_, _footnotes_, _superscript_ and _subscript_ markup and _description lists_. It is also arguably easier to read in its plaintext format than Markdown (and certainly much better than Wikitext).
99
100# Appendix 1: Merge requests
101Users can request other users to get their entries merged into someone else's entry by creating a `kind:818` event.
102
103```json
104{
105 "content": "I added information about how to make hot ice-creams",
106 "kind": 818,
107 "tags": [
108 [ "a", "30818:<destination-pubkey>:hot-ice-creams", "<relay-url>" ],
109 [ "e", "<version-against-which-the-modification-was-made>", "<relay-url>" ],
110 [ "p", "<destination-pubkey>" ],
111 [ "e", "<version-to-be-merged>", "<relay-url>", "source" ]
112 ]
113}
114```
115
116`.content`: an optional explanation detailing why this merge is being requested.
117`a` tag: tag of the article which should be modified (i.e. the target of this merge request).
118`e` tag: optional version of the article in which this modifications is based
119`e` tag with `source` marker: the ID of the event that should be merged. This event id MUST be of a `kind:30818` as defined in this NIP.
120
121The destination-pubkey is the pubkey being requested to merge something into their article can create [[NIP-25]] reactions that tag the `kind:818` event with `+` or `-`