This is meant to be a non-comprehensive guide to Feed Generators ("custom feeds" or just "feeds") in Bluesky.
Feeds are a way to present Bluesky posts to a given user. They can be as straightforward as filtering for keywords or by post author, or as complex as using the follower graph to find friends of friends.
The canonical example feed generator has two major parts:
Every request to a feed generator includes a verifiable token representing the user requesting the feed.
The following are different methods of serving feeds, which may be combined in various ways.
A feed can present posts with text matching certain keywords. A popular variant/subset of this is using emojis, e.g. 🧪, 🌱, or 🤼♀️. More powerful text matching will use regular expressions, which are more flexible in their filtering capabilities.
The feed presents posts by a certain set of users. Presently there are two ways to collect users: following users, or mute lists.
The feed presents posts by a certain set of users, kept in a list that cannot be easily seen by the public. This may be a list in the code, or a list saved in a database. Oftentimes, the list is kept in Decentralized ID (DID) form; see https://atproto.com/guides/identity for more information.
The feed presents posts based on the requesting user, such as:
The feed presents posts from a segment of users based on the requesting user.
The feed presents posts based on attributes which may or may not be easily seen in the UI.
The feed presents posts based on the content itself, using such strategies as:
The feed presents posts based on the number of likes, reposts, replies, and/or quotes.
Since the feed has access to the requesting user, and the social graph (who is following whom) is also publicly available, the feed may choose to pull in posts from other users based on these signals.
The feed may choose to show all posts.
The feed may choose to show content (or return an empty feed) based on criteria of the requesting user.
The feed may choose to show a constant set of posts, either for the whole feed or just at the beginning of the feed.
Here are some questions to ask and ideas to ponder about as you design a feed.
Feeds can be informational, serve a special purpose, and/or become a rallypoint for a community.
Some intention and research will go a long way. Does such a feed already exist? If it does, is it still meaningful to have a separate feed? What kind of posts are you intending to show in your feed?
If it seems like the feed might already exist, consider:
Many feeds are built once and rarely updated. Other feeds may require user list maintenance, content curation, and/or troubleshooting.
Both the name and description have character limits, so every word counts.
The name should be simple and highly searchable.
The description should give folks a good idea of its purpose, how it works or what it does, such as: "Tracks emoji X" or "contact Y to be added to the list."
The feed avatar should be recognizable and well-framed.
For more information (such as a Google form, or a full list of keywords), you may consider adding URLs in the description. Note linking doesn't presently work for feeds in the app, so this is where short domains or link shorteners may shine. Alternatively, you may consider the Instagram method of "check in bio" and link from your bio.
Here are the ways people may come across feeds:
You might reply to posts found in your feed to let people know. You may also consider building a separate feed which looks for people interested in the topic and looking for a feed.
Each feed has a URL that looks like
To find the URL, navigate to the feed directly (not in one's pinned tabs), and either:
When sharing the link, be sure to click on "Add link card", so the inline card showing the feed name and like count (i.e. the post embed) shows up.
When encouraging others to share, you may want to remind folks to: