upleb.uk

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

summaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md331
1 files changed, 232 insertions, 99 deletions
diff --git a/README.md b/README.md
index 94e945c..dd2e812 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,21 @@
1# NIPs 1# NIPs
2 2
3NIPs stand for **Nostr Implementation Possibilities**. 3NIPs stand for **Nostr Implementation Possibilities**.
4
4They exist to document what may be implemented by [Nostr](https://github.com/nostr-protocol/nostr)-compatible _relay_ and _client_ software. 5They exist to document what may be implemented by [Nostr](https://github.com/nostr-protocol/nostr)-compatible _relay_ and _client_ software.
5 6
6--- 7---
7 8
8- [List](#list) 9- [List](#list)
9- [Event Kinds](#event-kinds) 10- [Event Kinds](#event-kinds)
10 - [Event Kind Ranges](#event-kind-ranges)
11- [Message Types](#message-types) 11- [Message Types](#message-types)
12 - [Client to Relay](#client-to-relay) 12 - [Client to Relay](#client-to-relay)
13 - [Relay to Client](#relay-to-client) 13 - [Relay to Client](#relay-to-client)
14- [Standardized Tags](#standardized-tags) 14- [Standardized Tags](#standardized-tags)
15- [Criteria for acceptance of NIPs](#criteria-for-acceptance-of-nips) 15- [Criteria for acceptance of NIPs](#criteria-for-acceptance-of-nips)
16- [Is this repository a centralizing factor?](#is-this-repository-a-centralizing-factor)
17- [How this repository works](#how-this-repository-works)
18- [Breaking Changes](#breaking-changes)
16- [License](#license) 19- [License](#license)
17 20
18--- 21---
@@ -20,9 +23,9 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
20## List 23## List
21 24
22- [NIP-01: Basic protocol flow description](01.md) 25- [NIP-01: Basic protocol flow description](01.md)
23- [NIP-02: Contact List and Petnames](02.md) 26- [NIP-02: Follow List](02.md)
24- [NIP-03: OpenTimestamps Attestations for Events](03.md) 27- [NIP-03: OpenTimestamps Attestations for Events](03.md)
25- [NIP-04: Encrypted Direct Message](04.md) 28- [NIP-04: Encrypted Direct Message](04.md) --- **unrecommended**: deprecated in favor of [NIP-17](17.md)
26- [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md) 29- [NIP-05: Mapping Nostr keys to DNS-based internet identifiers](05.md)
27- [NIP-06: Basic key derivation from mnemonic seed phrase](06.md) 30- [NIP-06: Basic key derivation from mnemonic seed phrase](06.md)
28- [NIP-07: `window.nostr` capability for web browsers](07.md) 31- [NIP-07: `window.nostr` capability for web browsers](07.md)
@@ -30,85 +33,173 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
30- [NIP-09: Event Deletion](09.md) 33- [NIP-09: Event Deletion](09.md)
31- [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md) 34- [NIP-10: Conventions for clients' use of `e` and `p` tags in text events](10.md)
32- [NIP-11: Relay Information Document](11.md) 35- [NIP-11: Relay Information Document](11.md)
33- [NIP-12: Generic Tag Queries](12.md)
34- [NIP-13: Proof of Work](13.md) 36- [NIP-13: Proof of Work](13.md)
35- [NIP-14: Subject tag in text events.](14.md) 37- [NIP-14: Subject tag in text events](14.md)
36- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md) 38- [NIP-15: Nostr Marketplace (for resilient marketplaces)](15.md)
37- [NIP-16: Event Treatment](16.md) 39- [NIP-17: Private Direct Messages](17.md)
38- [NIP-18: Reposts](18.md) 40- [NIP-18: Reposts](18.md)
39- [NIP-19: bech32-encoded entities](19.md) 41- [NIP-19: bech32-encoded entities](19.md)
40- [NIP-20: Command Results](20.md) 42- [NIP-21: `nostr:` URI scheme](21.md)
41- [NIP-21: `nostr:` URL scheme](21.md)
42- [NIP-22: Event `created_at` Limits](22.md)
43- [NIP-23: Long-form Content](23.md) 43- [NIP-23: Long-form Content](23.md)
44- [NIP-24: Extra metadata fields and tags](24.md)
44- [NIP-25: Reactions](25.md) 45- [NIP-25: Reactions](25.md)
45- [NIP-26: Delegated Event Signing](26.md) 46- [NIP-26: Delegated Event Signing](26.md)
46- [NIP-27: Text Note References](27.md) 47- [NIP-27: Text Note References](27.md)
47- [NIP-28: Public Chat](28.md) 48- [NIP-28: Public Chat](28.md)
48- [NIP-33: Parameterized Replaceable Events](33.md) 49- [NIP-29: Relay-based Groups](29.md)
50- [NIP-30: Custom Emoji](30.md)
51- [NIP-31: Dealing with Unknown Events](31.md)
52- [NIP-32: Labeling](32.md)
53- [NIP-34: `git` stuff](34.md)
54- [NIP-35: Torrents](35.md)
49- [NIP-36: Sensitive Content](36.md) 55- [NIP-36: Sensitive Content](36.md)
56- [NIP-38: User Statuses](38.md)
50- [NIP-39: External Identities in Profiles](39.md) 57- [NIP-39: External Identities in Profiles](39.md)
51- [NIP-40: Expiration Timestamp](40.md) 58- [NIP-40: Expiration Timestamp](40.md)
52- [NIP-42: Authentication of clients to relays](42.md) 59- [NIP-42: Authentication of clients to relays](42.md)
60- [NIP-44: Versioned Encryption](44.md)
53- [NIP-45: Counting results](45.md) 61- [NIP-45: Counting results](45.md)
54- [NIP-46: Nostr Connect](46.md) 62- [NIP-46: Nostr Connect](46.md)
55- [NIP-47: Wallet Connect](47.md) 63- [NIP-47: Wallet Connect](47.md)
56- [NIP-50: Keywords filter](50.md) 64- [NIP-48: Proxy Tags](48.md)
65- [NIP-49: Private Key Encryption](49.md)
66- [NIP-50: Search Capability](50.md)
57- [NIP-51: Lists](51.md) 67- [NIP-51: Lists](51.md)
68- [NIP-52: Calendar Events](52.md)
69- [NIP-53: Live Activities](53.md)
70- [NIP-54: Wiki](54.md)
71- [NIP-55: Android Signer Application](55.md)
58- [NIP-56: Reporting](56.md) 72- [NIP-56: Reporting](56.md)
59- [NIP-57: Lightning Zaps](57.md) 73- [NIP-57: Lightning Zaps](57.md)
60- [NIP-58: Badges](58.md) 74- [NIP-58: Badges](58.md)
75- [NIP-59: Gift Wrap](59.md)
61- [NIP-65: Relay List Metadata](65.md) 76- [NIP-65: Relay List Metadata](65.md)
77- [NIP-70: Protected Events](70.md)
78- [NIP-71: Video Events](71.md)
79- [NIP-72: Moderated Communities](72.md)
80- [NIP-75: Zap Goals](75.md)
62- [NIP-78: Application-specific data](78.md) 81- [NIP-78: Application-specific data](78.md)
82- [NIP-84: Highlights](84.md)
83- [NIP-89: Recommended Application Handlers](89.md)
84- [NIP-90: Data Vending Machines](90.md)
85- [NIP-92: Media Attachments](92.md)
63- [NIP-94: File Metadata](94.md) 86- [NIP-94: File Metadata](94.md)
87- [NIP-96: HTTP File Storage Integration](96.md)
88- [NIP-98: HTTP Auth](98.md)
89- [NIP-99: Classified Listings](99.md)
64 90
65## Event Kinds 91## Event Kinds
92| kind | description | NIP |
93| ------------- | -------------------------- | ------------------------ |
94| `0` | User Metadata | [01](01.md) |
95| `1` | Short Text Note | [01](01.md) |
96| `2` | Recommend Relay | 01 (deprecated) |
97| `3` | Follows | [02](02.md) |
98| `4` | Encrypted Direct Messages | [04](04.md) |
99| `5` | Event Deletion | [09](09.md) |
100| `6` | Repost | [18](18.md) |
101| `7` | Reaction | [25](25.md) |
102| `8` | Badge Award | [58](58.md) |
103| `9` | Group Chat Message | [29](29.md) |
104| `10` | Group Chat Threaded Reply | [29](29.md) |
105| `11` | Group Thread | [29](29.md) |
106| `12` | Group Thread Reply | [29](29.md) |
107| `13` | Seal | [59](59.md) |
108| `14` | Direct Message | [17](17.md) |
109| `16` | Generic Repost | [18](18.md) |
110| `40` | Channel Creation | [28](28.md) |
111| `41` | Channel Metadata | [28](28.md) |
112| `42` | Channel Message | [28](28.md) |
113| `43` | Channel Hide Message | [28](28.md) |
114| `44` | Channel Mute User | [28](28.md) |
115| `818` | Merge Requests | [54](54.md) |
116| `1021` | Bid | [15](15.md) |
117| `1022` | Bid confirmation | [15](15.md) |
118| `1040` | OpenTimestamps | [03](03.md) |
119| `1059` | Gift Wrap | [59](59.md) |
120| `1063` | File Metadata | [94](94.md) |
121| `1311` | Live Chat Message | [53](53.md) |
122| `1617` | Patches | [34](34.md) |
123| `1621` | Issues | [34](34.md) |
124| `1622` | Replies | [34](34.md) |
125| `1630`-`1633` | Status | [34](34.md) |
126| `1971` | Problem Tracker | [nostrocket][nostrocket] |
127| `1984` | Reporting | [56](56.md) |
128| `1985` | Label | [32](32.md) |
129| `2003` | Torrent | [35](35.md) |
130| `2004` | Torrent Comment | [35](35.md) |
131| `2022` | Coinjoin Pool | [joinstr][joinstr] |
132| `4550` | Community Post Approval | [72](72.md) |
133| `5000`-`5999` | Job Request | [90](90.md) |
134| `6000`-`6999` | Job Result | [90](90.md) |
135| `7000` | Job Feedback | [90](90.md) |
136| `9000`-`9030` | Group Control Events | [29](29.md) |
137| `9041` | Zap Goal | [75](75.md) |
138| `9734` | Zap Request | [57](57.md) |
139| `9735` | Zap | [57](57.md) |
140| `9802` | Highlights | [84](84.md) |
141| `10000` | Mute list | [51](51.md) |
142| `10001` | Pin list | [51](51.md) |
143| `10002` | Relay List Metadata | [65](65.md) |
144| `10003` | Bookmark list | [51](51.md) |
145| `10004` | Communities list | [51](51.md) |
146| `10005` | Public chats list | [51](51.md) |
147| `10006` | Blocked relays list | [51](51.md) |
148| `10007` | Search relays list | [51](51.md) |
149| `10009` | User groups | [51](51.md), [29](29.md) |
150| `10015` | Interests list | [51](51.md) |
151| `10030` | User emoji list | [51](51.md) |
152| `10050` | Relay list to receive DMs | [17](17.md) |
153| `10096` | File storage server list | [96](96.md) |
154| `13194` | Wallet Info | [47](47.md) |
155| `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] |
156| `22242` | Client Authentication | [42](42.md) |
157| `23194` | Wallet Request | [47](47.md) |
158| `23195` | Wallet Response | [47](47.md) |
159| `24133` | Nostr Connect | [46](46.md) |
160| `27235` | HTTP Auth | [98](98.md) |
161| `30000` | Follow sets | [51](51.md) |
162| `30001` | Generic lists | [51](51.md) |
163| `30002` | Relay sets | [51](51.md) |
164| `30003` | Bookmark sets | [51](51.md) |
165| `30004` | Curation sets | [51](51.md) |
166| `30005` | Video sets | [51](51.md) |
167| `30008` | Profile Badges | [58](58.md) |
168| `30009` | Badge Definition | [58](58.md) |
169| `30015` | Interest sets | [51](51.md) |
170| `30017` | Create or update a stall | [15](15.md) |
171| `30018` | Create or update a product | [15](15.md) |
172| `30019` | Marketplace UI/UX | [15](15.md) |
173| `30020` | Product sold as an auction | [15](15.md) |
174| `30023` | Long-form Content | [23](23.md) |
175| `30024` | Draft Long-form Content | [23](23.md) |
176| `30030` | Emoji sets | [51](51.md) |
177| `30063` | Release artifact sets | [51](51.md) |
178| `30078` | Application-specific Data | [78](78.md) |
179| `30311` | Live Event | [53](53.md) |
180| `30315` | User Statuses | [38](38.md) |
181| `30402` | Classified Listing | [99](99.md) |
182| `30403` | Draft Classified Listing | [99](99.md) |
183| `30617` | Repository announcements | [34](34.md) |
184| `30818` | Wiki article | [54](54.md) |
185| `30819` | Redirects | [54](54.md) |
186| `31890` | Feed | [NUD: Custom Feeds](https://wikifreedia.xyz/cip-01/97c70a44366a6535c1) |
187| `31922` | Date-Based Calendar Event | [52](52.md) |
188| `31923` | Time-Based Calendar Event | [52](52.md) |
189| `31924` | Calendar | [52](52.md) |
190| `31925` | Calendar Event RSVP | [52](52.md) |
191| `31989` | Handler recommendation | [89](89.md) |
192| `31990` | Handler information | [89](89.md) |
193| `34235` | Video Event | [71](71.md) |
194| `34236` | Short-form Portrait Video Event | [71](71.md) |
195| `34237` | Video View Event | [71](71.md) |
196| `34550` | Community Definition | [72](72.md) |
197| `39000-9` | Group metadata events | [29](29.md) |
66 198
67| kind | description | NIP | 199[NUD: Custom Feeds]: https://wikifreedia.xyz/cip-01/97c70a44366a6535c1
68| ------- | -------------------------- | ----------- | 200[nostrocket]: https://github.com/nostrocket/NIPS/blob/main/Problems.md
69| `0` | Metadata | [1](01.md) | 201[lnpub]: https://github.com/shocknet/Lightning.Pub/blob/master/proto/autogenerated/client.md
70| `1` | Short Text Note | [1](01.md) | 202[joinstr]: https://gitlab.com/1440000bytes/joinstr/-/blob/main/NIP.md
71| `2` | Recommend Relay | [1](01.md) |
72| `3` | Contacts | [2](02.md) |
73| `4` | Encrypted Direct Messages | [4](04.md) |
74| `5` | Event Deletion | [9](09.md) |
75| `6` | Reposts | [18](18.md) |
76| `7` | Reaction | [25](25.md) |
77| `8` | Badge Award | [58](58.md) |
78| `40` | Channel Creation | [28](28.md) |
79| `41` | Channel Metadata | [28](28.md) |
80| `42` | Channel Message | [28](28.md) |
81| `43` | Channel Hide Message | [28](28.md) |
82| `44` | Channel Mute User | [28](28.md) |
83| `1063` | File Metadata | [94](94.md) |
84| `1984` | Reporting | [56](56.md) |
85| `9734` | Zap Request | [57](57.md) |
86| `9735` | Zap | [57](57.md) |
87| `10000` | Mute List | [51](51.md) |
88| `10001` | Pin List | [51](51.md) |
89| `10002` | Relay List Metadata | [65](65.md) |
90| `13194` | Wallet Info | [47](47.md) |
91| `22242` | Client Authentication | [42](42.md) |
92| `23194` | Wallet Request | [47](47.md) |
93| `23195` | Wallet Response | [47](47.md) |
94| `24133` | Nostr Connect | [46](46.md) |
95| `30000` | Categorized People List | [51](51.md) |
96| `30001` | Categorized Bookmark List | [51](51.md) |
97| `30008` | Profile Badges | [58](58.md) |
98| `30009` | Badge Definition | [58](58.md) |
99| `30017` | Create or update a stall | [15](15.md) |
100| `30018` | Create or update a product | [15](15.md) |
101| `30023` | Long-form Content | [23](23.md) |
102| `30078` | Application-specific Data | [78](78.md) |
103
104### Event Kind Ranges
105
106| range | description | NIP |
107| ---------------- | -------------------------------- | ----------- |
108| `1000`--`9999` | Regular Events | [16](16.md) |
109| `10000`--`19999` | Replaceable Events | [16](16.md) |
110| `20000`--`29999` | Ephemeral Events | [16](16.md) |
111| `30000`--`39999` | Parameterized Replaceable Events | [33](33.md) |
112 203
113## Message types 204## Message types
114 205
@@ -116,69 +207,111 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
116 207
117| type | description | NIP | 208| type | description | NIP |
118| ------- | --------------------------------------------------- | ----------- | 209| ------- | --------------------------------------------------- | ----------- |
210| `EVENT` | used to publish events | [01](01.md) |
211| `REQ` | used to request events and subscribe to new updates | [01](01.md) |
212| `CLOSE` | used to stop previous subscriptions | [01](01.md) |
119| `AUTH` | used to send authentication events | [42](42.md) | 213| `AUTH` | used to send authentication events | [42](42.md) |
120| `CLOSE` | used to stop previous subscriptions | [1](01.md) |
121| `COUNT` | used to request event counts | [45](45.md) | 214| `COUNT` | used to request event counts | [45](45.md) |
122| `EVENT` | used to publish events | [1](01.md) |
123| `REQ` | used to request events and subscribe to new updates | [1](01.md) |
124 215
125### Relay to Client 216### Relay to Client
126 217
127| type | description | NIP | 218| type | description | NIP |
128| -------- | ------------------------------------------------------- | ----------- | 219| -------- | ------------------------------------------------------- | ----------- |
220| `EOSE` | used to notify clients all stored events have been sent | [01](01.md) |
221| `EVENT` | used to send events requested to clients | [01](01.md) |
222| `NOTICE` | used to send human-readable messages to clients | [01](01.md) |
223| `OK` | used to notify clients if an EVENT was successful | [01](01.md) |
224| `CLOSED` | used to notify clients that a REQ was ended and why | [01](01.md) |
129| `AUTH` | used to send authentication challenges | [42](42.md) | 225| `AUTH` | used to send authentication challenges | [42](42.md) |
130| `COUNT` | used to send requested event counts to clients | [45](45.md) | 226| `COUNT` | used to send requested event counts to clients | [45](45.md) |
131| `EOSE` | used to notify clients all stored events have been sent | [1](01.md) |
132| `EVENT` | used to send events requested to clients | [1](01.md) |
133| `NOTICE` | used to send human-readable messages to clients | [1](01.md) |
134| `OK` | used to notify clients if an EVENT was successful | [20](20.md) |
135
136Please update these lists when proposing NIPs introducing new event kinds.
137
138When experimenting with kinds, keep in mind the classification introduced by [NIP-16](16.md) and [NIP-33](33.md).
139 227
140## Standardized Tags 228## Standardized Tags
141 229
142| name | value | other parameters | NIP | 230| name | value | other parameters | NIP |
143| ----------------- | ------------------------------------ | -------------------- | ------------------------ | 231| ----------------- | ------------------------------------ | ------------------------------- | ------------------------------------- |
144| `a` | coordinates to an event | relay URL | [33](33.md), [23](23.md) | 232| `e` | event id (hex) | relay URL, marker, pubkey (hex) | [01](01.md), [10](10.md) |
145| `d` | identifier | -- | [33](33.md) | 233| `p` | pubkey (hex) | relay URL, petname | [01](01.md), [02](02.md) |
146| `e` | event id (hex) | relay URL, marker | [1](01.md), [10](10.md) | 234| `a` | coordinates to an event | relay URL | [01](01.md) |
147| `g` | geohash | -- | [12](12.md) | 235| `d` | identifier | -- | [01](01.md) |
148| `i` | identity | proof | [39](39.md) | 236| `-` | -- | -- | [70](70.md) |
149| `p` | pubkey (hex) | relay URL | [1](01.md) | 237| `g` | geohash | -- | [52](52.md) |
150| `r` | a reference (URL, etc) | -- | [12](12.md) | 238| `h` | group id | -- | [29](29.md) |
151| `t` | hashtag | -- | [12](12.md) | 239| `i` | identity | proof | [39](39.md) |
152| `amount` | millisats | -- | [57](57.md) | 240| `k` | kind number (string) | -- | [18](18.md), [25](25.md), [72](72.md) |
153| `bolt11` | `bolt11` invoice | -- | [57](57.md) | 241| `l` | label, label namespace | -- | [32](32.md) |
154| `challenge` | challenge string | -- | [42](42.md) | 242| `L` | label namespace | -- | [32](32.md) |
155| `content-warning` | reason | -- | [36](36.md) | 243| `m` | MIME type | -- | [94](94.md) |
156| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) | 244| `q` | event id (hex) | relay URL | [18](18.md) |
157| `description` | badge description | -- | [58](58.md) | 245| `r` | a reference (URL, etc) | petname | [24](24.md) |
158| `description` | invoice description | -- | [57](57.md) | 246| `r` | relay url | marker | [65](65.md) |
159| `expiration` | unix timestamp (string) | -- | [40](40.md) | 247| `t` | hashtag | -- | |
160| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) | 248| `alt` | summary | -- | [31](31.md) |
161| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) | 249| `amount` | millisatoshis, stringified | -- | [57](57.md) |
162| `name` | badge name | -- | [58](58.md) | 250| `bolt11` | `bolt11` invoice | -- | [57](57.md) |
163| `nonce` | random | -- | [13](13.md) | 251| `challenge` | challenge string | -- | [42](42.md) |
164| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) | 252| `client` | name, address | relay URL | [89](89.md) |
165| `published_at` | unix timestamp (string) | -- | [23](23.md) | 253| `clone` | git clone URL | -- | [34](34.md) |
166| `relay` | relay url | -- | [42](42.md) | 254| `content-warning` | reason | -- | [36](36.md) |
167| `relays` | relay list | -- | [57](57.md) | 255| `delegation` | pubkey, conditions, delegation token | -- | [26](26.md) |
168| `subject` | subject | -- | [14](14.md) | 256| `description` | description | -- | [34](34.md), [57](57.md), [58](58.md) |
169| `summary` | article summary | -- | [23](23.md) | 257| `emoji` | shortcode, image URL | -- | [30](30.md) |
170| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) | 258| `encrypted` | -- | -- | [90](90.md) |
171| `title` | article title | -- | [23](23.md) | 259| `expiration` | unix timestamp (string) | -- | [40](40.md) |
172| `zap` | profile name | type of value | [57](57.md) | 260| `goal` | event id (hex) | relay URL | [75](75.md) |
261| `image` | image URL | dimensions in pixels | [23](23.md), [58](58.md) |
262| `imeta` | inline metadata | -- | [92](92.md) |
263| `lnurl` | `bech32` encoded `lnurl` | -- | [57](57.md) |
264| `location` | location string | -- | [52](52.md), [99](99.md) |
265| `name` | name | -- | [34](34.md), [58](58.md) |
266| `nonce` | random | difficulty | [13](13.md) |
267| `preimage` | hash of `bolt11` invoice | -- | [57](57.md) |
268| `price` | price | currency, frequency | [99](99.md) |
269| `proxy` | external ID | protocol | [48](48.md) |
270| `published_at` | unix timestamp (string) | -- | [23](23.md) |
271| `relay` | relay url | -- | [42](42.md), [17](17.md) |
272| `relays` | relay list | -- | [57](57.md) |
273| `server` | file storage server url | -- | [96](96.md) |
274| `subject` | subject | -- | [14](14.md), [17](17.md) |
275| `summary` | article summary | -- | [23](23.md) |
276| `thumb` | badge thumbnail | dimensions in pixels | [58](58.md) |
277| `title` | article title | -- | [23](23.md) |
278| `web` | webpage URL | -- | [34](34.md) |
279| `zap` | pubkey (hex), relay URL | weight | [57](57.md) |
280
281Please update these lists when proposing new NIPs.
173 282
174## Criteria for acceptance of NIPs 283## Criteria for acceptance of NIPs
175 284
1761. They should be implemented in at least two clients and one relay -- when applicable. 2851. They should be fully implemented in at least two clients and one relay -- when applicable.
1772. They should make sense. 2862. They should make sense.
1783. They should be optional and backwards-compatible: care must be taken such that clients and relays that choose to not implement them do not stop working when interacting with the ones that choose to. 2873. They should be optional and backwards-compatible: care must be taken such that clients and relays that choose to not implement them do not stop working when interacting with the ones that choose to.
1794. There should be no more than one way of doing the same thing. 2884. There should be no more than one way of doing the same thing.
1805. Other rules will be made up when necessary. 2895. Other rules will be made up when necessary.
181 290
291## Is this repository a centralizing factor?
292
293To promote interoperability, we standards that everybody can follow, and we need them to define a **single way of doing each thing** without ever hurting **backwards-compatibility**, and for that purpose there is no way around getting everybody to agree on the same thing and keep a centralized index of these standards. However the fact that such index exists doesn't hurt the decentralization of Nostr. _At any point the central index can be challenged if it is failing to fulfill the needs of the protocol_ and it can migrate to other places and be maintained by other people.
294
295It can even fork into multiple and then some clients would go one way, others would go another way, and some clients would adhere to both competing standards. This would hurt the simplicity, openness and interoperability of Nostr a little, but everything would still work in the short term.
296
297There is a list of notable Nostr software developers who have commit access to this repository, but that exists mostly for practical reasons, as by the nature of the thing we're dealing with the repository owner can revoke membership and rewrite history as they want -- and if these actions are unjustified or perceived as bad or evil the community must react.
298
299## How this repository works
300
301Standards may emerge in two ways: the first way is that someone starts doing something, then others copy it; the second way is that someone has an idea of a new standard that could benefit multiple clients and the protocol in general without breaking **backwards-compatibility** and the principle of having **a single way of doing things**, then they write that idea and submit it to this repository, other interested parties read it and give their feedback, then once most people reasonably agree we codify that in a NIP which client and relay developers that are interested in the feature can proceed to implement.
302
303These two ways of standardizing things are supported by this repository. Although the second is preferred, an effort will be made to codify standards emerged outside this repository into NIPs that can be later referenced and easily understood and implemented by others -- but obviously as in any human system discretion may be applied when standards are considered harmful.
304
305## Breaking Changes
306
307[Breaking Changes](BREAKING.md)
308
182## License 309## License
183 310
184All NIPs are public domain. 311All NIPs are public domain.
312
313## Contributors
314
315<a align="center" href="https://github.com/nostr-protocol/nips/graphs/contributors">
316 <img src="https://contrib.rocks/image?repo=nostr-protocol/nips" />
317</a>