Skip to content
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

[LIP-10] - Open Communities Standard #33

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

random-potential
Copy link

Proposing a unified standard for creating and managing Communities which allows using them in an interoperable manner across the Lens ecosystem.

Copy link

height bot commented Feb 18, 2024

Link Height tasks by mentioning a task ID in the pull request title or commit messages, or description and comments with the keyword link (e.g. "Link T-123").

💡Tip: You can also use "Close T-X" to automatically close a task when the pull request is merged.

@AugustvsCaesar
Copy link

An amazing idea. I think communities shouldn't be fragmented however they are a draw on certain apps. I think the feed should the same but communities should be able to opt into closing to an application.

This means a community chooses Orb or Buttrfly or whichever platform rather than the platform itself disabling the community to be multi client. The power of the location of a community should be up to the community.

If this is not possible, then I surely agree that all communities should be available on all clients.

@EthWarrior
Copy link
Contributor

In favour of the idea given that there has been lot of excitement with communities, especially with Orb clubs.

Actually really nice to see additional standards and composable features being build on top of Lens.

Would be great hear opinions from @nileshrathore and Kimmo from Orb and @bigint from Hey around what kind of standardization could work for interoperability.

When it comes to standards, my biggest recommendation is that the standards are as lean as they can be so they would not limit any potential future use-cases and gives wide flexibility for applications to integrate them.

@II8888
Copy link

II8888 commented Feb 18, 2024

orb

@keiven0219
Copy link

orb not work for me for a long time
hey is also limited..
Lens community is all on its own.

@Laskidiii
Copy link

Not dev based, But whatever that could be the positive outcome of this, Let it come.

@paulianmirandaramos
Copy link

I support, likes well-defined rules

@hassansazgar
Copy link

The new version of Orb is Fabulas

@iPaulPro
Copy link

Huge +1 for open and composable communities! I want to point out some technical capabilities that Lens already has, to get the discussion started on specifications. Right now, a Lens "Profile" could be used to manage a Community fairly effectively.

  1. Manage a Lens profile with a multisig wallet or use Profile Manager to allow admin roles.
  2. Follow Modules have DAO capabilities built in, and in V2 are open just like Open Actions, allowing for complex logic that can be used for "membership", including issuance of NFTs, governance, and voting rights.
  3. Support for token-gating (including follower-only) publications means that there's already support for member-only content.
  4. Publications support "tags", which are currently unused, but could be used to specify which communities a publication intends to be part of.
  5. Rich editorial support, in the way of Mirrors and Referrals, allow a Community to monetize curation and moderation. A community could choose to consider a tagged publication as "pending" until it has been mirrored by the Community Profile, for example.

In may ways, open composable communities are possible on Lens today, and all that is needed is to establish an open standard!

@mrsalitre
Copy link

yes! not only that but a standard that can be group/club/community agnostic, allowing a post to belong to 0 or N groups/clubs/communities

@IamYakuza
Copy link

This is a great LIP, as currently we already have:

  1. Clubs - Orb
  2. Groups - Hey
  3. Channels - Buttrfly
  4. Communities - Phaver

Would be nice to come across a standard for all of them, making them portable.

@joshstevens19
Copy link
Member

This is a great idea, and I agree that having a standard here is very important.

The first question I have here would people mind if it was purely in the Lens API for now? or do people want to see full contracts made so these communities are owned on-chain?

@jounih
Copy link

jounih commented Feb 19, 2024

great to see this finally get traction!

Would be great to flesh out the desired feature set, ie.

  • join a group
  • leave a group
  • create a group (namespace, cost?), ownership of a group
  • search/explore groups
  • group info (about)
  • mod status (community moderation for groups - kick spammers out, remove abusive posts)

etc.

Also will the feed in the group be only chronological (could get noisy) or weighted by engagement (likes+comments+some recency component) - or both?

@dengdaqing11
Copy link

Improve dapp smoothness

@defispartan
Copy link

I think there's a simple, decentralized solution mentioned by @iPaulPro, that could standalone as a protocol standard and address the core issue immediately: apps attach and surface posts with tags included in publication metadata.

4. Publications support "tags", which are currently unused, but could be used to specify which communities a publication intends to be part of.

