NIP-172 ======= Moderated Communities (Reddit Style) ------------------------------------ `draft` `optional` `author:vitorpamplona` The goal of this NIP is to create moderator-approved public communities around a topic. It defines the replaceable event `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 an `a` tag. Moderators issue an approval event `34551` 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", "", "WidthxHeight"] //.. other tags relevant to defining the community // moderators ["p", "<32-bytes hex of a pubkey>", "", "moderator"], ["p", "<32-bytes hex of a pubkey>", "", "moderator"], ["p", "<32-bytes hex of a pubkey>", "", "moderator"], // relays used by the community ["relay", "", "author"], ["relay", ""], ["relay", ""] ] } ``` # New Post Request Any Nostr event can be a post request. Clients should simply add the community's `a` tag 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 can filter all mentions of the kind-34550 event and request moderators to approve each submission. The same moderator can remove his/her approval of the post at any time. # Post Approval by moderators The post-approval event includes a stringified `new post request` event inside the `.content` of the approval (NIP-18-style). ```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": "34551", "tags": [ ["a", "34550::", ""], ["e", "", ""], ["p", "", ""], ["k", ""], ], "content": "{ }" } ``` It's recommended that multiple moderators approve posts to avoid unapproving them when a given moderator is removed from the owner's list. In case the full list of moderators must be rotated, the new moderator set must sign post-approvals for posts in the past or the community will restart. # Displaying Community clients can 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": ["", "moderator1", "moderator2", "moderator3", ...], "kinds": 34551, "#a": ["34550::"], } ```