-
Notifications
You must be signed in to change notification settings - Fork 598
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NIP-72: Moderated communities #602
NIP-72: Moderated communities #602
Conversation
hum... this can be used by anyone to do content curation by topic. hah.. interesting... A moderator can add any existing nostr event into the topic (there is no need for the post request). |
what if this was done through nip 51 lists... so any client that has "add to list" can be a place for currating... even if it doesn't format the lists as groups? |
Lists don't work well with lots of items. These communities might have millions of posts each. |
Is/can poster submit to just < d-identifier of the community > (/bitcoin) or poster is separately submitting to /vitor/bitcoin & /bob/bitcoin ? Contrary to my last comment: Or both, what if I want to avoid /bob/bitcoin by submitting just to /vitor/bitcoin. I think it's a very different thing than Reddit like behavior if it doesn't need a submit sig to either the identifier or the pubkey/identifier |
On Reddit, your topic owner is less visible but you are still fully dependent on his/her decisions. On Nostr, hopefully, we add more weight to the choice of owner. I think clearer is better. But we lose the single topic handle (for the good and for the bad) |
Did you get a chance to look at NIP-29 #566 ? Similar concept but we moved some authority functions to the relay. I am working on a demo now and should be ready by end of this week. You will not be able to achieve full moderation from client side. Control on the relay side actually makes is easier like centralized systems. However, you are not stuck to one relay, the group admins can move them to a different relay anytime with history and group members or even have it on 2 relays at the same time. Best of both worlds...! Let me know your thoughts. |
Thanks a lot for starting this thread 🙏 I just took a quick glance at the proposal. Not sure if someone already brought this point up. There is value in the "communities" aspect irrespective of whether it is moderated or not. There may be a team managing the community but they may not actively moderate or approve posts too. We could think about a way to make moderation optional too Will look at the proposal fully and add comments today. |
Yep, we looked at relays as the source of control. It's not ideal as they can also block exporting a community out of them. It creates similar issues Mastodon has. On NIP-172, users can use any relay they want to host their communities. They can spread it far and wide. Relays cannot do anything to stop a community from developing. NIP-29 works great for company workspaces but it's not ideal (too centralizing) for Reddit-style topics. |
This is very much like NIP-28, but for generic things instead of just chat. |
Kind of. The difference is the moderator list (28 doesn't have it) and the fact that is positive (every post is reviewed) as opposed to negative (hide all by a user). So, instead of clients having to download everything and then filter out the hidden messages/users (which is a bigger set than actual posts these days for some chats), clients can just download the approved content with a direct filter. |
Very good! I see the moderator list has optional recommended relays. I imagine it would be easier for client logic (both user and moderator client) if this is just for profile metadata (kind 0) so to not rely on NIP-65 config from multiple people (author and mods) to know where to post "New Post Requests" and fetch "Post Approval by moderators". What do you think of adding this: {
kind": "34550",
...,
tags: [
..., // d, description and moderators
// "relay" tag is used on NIP-42
["relay", "<relay hosting author kind 0>", "author"],
["relay", "<relay where to post requests to and fetch approvals from>"], // not "r" so to not index
["relay", "<relay where to post requests to and fetch approvals from>"]
]
} or maybe better this: {
kind": "34550",
...,
tags: [
..., // d, description and moderators
["author_relay", "<relay hosting author kind 0>"],
// "relays" tag is used on NIP-57
["relays", "<relay 1 where to post requests to and fetch approvals from>", "<relay 2 where to post requests to and fetch approvals from>"]
]
} |
@arthurfranca relays added. :) |
The problem I see (and hey, maybe it's a feature) is that clients don't have any way to avoid requesting notes posted to a community, since any kind can be used normally, and there are no negative filters (don't give me anything with an There are a number of problems solved by that NIP. For example, you can post any kind to a group by wrapping it; you can then moderate by un-wrapping and re-wrapping as a moderator. This keeps the original content of the event intact, but allows different special purpose channels to exist. TL;DR, NACK on this NIP, I'd like to see it folded into #468 and/or #580 by making encryption optional. |
So, similar to the issue of clients not being able to request only non-reply kind-1s, right? I agree it's a pain. I am not sure if wrapping is a good solution for that. Otherwise, we might get to a point where everything is wrapped. Somebody could duplicate kind 1 (like nip-28 channel messages) if people wanted a kind that does not show up in the timeline. |
I prefer wrapping to duplication (nip 28 was a mistake), since you get to keep all the same tools you use for regular nostr, with just an extra utility to unwrap. I think wrapping will be very easy to add support for, and it supports basically infinite use cases (anywhere where you want a different signature, or selective metadata). |
What about pushing for this addition: I suspect relay databases won't have a hard time storing and indexing one-letter tag occurence count. |
We shouldn't push core changes in an ad-hoc way. Adoption of that syntax may take months to get implemented (cf COUNT, AUTH). Can we solve this problem using the tools we already have?
I'm ok with this. But we won't wrap everything, because non-wrapped notes are already the standard, and imply "public, broadcast". Wrapping makes sense for relay-agnostic sub-networks: public group post; private group post, public DM, private DM. Wrapping could even remove the need for many existing kinds, and reduce the number of primitives clients have to implement. I.e., people are already zapping and quoting DMs, what if DMs, kind 42s, and kind 1s worked exactly the same way and could be cross published between scopes (private, group, public)? Clients would only have to special case the user's ability to decrypt a given message, and you would automatically have much richer content available in non-kind 1 contexts. Maybe this is not the place to hash out wrapping, but the more I think about it, the more it makes sense. |
Adds kind to the post approval. Co-authored-by: arthurfranca <arthur.a.franca@gmail.com>
🚀️ |
Voting has little chance of success in nostr where anyone can generate a public key. |
@vitorpamplona is there a way to avoid getting community notes in a filter? In the current form, it seems like |
On the concern of scalability with the requirement for approvals: With multiple approvers, these could also take roles such that automatic approval would not result in all getting the message. For example with levels. Group members only see level 5 approved content by default. Moderators (and users of course) can choose to see level 1 and above, with bots giving level 1 approval. Then it's also less dangerous to grant level 2 or 3 approval permission lightly. The founder/owner could be level 10 with moderators by default being level 5 etc. So for example:
|
Why should we put the responsibility on bots for auto approval though? Shouldn't we just add some moderation functionality to the relays? If the user doesn't like the moderation of the relay they can just switch relays. |
Not on bots, but on Community Management clients. Relay operators do not have the knowledge of each of their Communities' topics to moderate them correctly. And forcing each community owner to also run a Relay is unnecessary. This proposal splits the moderation responsibilities between relay operators and moderators to help decentralize the power granted by users of such activities. If a relay is moderating too much or not enough, community owners can take their community elsewhere. If moderators are doing a bad job, any other person can close the community and start doing a better job. Relays operators don't get additional responsibilities. |
What do you mean any person can close the community? Could you describe that more?
so you might have a service running with a public key that is a "moderator" that is scanning for new community post. It auto approves new post? that is like a bot to me but might work . how would banned users work? |
Sorry. I meant cloNe the community.
You could have a client that implements a NIP51 list of people with auto-approval status into the community. Or the opposite, a list of people that the client will always reject. More importantly, the same client can then provide tools for users to review what the bot is doing. As @Giszmo said, you can have multiple layers of approvals before you get into the community. My point is that none of that needs to be part of this NIP. It can all be developed organically as we move forward. |
Might I ask, how would a user discover new communities? How would the experience be if there were multiple communities with the same name? What if I the user wanted to get all the post from community "Mustang" ran by moderators:[1346432,3957820] and also community "Mustang" ran by the other moderators[096866432,09788604] who disagreed with moderators [1346432,3957820] about something trivial? I feel like if a community was just a name then a user could pull post from that name from as many relays as they wanted. But if you make a community like this you are going to get lots of over lap. 15 pics communities all with only a few users and their approval bots would all work differently. Just trying to understand the flow here. |
Clients have this magic thing of filtering and/or sorting by the number of posts, authors of those posts, follows, zaps, reactions, reports, citations, bookmarks, geolocations, and other kinds. Some of us can even run emotion extraction engines to select only happy communities. :)
You can definitely do that. There are no ties to any relays or any protections from copying it. You can even get all the approved content AND the non-approved ones and then approve everything yourself. I don't think a lot of people will follow you on that journey, but you can do that.
We will. And the bigger the overlap we get, the better curation will work (from a user's side). You don't need to follow just one Bitcoin community. You can follow all of them. And if the same post gets in all of them, it means that it is really good and should definitely be seen by you. |
I like it. Thanks |
172.md
Outdated
|
||
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. | ||
|
||
Replaceable events can be submitted for approval in two ways: (i) by their `e` tag if moderators want to approve each individual change to the repleceable event or (ii) by the `a` tag if the moderator trusts the original post author to not modify the event beyond community rules. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a third interesting option here to approve by both the a
and e
tag. This gives the benefit of ii but would also allow the client and moderation tools to easily flag replaceable events that have changed since approval without losing the connection to the community immediately. An alternative wording that could describe this:
Replaceable events can be submitted for approval in two ways: (i) by their `e` tag if moderators want to approve each individual change to the repleceable event or (ii) by the `a` tag if the moderator trusts the original post author to not modify the event beyond community rules. | |
Post-approval for replaceable events MAY include an `a` tag in place of or in addition to the `e` tag to ensure that the event remains connected to a moderated community after being edited. Clients SHOULD indicate that replaceable events with an approval on the `a` tag, but a conflicting `e` tag have been edited after approval. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point, but we might need to spell that out as a third (preferred?) option
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That makes sense. Something like this?
Replaceable events can be submitted for approval in two ways: (i) by their `e` tag if moderators want to approve each individual change to the repleceable event or (ii) by the `a` tag if the moderator trusts the original post author to not modify the event beyond community rules. | |
Post-approval for replaceable events can be submitted in three ways (i) by their `e` tag if moderators want to approve each individual change to the replaceable event, (ii) by the `a` tag if the moderator trusts the original post author to not modify the event beyond community rules, or (iii) preferably with both the `a` and `e` tag so that clients can indicate if a post has been edited since approval. |
Reasoning for changing that first line was that I had some confusion initially reading the spec whether it was the original post or the moderator approval post that these rules applied to. It is of course obvious once you understand the spec.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just committed a change as well. See if you like it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@vitorpamplona your latest changes LGTM!
["relay", "<relay hosting author kind 0>", "author"], | ||
["relay", "<relay where to send and receive requests>", "requests"], | ||
["relay", "<relay where to send and receive approvals>", "approvals"], | ||
["relay", "<relay where to post requests to and fetch approvals from>"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here, Can we add an 'optional' tag suggestion like this 👇
//optional information while forking a community from an existing one
["forksource", "34550:<source community event author pubkey>:<d-identifier of the source community>", "<Optional relay url of source community>"]
This would provide a clean mechanism for
- Any client to show unmoderated feeds for 'forked communities' based on the user preferences [This is not possible without this additional information]. Client can simply follow the 'forksource' tag and show the events from old community, before the timestamp of forking.
- Ability to see how many people have forked my community. This creates a very similar feeling of joy when someone creates a fork of my open-source repo. This provides motivation for moderators to create a quality community.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
how do you know the time stamp of the forking since the created at event will change every time the community has a new moderator?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ahhh my bad! Good point.
How about adding this suggestion instead:
["forksource", "34550:<source community event author pubkey>:<d-identifier of the source community>", "<Optional relay url of source community>","<optional timestamp of the fork>"]
This can be considered similar to creating a new git branch from a specific commit
There is an ambiguity to solve in mentions. When a Kind 1 mentions the community in the text, the post is supposed to be sharing a community with to the followers and not a post to be approved by the community. Amethyst posted with a "mention" marker, but the filter to download post approvals must remove mentions if this is the way forward. {
"content": "Super active art community. Follow bellow.\n\nnostr:naddr1qqp5zun5qgs0fk6jwz7ejxchh6s7d5p473w7uwffr8pfga9m4sgrgtfz836wp5qrqsqqpphkqfarxc",
"created_at": 1689305952,
"id": "119a56648b87c56ba9eb27aa7e571719cd977d2b749888a0e3f96a3165fac16f",
"kind": 1,
"pubkey": "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
"sig": "4abc30e65fd58f6ea838f94f7e76779872ad5b5f3d8b4cbce3c1f47727a131d52689c6e3f263326792ed33cd5fbcc08f4a70823f253abd2cdfa6643d9e7d492a",
"tags": [
[
"p",
"f4db5270bd991b17bea1e6d035f45dee392919c29474bbac10342d223c74e0d0",
"",
"mention"
],
[
"a",
"34550:f4db5270bd991b17bea1e6d035f45dee392919c29474bbac10342d223c74e0d0:Art",
"",
"mention"
]
]
} |
Probably better to use another letter for "New Post Request". Similar to how quotes are going to use "q" instead of "e". Edit: In fact, as NIP-27 states, the |
I love this NIP and it's great to see it already implemented in 3 clients in just a few weeks. We are strongly considering adding support for it in Nos. I want to suggest two modifications that are important to me:
|
How would one manage the list of approved people? Would you add 100s of users in the community definition event that are approved to post directly? Maybe a reference to a NIP-51 list? Maybe a separate membership list entry event to avoid creating massive lists? Looks like the filter to get posts could be massive (10,000+ people) if we include all members of a community.
I am starting to think this is a must. But looks like kind 11 is already been used for something else. Any other cool number suggestions? :)
The use of the The issue is when the user just wants to quote it and not reply to it.
I am not sure what to do here. I feel like this is a bigger problem with quoting any replaceable event kind, since there is no |
Don't see much problem in setting an event address (instead of id) to |
After playing with it a bunch on Amythest we definitely need approve until revoked. Just so people can get started really quickly. For more complicated moderation we can write client bots. Most of the clients that have implemented it like flycat, zappit all have show unmoderated options because the flow is just to slow without it. But that would make spam a problem. |
I wasn't imagining a list of approved people. Rather a pre-approval community would display all notes from all users, unless a note has been explicitly removed from the community by one of the moderators (maybe via a NIP-32 label?). However a list of approved community members in a list is another valid style of moderation. But I feel like supporting groups with membership is starting to diverge from the reddit-style type of group and into another type (Discordish), which probably should be in a separate NIP. No ideas yet on a replacement number for kind 11. But I don't see anything merged with kind 11 yet so maybe there is still a chance it could happen. I think I'll write up a separate NIP for this and see if it gets any traction. |
Gonna change this number. |
The goal of this NIP is to create moderator-approved public communities around a topic and provide a simple solution to Reddit clients that might want to come into Nostr.
Let the best curators win.
Read it here