open composable communities are possible on Lens today, and all that is needed is to establish an open standard!

https://github.com/lens-protocol/metadata/blob/3438c454c6a9ad204711441a338324632fc683a5/src/publication/common/index.ts#L69-L72

If applications opt-in to this standard, this creates a public layer for communities to share content between apps. Individual apps can still filter content based on their own moderation, curation, and access preferences (NFT or follow gating, only posts originating from certain apps).

I would not be in favor of creating any central registry for communities. The direction I'd like to see communities develop is encouraging attestations (votes) from within communities that are published through open actions, and can be filtered by apps / algorithms to create standards for group settings like metadata and access requirements. The format of these attestations should probably be a separate LIP once public communities gain traction.

@IamYakuza
Copy link

Could all these be at the protocol level?

Clubs - Orb
Groups - Hey
Channels - Buttrfly
Communities - Phaver

CC: @iPaulPro @defispartan

@iPaulPro
Copy link

iPaulPro commented Jul 3, 2024

Could all these be at the protocol level?

Clubs - Orb Groups - Hey Channels - Buttrfly Communities - Phaver

CC: @iPaulPro @defispartan

I'd argue that Groups should be at the protocol level, for many reasons, but namely:

  1. Ownership
  2. Moderation
  3. Monetization

I believe the most important part of a "Group" in Web3 is ownership. In my opinion, having to pay rent to manage a Group, while not owning the treasury wallet, the handle, or the Profile (Group) NFT, is arguably worse than starting a subreddit.

If there was a simple way to turn a "Profile" into a Group, we could use many existing features of Lens Protocol, like the governing features built into Follow NFTs, custom Follow Modules, and custom Reference Modules that actually reward engagement based on referrals.

A Group should allow for DAO ownership and moderation, and Lens Profiles can already do this. A RevokableFollowModule could be created to give mods the ability to ban members. A RoleFollowModule could be used to allow for the designation of moderators with customizable mod abilities. Feed curation can be done entirely via Reference Modules.

We've discussed renaming "Profiles" for this exact reason; they're capable of a lot more than a traditional "profile" in social media. I believe no core contract changes are required to achieve permissionless Groups that are owned by the creator(s). Ideally the API would allow for more control over comment moderation, and the ability to exclude Group posts from feeds.

What are the key features and requirements for Groups?

  1. Permissionless
    i. Lens Profiles can already be created permissionlessly.
  2. Ownership
    i. Profiles are already owned by the wallet that creates them. Any type of wallet can be used (multisig, smart, embedded, etc).
    ii. Custom profile metadata can be used for all Group settings.
    iii. Gated Content can be used to control the visibility of Groups
  3. Membership
    i. Follow Modules and Follow NFTs already provide everything needed for "membership". The Follow NFT is the membership.
  4. Member Moderation
    i. Custom Follow Modules can be used to create moderator roles.
    ii. Custom Follow Modules can be used to issue revokable Follow NFTs.
  5. Content Moderation
    i. Group must Mirror a Post for it to be considered as part of the Group. This means every Collect made in a Group is eligible for a referral fee.
    ii. Posts can be removed from a group by hiding the Mirror publication.
    iii. Hiding comments should be possible by any Group member with sufficient mod privileges.
    iv. The reporting feature of the API could be extended to allow reports to the Profile that mirrored a publication
    v. Custom Reference Modules can be used to allow for the "pausing" or "freezing" of any thread by mods.

I'd love to see a Lens Group Standard defined before the launch of V3. Would be great to have participation in this discussion from the apps that you mention, @IamYakuza.

@bigint
Copy link
Contributor

bigint commented Jul 3, 2024

Any updates when this LIP goes live @EthWarrior @joshstevens19?

@IamYakuza
Copy link

@iPaulPro Hey, I think we're actually on the same page here.

Just like you, I want groups/clubs to be managed with the same level of control as a profile. That's why I mentioned them being "at a protocol level."

Your idea of a simple way to transform a profile into a group is exactly what I was thinking! It would be a game-changer.

