tldr; Channels are just FIDs with USER_DATA_IS_CHANNEL=true
For this proposal:
- A channel is a curated feed of casts.
- A channel is identified by an FID, let's call it
channelfidand the corresponding fname,@channelfname. - When a user wants to post to a channel, they just mention
@channelfname.
Mentioning @channelfname does not guarantee that the cast will be included in the channel. The cast becomes part of the channel when @channelfname likes it.
The second step (where the channel likes the cast), takes place off-chain, usually by a bot managing the channel. The bot can have curation rules such as
- "only like if
@channelfnamefollows@user" - "only like if
@userholds a specific NFT" - etc.
A minimal change is required at the protocol level, to add one more USER_DATA_TYPE: USER_DATA_TYPE_IS_CHANNEL will indicate to clients that this is a channel, and it should/could be rendered in a channel-specific way.
Clients will have to render channel homepages by showing the most recent, top-level, casts @channelfname liked. When using this view, clicking on a cast should go to a URL like /channel/<channelfname>/<fid>/<casthash>. This will allow the client to filter replies to casts and only show the ones liked by channelfname -i.e. everyone can post replies to a channel cast, but only the ones currated by @channelfname will show up.
A new user does not have to know anything about channels. They may even use a client that is not channel-aware. In this case, what they see is casts mentioning @channelfname. They can also mention @channelfname. If they use a client that is not channel-aware, for them @channelfname is just an other user.
If they use a channel-aware client, when they visit @channelfname profile, they will see a special view:
- the profile indicates that this is a channel, not a normal user
- the profile, instead of listing
@channelfnamecasts, lists casts that@channelfnameliked (much like the “likes” tab Farcaster already has). - The profile will probably have a link of a pinned cast with a miniapp that allows users to join the channel or instructs them how to join it (for example, “you must hold this NFT”).
A user can also use a channel-optimized client, like cura.network.
In this case, the experience can be closer to reddit:
- Selecting a channel shows the threads that are part of the channel
- They are not allowed to cast to a channel unless they are members (if it’s a gated channel)
- Instructions on how to join the channel are presented in a more native way, and are part of the core UI.
- Minimal protocol changes.
- Backwards compatible with any client: A client that is not aware of this change, will just render casts and mentions, everything works, you just don't get the "channel experience" and
@channlefnameis just an other user for you that someone mentioned. - Flexibility: Channel membership can be based on any rule a bot can implement: Like, follow, NFT gating, ERC-20 balance, FID height, etc.
- Post to multiple channels! (mention up to five channels)
- Farcaster or Neynar, or anyone, could (if they wanted to) offer the minimal bot as a service from day 1: If the channel follows you, you are a member, click here to join.
- An external bot is required to maintain the channel (ie. it has to like the casts that will be added to the channel)
- Clients have to implement the logic for users to actually get the "channel experience".
- One of the five available (by the protocol) mentions is used to post to a channel.
- There is no standard way for a third party to fetch all members of a channel. (Not sure if this is good or bad)