One of the coolest things about the Bluesky social network is that you can build custom feeds to curate a particular kind of content and share it with your friends. Unfortunately, the process is far more opaque and intimidating than I’d like it to be so I thought I’d share what I’ve learned about the process.
STEP 1: Join SkyFeed
I make custom feeds in a tool called SkyFeed that you can find at skyfeed.app to join you’ll need to make an app password. Log in to Bluesky, Open https://bsky.app/settings/privacy-and-security then click on app password and generate one, call it SkyFeed.
Type your username.bsky.social and paste the app password into the password field to open SkyFeed.
STEP 2: Feed Builder
Once you’ve gotten into Sky Feed, look in the leftmost panel a few items down for the feed builder. The user interface of the feed builder can be rather intimidating so I’ll break it down: the leftmost column is not the feed builder at all and gives you access to all the other features SkyFeed offers; the rightmost column previews the feed you’re working on and the center column is where you make the code for your new feed.
The basic principle of the center column is that execution flows from top to bottom.
Following my Vintage Gay feed feed above for a simple example: it queries a set of hashtags, removes reposts and replies, sorts them by creation date and then limits itself to spitting out the first 200 results to conserve resources.
STEP 3: Choosing a Source
The source of your feed is the single most important choice you will make in terms of what it does, how well it works and how reliable it is. If you are simply curating a selection of hashtags “Tags” is by far the fastest (0ms) because it happens by design and pre-curates in the background. If you want to produce a feed of your own stuff exclusively, choose single user and it’s equally fast. If you want to search for a word, number, or emoji/emoji string over a short period of time on the whole network choose “Entire Network” with a period of “24 hours” this takes a bit of time (24-50ms) and can balloon if you have a complicated search. You can also use a list to curate the contributions of a particular group of users, but this is very slow (300-500ms) and still balloons from searching.
Careful: How you Curate Determines How You Source and Search
One of the things I wish someone had explained to me about feeds is that each of the source type has a very different way of curating the content:
- Tags: Search terms go in the tag box, comma separated, without hashtags. They get searched on the server side and returned to you unsorted.
- Network: Search terms go in the RegEx box, pipe separated with + for spaces. They get searched on your side out of the AtProto firehose.
- List: You curate a collection of users who post what you want to curate, then Query the network for that set of users’ posts.
As a rule of thumb the more things you search, the more time it takes to search them. A taglist can be quite extensive and still fast; searches get slower and slower the more things you add. Single user is always fast; but lists get slower and slower the more users you include in them.
STEP 4: Throwing Away Unwanted Results
After you’ve chosen an input quickly throw away any unwanted material; Remove if Repost and Remove if Reply easily eliminate junk results or can also be used to limit your results to posts with only a certain number of images. This will also let you eliminate duplicates, posts with no likes or replies, etc. This pairs down the work when you get to your search step if there is one.
Filtering NSFW Content In or Out
Feeds curated from adult tags or keywords may well be all NSFW simply from the nature of the search but if you want to guarantee that result; add a Remove statement if item “has no labels” this will limit your search to only items with an NSFW label. Note that this collaterally bans text posts and ensures that the post has a video, image, or link.
Likewise you can filter-out if the item has labels when you’re trying to exclude adult materials. Excluding does not ban text posts and leaves the feed open to any kind of media by default. Sorting FOR labeled eliminates a lot of results and will speed up searches if it comes before the main search; excluding labeled has no particular speed advantage but keeps NSFW off the feed.
STEP 5: Limiting Output
In order to conserve resources on the servers, you want to limit how many results you output. By default this is 100 posts returned, but I have a feed that returns 200. The number of items to be sorted dictates how long it takes to sort them, so the more items you are searching and the complicated your sorting techniques the fewer posts you should be limiting the output to.
Feeds that come from tags can often be allowed to scroll forever unlimited if there isn’t much sorting or searching going on. Entire Network searches get slow fast if you don’t limit them, though this is less of a problem on the “30 minutes” and “3 hours” modes.
STEP 5: How to Search
If you chose to source from the firehose or a list of contributors, you’ll probably want to use that cryptic little box labeled “RegEx” which is probably the most counterintuitive thing about this user interface.
When your input is “tags” you put your search terms in the input, comma separated, but what about the Entire Network style of searching, how do you do that? You’ll need to use the RegEx box…
Sidebar: WTF is a RegEx?
RegEx is a “Regular Expression” in JSON syntax. Think of it as a really fancy search box with a huge feature set that’d let you search in many ways if you knew how. For ordinary people just put pipes between the search terms and realize that it’ll come up if any 1 term is there. It will let you search any string, even if you want to include emojis in the search. Note that you must explicitly include the # if you want to search a hashtag this way.
Not using the invert checkbox finds all of the results that have any variation of the words chosen. You can also do a second search after your original RegEx search to exclude a set of search terms by clicking the invert button to, say, remove “she/her/pussy/tits/chudai” from a gay feed or “he/him/man/penis” from a lesbian feed. Do not use a pipe at the beginning or end of the expression or it’ll crash.
STEP 7: How do you want to sort?
Once you’ve paired down your results you’ll need to choose a way to sort them. By default adding a sort uses creation date, which is super fast and reasonable for most feeds. You can also sort by likes, shares, and replies which are slightly slower but extremely useful for engagement sorted feeds. Neither of these explicitly needs to be limited for time purposes.
Need to compromise between popularity and recency? That’s what “HN Ranking” is for. At a gravity of 4 it’s most recent first unless really popular; at a gravity of 1.2 it’s most popular first unless really recent. Gravity of 2.0 is an even balance between those two behaviors.
HN Ranking is, by far, the slowest of the sort methods and really only works well if you limit the feed to >200 posts up in step 5. For infinite scrolling feeds you probably want to be using “Creation Date (Descending)” on something that doesn’t have to be searched, like tag or list based feeds.
STEP 8: Publishing Your Feed
Once you’ve played around with various searches and filters and sorts until your feed is both rendering quickly and looking like you want it to in the preview pane, name your feed, and go to the “Update Feed” button at the top of the center column.
Clicking will bring up a box that lets you enter a description. The green button at the top lets you upload an avatar image to represent your feed in the menu and the box in the middle lets you enter a description that tells other users (or later you) what, exactly, this feed is meant to curate. The avatar is square and displayed very small so choose a squarish image that doesn’t rely on detail.
STEP 9: Using and Promoting my New Feed
Once you’ve published your feed, where does it go? You should verify your success after publishing by checking the Feeds tab on your profile page. From here it’ll work like any other Bluesky feed and can be browsed, saved, and pinned by either you or anyone else on Bluesky.
Please note that published feeds are PUBLIC and anyone who visits your profile can see it on your profile page; so it’s probably wise to have a seperate adult/NSFW account if you’re making adult feeds for public consumption. If you want to keep a feed private you can use it in SkyFeed without publishing it.
Click on the name of the feed, check it to make sure it works properly, then use the Square w/ up arrow to copy the link to your feed and share it to your Bluesky followers. It will show your avatar and image description to the end users; but it’s wise to repeat the description in your skeet so people know the value proposition of the feed you’re asking them to follow.