NIP-172 ======= Moderated Communities (Reddit Style) ------------------------------------ `draft` `optional` `author:vitorpamplona` `author:arthurfranca` The goal of this NIP is to create moderator-approved public communities around a topic. It defines the replaceable event `kind:34550` to define the community and the current list of moderators/administrators. Users that want to post into the community, simply tag any Nostr event with the community's `a` tag (See [NIP-33](33.md)). Moderators issue an approval event `kind:4550` that links the community with the new post. # Community Definition `Kind:34550` SHOULD include any field that helps define the community and the set of moderators. ```js { "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>", "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>", "created_at": "", "kind": 34550, "tags": [ ["d", ""], ["description", ""], ["image", "", "x"], //.. other tags relevant to defining the community // moderators ["p", "<32-bytes hex of a pubkey1>", "", "moderator"], ["p", "<32-bytes hex of a pubkey2>", "", "moderator"], ["p", "<32-bytes hex of a pubkey3>", "", "moderator"], // relays used by the community ["relay", "", "author"], ["relay", ""], ["relay", ""] ] } ``` # New Post Request Any Nostr event can be a post request. Clients MUST add the community's `a` tag to the new post event in order to be presented for the moderator's approval. ```js { "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>", "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>", "created_at": "", "kind": 1, "tags": [ ["a", "34550::", ""], ], "content": "" } ``` Community management clients MAY filter all mentions to a given `kind:34550` event and request moderators to approve each submission. Moderators MAY delete his/her approval of a post at any time using event deletions (See [NIP-09](09.md)). # Post Approval by moderators The post-approval event SHOULD include a stringified `new post request` event inside the `.content` of the approval ([NIP-18-style](18.md)). ```js { "id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>", "pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>", "created_at": "", "kind": "4550", "tags": [ ["a", "34550::", ""], ["e", "", ""], ["p", "", ""], ["k", ""], ], "content": "" } ``` It's recommended that multiple moderators approve posts to avoid deleting them from the community when a moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign new approvals for posts in the past or the community will restart. The owner can also periodically copy and re-sign of each moderator's approval events to make sure posts don't dissapear with moderators. # Displaying Community clients SHOULD display posts that have been approved by at least 1 moderator or by the community owner. The following filter displays the approved posts. ```js { "authors": ["", "", "", "", ...], "kinds": [4550], "#a": ["34550::"], } ``` Clients MAY hide approvals by blocked moderators at the user's request.