I'd love to tag ppl from the apps I mentioned but I don't know their githubs :(

CC @defispartan @joshstevens19 @ZKJew @bigint

@ZKJew
Copy link
Contributor

ZKJew commented Jul 8, 2024

I completely agree with @iPaulPro here is an old post of mine on the topic
https://hey.xyz/posts/0xdd33-0xe7
Anything less then complete ownership is just a centralization vector and against the Lens ideology of owning your social graph, content, ext. It is even more important then a regular profile itself imo. If apps are worried about revenue - then we could figure out some sort of fee-split with the channels that is greater then normal profiles or something; however, I think ownership and buying over renting is a nonnegotiable for users of Lens.

@ZKJew
Copy link
Contributor

ZKJew commented Jul 8, 2024

"I would not be in favor of creating any central registry for communities." agreed

@kualta
Copy link

kualta commented Jul 10, 2024

  1. Publications support "tags", which are currently unused

This is not true. Orb and Buttrfly are making use of tags to form their communities, orb prefixes them with orbcommunities* and buttrfly with channel-*. Phaver and Hey don't utilize tags at all.

Pingpad allows for cross-posting between these standards by attaching multiple tags, but it is suboptimal as it is

  1. splits similar content into different places
  2. forces apps to compose generic communities out of multiple app-specific ones (frontends must know and query for each tag that's used by all the other apps)

My proposal is to:

  1. Split the communities standard into two parts: open communities and manageable groups

  2. Open communities simply show the intent of the message, so we can utilize either

    1. existing tags, while agreeing on the same prefix (channel-, intent-, community- or anything else)
    2. introducing a new field into PublicationMetadataCommon that would be a community: string (personally in favor of this option)
  3. Groups on the other hand can be gated and controlled using Profiles, like what @iPaulPro described. One part I'm not sure about is the mirroring by the Community Profile (wouldn't it make all the content shared in a private group public by default? since it has to be mirrored? what's a "pending" status needed for?)

  4. If we're not in favor of central communities registry, we need some way to query for lists of most popular or most recently used community tags in the API. Otherwise every app is forced to maintain their own database of featured communities, which is suboptimal and unnecessary. Groups, however, can either be registered or queried for like existing profiles.

@iPaulPro
Copy link

This is not true. Orb and Buttrfly are making use of tags to form their communities, orb prefixes them with orbcommunities* and buttrfly with channel-*. Phaver and Hey don't utilize tags at all.

I mean there is no standard for using tags, and they have no assigned purpose. Apps can use them however they want, but they're currently handled differently in each app and not used (for anything) at the protocol level.

My proposal is to:

  1. Split the communities standard into two parts: open communities and manageable groups

I don't understand the difference between a "group" and "community" here. They're largely different names for the same things in a social media context, and I worry it's confusing to have both. It sounds like your suggestions for "communities" are just the tags acting like hashtags. Is that right? If so, I don't think that should be called a "community" or "group", it's simply tags on a post.

I'm strictly using the term "Group" here, for clarity.

  1. Open communities simply show the intent of the message, so we can utilize either
    1. existing tags, while agreeing on the same prefix (channel-, intent-, community- or anything else)
    2. introducing a new field into PublicationMetadataCommon that would be a community: string (personally in favor of this option)

Your second suggestion doesn't allow for cross-posting in multiple Groups, right? Tags already exist, are used by Orb, and fit perfectly with this use case while allowing cross-posting (which I believe is a key feature). A standard prefix makes sense to distinguish from other types of tags.

The cross-posting issues you describe are easily-solvable client-side UX issues.

  1. [...] One part I'm not sure about is the mirroring by the Community Profile (wouldn't it make all the content shared in a private group public by default? since it has to be mirrored? what's a "pending" status needed for?)

Good point, I forgot that mirrors don't allow for specifying their own reference modules. So that approach would only work for public Groups unless new capabilities were added to mirroring.

A "pending" status is useful for moderation and curation. Without it, we don't have feature parity with subreddits. Without the mirror referrals, there's no way for the Group to earn from curating the posts. This could be a setting controlled by the Group owner, allowing for open submissions.

  1. If we're not in favor of central communities registry, we need some way to query for lists of most popular or most recently used community tags in the API. Otherwise every app is forced to maintain their own database of featured communities, which is suboptimal and unnecessary. Groups, however, can either be registered or queried for like existing profiles.

I'd love to see more APIs around tags, in general; especially getting a list of the most-used ones. As far as querying for Group Profiles, we could filter by custom metadata params (the Group settings) if additional filter options were added to the API.

@kualta
Copy link

kualta commented Jul 12, 2024

I don't understand the difference between a "group" and "community" here. They're largely different names for the same things in a social media context, and I worry it's confusing to have both. It sounds like your suggestions for "communities" are just the tags acting like hashtags. Is that right? If so, I don't think that should be called a "community" or "group", it's simply tags on a post.

the difference is in the governance over them. having groups with vaults, moderation, pending statuses, private members is good, but it's 1) too high of an entry barrier to create one (you must buy a new handle) 2) doesn't really work for a community with no governance (not every group of interests needs moderation and rules)

this leads me to believe that there must be an easier and cheaper way to connect with people with the same interests, thus the distinction between the two.

I don't understand the difference between a "group" and "community" here. They're largely different names for the same things in a social media context, and I worry it's confusing to have both.

i can see how these two names can be confusing, which is why i proposed to use of something like intent or interest to annotate tag-powered communities. on a second thought, i think channel is a great way to call it, since it doesn't directly group certain individuals, but rather channels general flow of content into more theme-specific places.

Your second suggestion doesn't allow for cross-posting in multiple Groups, right? Tags already exist, are used by Orb, and fit perfectly with this use case while allowing cross-posting (which I believe is a key feature). A standard prefix makes sense to distinguish from other types of tags.

correct, the second suggestion is intentionally a community: string field and not a community: string[]. the reasoning is that i disagree with using an array of communities on the post itself, since it's clear that user must be forced to choose which channel fits their post the best. later, user may use existing mirror functionality to cross-post it to any other community they find relevant. this also prevents community tags abuse (right now, nothing stops me from posting my message into every orb club and buttrfly channel at the same time). this is an erroneous architecture pattern and should not stay like that. it forces all existing and future clients to prevent this sort of abuse on their own.

let me restate my current proposal:

  1. split this LIP into two parts and call them channels - free intent-based content grouping and groups (or community profiles would capture the implementation details nicely) - possibly moderated, possibly closed, possibly gatekept, etc. alternative to channels. the reason to split these two is because channels would require much less work to implement properly and are crucial to lens network UX. content is laying around all over the place right now.
  2. for channels, implement a channel: string field on PublicationMetadataCommon and provide API to query for those (latest, most popular, search etc). additionally, provide API to query for tags.
  3. for groups many things have to be discussed in a separate LIP but the main one for me is how to make sure content in a private group stays private

@IamYakuza
Copy link

@kualta this is basically the wording that each Lens client gave:
Clubs - Orb
Groups - Hey
Channels - Buttrfly
Communities - Phaver

Infact, their content and way of working should be all the same, for instance in Buttrfly you see Orb clubs as channels and they are the same.

@kualta
Copy link

kualta commented Jul 12, 2024

@IamYakuza neither phaver nor hey utilize community tags, i believe phaver curates their communities off-chain and hey doesn't implement them yet: phaver post metadata & hey post metadata (notice the tags: null field).

the way to name it is quite irrelevant and can be left up to the clients, i do find buttrfly naming channel-* the best tho, it captures the idea nicely and is called the same in farcaster.

@iPaulPro
Copy link

i can see how these two names can be confusing, which is why i proposed to use of something like intent or interest to annotate tag-powered communities. on a second thought, i think channel is a great way to call it, since it doesn't directly group certain individuals, but rather channels general flow of content into more theme-specific places.

I don't think we need names for posts that have tags; that's the confusing part. They're just tags in the way that you're describing.

correct, the second suggestion is intentionally a community: string field and not a community: string[]. the reasoning is that i disagree with using an array of communities on the post itself, since it's clear that user must be forced to choose which channel fits their post the best. later, user may use existing mirror functionality to cross-post it to any other community they find relevant. this also prevents community tags abuse (right now, nothing stops me from posting my message into every orb club and buttrfly channel at the same time). this is an erroneous architecture pattern and should not stay like that. it forces all existing and future clients to prevent this sort of abuse on their own.

You can only have 5 tags on a single publication, so that stops you from posting to every Group at the same time. I strongly disagree that posts should only be allowed as part of a single Group. Like Reddit, it should be up to the Group whether or not it allows cross-posts.

  1. for groups many things have to be discussed in a separate LIP but the main one for me is how to make sure content in a private group stays private

This proposal is about Communities/Groups/Clubs, not about tags. If anything a separate LIP should be made if you want to propose calling tagged posts something else. Whether or not a Group is private should be up to the group owner/mod.

@kualta
Copy link

kualta commented Jul 12, 2024

I don't think we need names for posts that have tags; that's the confusing part. They're just tags in the way that you're describing.

except they're standardized. consider the following example:

{
<...>
  channel: "art",
  tags: ["contemporary", "minimalist", "funny", "black and white"],
}

as a developer, would you really prefer to list 4 communities ("contemporary", "minimalist", "funny", "black and white") over one ("art") channel? tags are not distribution channels.

Like Reddit, it should be up to the Group whether or not it allows cross-posts.

reddit only allows for a single community posting, usually users choose the one that matches their intention the best.
reddit cross-posts are, in fact, mirrors. groups (or community profiles) can disallow mirrors if they want to, just like subreddits.

@iPaulPro
Copy link

as a developer, would you really prefer to list 4 communities ("contemporary", "minimalist", "funny", "black and white") over one ("art") channel?

My preference as a developer doesn't matter as much as supporting features that users might want. I'd much prefer to have a single post show up on feeds, rather than have to render multiple mirrors of the exact same content. Reddit requires that every post be part of a sub, which isn't a requirement in Lens, so the comparison is not 1:1. Apps can choose to show the first tag and/or all. Something like "Posted in g/contemporary and 3 other Groups".

tags are not distribution channels.

Says who? Tags' purpose are not defined at the protocol level, and I believe they were added to expand classification capabilities. The primary way they're currently used is to specify an Orb Club (Group); seems only natural to build upon this.

reddit only allows for a single community posting, usually users choose the one that matches their intention the best. reddit cross-posts are, in fact, mirrors. groups (or community profiles) can disallow mirrors if they want to, just like subreddits.

Why require mirroring when we can easily support "cross-posting" to five communities with tags? Your suggestion requires change to core to allow for specifying a Group at the Post and Mirror level, while using tags requires no core changes; only a spec to be agreed upon.

Moreover, the mirror approach wastes gas and time while adding noise.


I'm not, at all, opposed to adding new Publication metadata to support specifying Groups, but I strongly believe that it should support an array, rather than enforce single-group posting.

@kualta
Copy link

kualta commented Jul 12, 2024

My preference as a developer doesn't matter as much as supporting features that users might want.

you probably missed my point, my point was that it's probably not what the users want.

Tags' purpose are not defined at the protocol level, and I believe they were added to expand classification capabilities

i agree, i think tags' purpose is defined in their name and in the future they can be used for better classification at the client level by using image classification models, for example. or maybe clients would allow users to specify their own tags more commonly. if we utilize tags for the purpose of defining distribution channels, there would be no space for these use cases left...

using tags requires no core changes; only a spec to be agreed upon.

there's a problem with "agreeing on the spec" part as well. as a fresh developer, the purpose of a channel: string field is perfectly clear to me and i can get right to building. after agreeing to a spec, not only do you require a developer to know about how everyone else is using tags in the ecosystem for the purpose of content distribution, you also require them to know about the most commonly used prefix for that, only so that their apps' posts didn't get lost?

Why require mirroring when we can easily support "cross-posting" to five communities with tags?

when you create a publication, you are given one ticket to the land of algorithm, where the future of your post is further determined. regardless of the algorithm, we usually want to raise high quality content higher in your feed. when crossposting the way you described, users are given five attempts at winning the algorithm lottery, at no extra cost. due to the sheer amount of people engaging in the classical social media we do not want your post to appear five times in the algorithm, regardless of how awesome it is. we want it one time, in the place it will be most expected and appreciated.

Moreover, the mirror approach wastes gas and time

for the reasons described above, this is by design. luckily, we live in a world where mirroring gas comes to you at no cost, but you can imagine a world where we run lens on L1 and every mirror costs you something. this is good. mirroring should cost you gas.

@iPaulPro
Copy link

you probably missed my point, my point was that it's probably not what the users want.

I was saying I disagree as a user and developer. As a user I'd much prefer to have a single post in the feed rather than multiple copies of it. I'd also prefer to be able to specify multiple Groups at the time of publishing. As a developer, I'd prefer to only render a single instance of the post. In fact, a well-designed feed UI would collapse multiple Mirrors of the same post and display them as a single instance.

I try to not to impose my own philosophy and opt for the proposal that is the most flexible. As an app developer, if you believe posts should only be allowed to be posted in a single Group, you have the ability to enforce that in your app. If it's enforced at the protocol level, the option is taken from you. I believe this, alone, is the strongest argument for supporting cross-posting at the protocol level.

if we utilize tags for the purpose of defining distribution channels, there would be no space for these use cases left...

There's no reason Tags can't be used in both ways. After all, they're doing the same thing. For me, "posting to a Group" is literally the same as tagging that Group, so I don't think it's unusual to use the existing Tags. A "Group" Tag could be one that has a specific prefix; simple as that. Just to reiterate, though, I'm not opposed to adding a new field as long as it supports cross-posting.

there's a problem with "agreeing on the spec" part as well. as a fresh developer, the purpose of a channel: string field is perfectly clear to me and i can get right to building. after agreeing to a spec, not only do you require a developer to know about how everyone else is using tags in the ecosystem for the purpose of content distribution, you also require them to know about the most commonly used prefix for that, only so that their apps' posts didn't get lost?

I expect them to read the docs, which would be updated to include this spec.

when you create a publication, you are given one ticket to the land of algorithm, where the future of your post is further determined. regardless of the algorithm, we usually want to raise high quality content higher in your feed. when crossposting the way you described, users are given five attempts at winning the algorithm lottery, at no extra cost. due to the sheer amount of people engaging in the classical social media we do not want your post to appear five times in the algorithm, regardless of how awesome it is. we want it one time, in the place it will be most expected and appreciated.

I think we fundamentally disagree on the nature of a Lens Publication. My understanding is informed by the way the Protocol currently works, while yours requires some changes to it. A Lens Profile is the direct "distribution channel" of a Lens Publication. Everything else is curation, classification, and ease of access. In Blockchain, goods are delivered directly from the chain to wallets. Apps can be seen as indirect channels, but it's important to note that apps are not required for distribution.

If I see an ad for a product, and then order that product directly on the manufacturers website, was the ad the distribution channel?

When someone "posts in a Group", they are still actually posting on their Profile. The post will show up in the feed of any follower as well as the user's Profile feed. The distribution channel is not the Group, that's just a way of classifying it. The direct channel is the Profile and the indirect channel is the app. Similar to the way tags/hashtags work, a Community/Group/Club simply groups posts around a specific topic. The only difference is that a Group is moderated.

The way you describe a Group would seem to indicate that a Group Post, in fact, would not be shown in the Profile or in the feed of followers unless they were also in that Group. This is similar to limiting the sale of your physical goods to a single brick-and-mortar store. You also seem to imply that there will only be single Groups around specific interests, when there's no reason to think this will be the case in a permissionless protocol.

As a developer, I might want to cross-post to g/devs, g/web3dev, and g/cryptodevs. I wouldn't be using three attempts to "win a lottery", I'd be trying to share with as many interested parties as possible, in the easiest way possible. Why should I need to select a "primary" group and then have to mirror two more times? Any algorithm should treat a Post as a single instance (because it is singular), no matter how many times it's been Mirrored or how many Tags it has.

Moreover, the mirror approach wastes gas and time
luckily, we live in a world where mirroring gas comes to you at no cost

Just because you're not paying the gas doesn't mean it's free. Every transaction has a gas cost, and in blockchain we generally try to avoid being wasteful. Avara is currently footing the majority of the Polygon gas bill, but it may be left to apps in the future. Lens Network may help to keep transaction costs consistent and low, but at scale, it still adds up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.