Skip to content

Instantly share code, notes, and snippets.

@vrypan
Last active September 15, 2025 06:57
Show Gist options
  • Save vrypan/3cb9c7cbc380fa29e3b3e1293f001161 to your computer and use it in GitHub Desktop.
Save vrypan/3cb9c7cbc380fa29e3b3e1293f001161 to your computer and use it in GitHub Desktop.
Farcaster Channels proposal

tldr; Channels are just FIDs with USER_DATA_IS_CHANNEL=true

Description

For this proposal:

  • A channel is a curated feed of casts.
  • A channel is identified by an FID, let's call it channelfid and 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 @channelfname follows @user"
  • "only like if @user holds a specific NFT"
  • etc.

Implementation

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.

UX

Case 1: New user, non-channel-aware client

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.

Case 2: General-purpose, channel-aware client

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 @channelfname casts, lists casts that @channelfname liked (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”).

Case 3: Special, channel-optimized client

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.

Pros

  • 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 @channlefname is 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.

Cons

  • 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment