forked from nostr-protocol/nips
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
NIP-28: Public Chat (nostr-protocol#38)
- Loading branch information
1 parent
3e0e6ca
commit 3423a6d
Showing
1 changed file
with
158 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
|
||
NIP-28 | ||
====== | ||
|
||
Public Chat | ||
----------- | ||
|
||
`draft` `optional` `author:ChristopherDavid` `author:fiatjaf` `author:jb55` `author:Cameri` | ||
|
||
This NIP defines new event kinds for public chat channels, channel messages, and basic client-side moderation. | ||
|
||
It reserves five event kinds (40-44) for immediate use and five event kinds (45-49) for future use. | ||
|
||
- `40 - channel create` | ||
- `41 - channel metadata` | ||
- `42 - channel message` | ||
- `43 - hide message` | ||
- `44 - mute user` | ||
|
||
Client-centric moderation gives client developers discretion over what types of content they want included in their apps, while imposing no additional requirements on relays. | ||
|
||
## Kind 40: Create channel | ||
|
||
Create a public chat channel. | ||
|
||
In the channel creation `content` field, Client SHOULD include basic channel metadata (`name`, `about`, `picture` as specified in kind 41). | ||
|
||
```json | ||
{ | ||
"content": "{\"name\": \"Demo Channel\", \"about\": \"A test channel.\", \"picture\": \"https://placekitten.com/200/200\"}", | ||
... | ||
} | ||
``` | ||
|
||
|
||
## Kind 41: Set channel metadata | ||
|
||
Update a channel's public metadata. | ||
|
||
Clients and relays SHOULD handle kind 41 events similar to kind 0 `metadata` events. | ||
|
||
Clients SHOULD ignore kind 41s from pubkeys other than the kind 40 pubkey. | ||
|
||
Clients SHOULD support basic metadata fields: | ||
|
||
- `name` - string - Channel name | ||
- `about` - string - Channel description | ||
- `picture` - string - URL of channel picture | ||
|
||
Clients MAY add additional metadata fields. | ||
|
||
Clients SHOULD use [NIP-10](10.md) marked "e" tags to recommend a relay. | ||
|
||
```json | ||
{ | ||
"content": "{\"name\": \"Updated Demo Channel\", \"about\": \"Updating a test channel.\", \"picture\": \"https://placekitten.com/201/201\"}", | ||
"tags": [["e", <channel_create_event_id> <relay-url>]], | ||
... | ||
} | ||
``` | ||
|
||
|
||
## Kind 42: Create channel message | ||
|
||
Send a text message to a channel. | ||
|
||
Clients SHOULD use [NIP-10](10.md) marked "e" tags to recommend a relay and specify whether it is a reply or root message. | ||
|
||
Clients SHOULD append [NIP-10](10.md) "p" tags to replies. | ||
|
||
Root message: | ||
|
||
```json | ||
{ | ||
"content": <string>, | ||
"tags": [["e", <kind_40_event_id> <relay-url> "root"]], | ||
... | ||
} | ||
``` | ||
|
||
Reply to another message: | ||
|
||
```json | ||
{ | ||
"content": <string>, | ||
"tags": [ | ||
["e", <kind_42_event_id> <relay-url> "reply"], | ||
["p", <pubkey> <relay-url>], | ||
... | ||
], | ||
... | ||
} | ||
``` | ||
|
||
|
||
## Kind 43: Hide message | ||
|
||
User no longer wants to see a certain message. | ||
|
||
The `content` may optionally include metadata such as a `reason`. | ||
|
||
Clients SHOULD hide event 42s shown to a given user, if there is an event 43 from that user matching the event 42 `id`. | ||
|
||
Clients MAY hide event 42s for other users other than the user who sent the event 43. | ||
|
||
(For example, if three users 'hide' an event giving a reason that includes the word 'pornography', a Nostr client that is an iOS app may choose to hide that message for all iOS clients.) | ||
|
||
```json | ||
{ | ||
"content": "{\"reason\": \"Dick pic\"}", | ||
"tags": [["e", <kind_42_event_id>]], | ||
... | ||
} | ||
``` | ||
|
||
## Kind 44: Mute user | ||
|
||
User no longer wants to see messages from another user. | ||
|
||
The `content` may optionally include metadata such as a `reason`. | ||
|
||
Clients SHOULD hide event 42s shown to a given user, if there is an event 44 from that user matching the event 42 `pubkey`. | ||
|
||
Clients MAY hide event 42s for users other than the user who sent the event 44. | ||
|
||
```json | ||
{ | ||
"content": "{\"reason\": \"Posting dick pics\"}", | ||
"tags": [["p", <pubkey>]], | ||
... | ||
} | ||
``` | ||
|
||
## NIP-10 relay recommendations | ||
|
||
For [NIP-10](10.md) relay recommendations, clients generally SHOULD use the relay URL of the original (oldest) kind 40 event. | ||
|
||
Clients MAY recommend any relay URL. For example, if a relay hosting the original kind 40 event for a channel goes offline, clients could instead fetch channel data from a backup relay, or a relay that clients trust more than the original relay. | ||
|
||
|
||
Future extensibility | ||
-------------------- | ||
|
||
We reserve event kinds 45-49 for other events related to chat, to potentially include new types of media (photo/video), moderation, or support of private or group messaging. | ||
|
||
|
||
Motivation | ||
---------- | ||
If we're solving censorship-resistant communication for social media, we may as well solve it also for Telegram-style messaging. | ||
|
||
We can bring the global conversation out from walled gardens into a true public square open to all. | ||
|
||
|
||
Additional info | ||
--------------- | ||
|
||
- [Chat demo PR with fiatjaf+jb55 comments](https://github.com/ArcadeCity/arcade/pull/28) | ||
- [Conversation about NIP16](https://t.me/nostr_protocol/29566) |