People often use Bluesky in the wrong way. For example, we are used to look for new content using hashtags, search for words or make lists of accounts of interest.
That’s because on other socials, your main timeline is algorithmic (often referred as « For You »). While it works more or less, this approach gives you only two choices: either a timeline made by an unknown algorithm, or another purely chronological timeline.
Bluesky’s default « Following » timeline is also purely chronological, which may be convenient but doesn’t allow you to find new content easily.
The new feature of Bluesky called Feeds allows you to pin other timelines on your home, with algorithms that you select, or that you can even make yourself.
Looking for Feeds
Go to the « Feeds » menu (either left or bottom of your screen). Under « Discover New Feeds », type something you’d like to see, for example « Lego » if you’re a Lego fan. Check the feeds, and if you’re satisfied by what you see, push the « Like » button and click « Pin to home ».
Now you have a new Algorithmic timeline « Lego » on your home that will show you all recent posts about Lego!
It’s more than a single search or a list, because it’s completely dynamic.
Special feeds
Some feeds are more special than others, because their algorithm is different from a single selection.
For example the Feed « Teams » put you into one team out of 256, and your team has a Pokémon name. This feed then shows only posts from other people of the same team. You cannot change team, it’s based on your account ID!
« Discover » is a feed done by Bluesky’s staff, that gives you posts that may interest you (the quivalent to « For You »). You can vote on the posts to make similar content appear more or less (« Show more/les like this » in each post’ popup menu).
« Following » is the default chronological timeline but it’s also a feed, and you actually can remove it from your home if you want 😀
Feeds are shared
Anyone can create new feeds, and when they do, their own feed appear on their profile and you can subscribe to them.
My custom feeds
I described the behavior of my custom feeds in this article.
How are feeds generated
Internally, Bluesky is federated network, which means « Bluesky », the company, is not the only one running servers and services that runs « Bluesky ».
Every feeds except « Following » and « Discover » run on servers that are not owned by Bluesky. They have access to all posts and profiles on Bluesky (remember than on Bluesky almost everything is public) and can generate any timeline from that. Then your app « Bluesky » connects to those servers and gets the feeds’ timelines.
For that reason, blocking the user that made a feed in which your posts appear won’t change anything, because the feed generation is an external system.
On the other hand, a feed creator can chose to show or ban specific accounts/posts in the feed. That’s why some feeds start with « pinned » post.
How to create your own feeds
There’s many ways of creating your feed, you can even program them manually, but here I’ll explain how to make them with a tool named Skyfeed.
Go to Skyfeed (use an application password, that you can generate in your user preferences).
Click on Feed Builder and in the popup menu on the right « + Create feed » if there’s not already one created. You get a « Hello, world ! » default feed.
To publish this feed publicly on your account on Bluesky, Click « Publish Feed ». That’s also in « Publish Feed » that you can unpublish it.
If you make modifications, you need to Publish it again to see them on Bluesky. Please note that feeds are not immediately refreshed, so you might wait a few minutes to see modifications live. It’s better to use Skyfeed’s preview.
Skyfeed only keeps the first 1000 posts of each feed.
Blocks
A skyfeed feed is made of blocks that are executed in order. Most of time a simple feed will take some posts, filter them, and sort them.
A Skyfeed feed is made of blocks that we can sort in four categories: Input, filter, sorting and memory.
Input blocks : « Input »
Filter blocks : « Remove », « Regex »
Sorting: « Sort », « Limit »
Memory: « Stash+Pop », « Remember Posts »
A lot of blocks are old or not really interesting.
A simple feed: Hello, world!
- INPUT: Takes all Bluesky’s post of the last 24h
- REMOVE: Removes replies
- REGEX: Only keeps posts that contain « hello world » or « helloworld » (case is not important)
- SORT: Sort posts by creation date, newer first.
Block: INPUT
Takes post from a source: all posts from Bluesky, a user’s account, a list…
When using a user or a list as input, you need to enter the DID of the account, that you can find using Clearsky.
Input from a Single User: « With Counts », when checked, will retrieve the reposts and likes count from each posts. Mandatory if you sort by likes or use the HN Ranking.
The INPUT block cannot:
- get posts older than 7 days from the firehose (the big stack of all unfiltered public posts of Bluesky).
- take another feed that is not yours as input.
- take your « Following » timeline as input, nor base its input on your follows (some feeds do that but they’re not done with skyfeed)
Block: REMOVE
Remove posts that are replies, that contains x medias, that are not in a specific language, or that have labels (labels are usually linked to 18+ posts but also on hate content etc).
Block: SORT
SORT all found posts in a specific way (usually chronological).
The SORT block cannot sort posts by « reshare » date, only by creation date.
Blocks: STASH+POP
Stash: Allows you to store the current feeds’ result, then clears the result and starting over by putting a new INPUT block immediately after.
Pop: Allows you to get back a previous result saved by Stash and mix them with the current’s feed results.
Block: REGEX (word filter)
Regex means « regular expression » and is a small language that allows to make very powerful text search.
It mixes regular characters (letter, digits, spaces, #) with special characters (all the others : period, parenthesis… you name it).
Regex is a very big thing so here’s a few special characters/commands that can you help making your first feed
➡️ | ⬅️ means « or »
good|bad
: shows posts containing « good » or « bad »
This is the simplest regex you can make, and you can already make very good feeds only with it.
➡️ ( ) ⬅️ is used to make a group of tests
(good|bad) guy
: shows posts containing « good guy » or « bad guy »
➡️ . ⬅️ means « any character »
g.od
: shows posts containing « good » but also « gnod », « g1od », « gGod », « g.od », « g#od », well there’s thousands of possibilities, you get it.
➡️ [ ] ⬅️ means: « one character into this list »
gl[oi]p : will find « glop » or « glip » only.
➡️ ? ⬅️ means « the previous character or group might be present or not »
super ?mario
: shows posts containing « super mario » or « supermario ». You get it? Super useful to find posts that talk about something or contain hashtags about something (because hashtags don’t have spaces)
#?supermario
: shows posts containing « #supermario » or « supermario ». However in this case, #? is actually useless, « supermario » would also find « #supermario »!
➡️ \ ⬅️ followed by a letter means « special command »
\ is used in this case to indicate we want something specific that can’t be described easily.
For example:
➡️ \b ⬅️ means « word boundary »
good guy\b
: will find only « good guy » immediately followed by something that is not part of a word : a period, a parenthesis, the end of the line. It won’t find « good guys » for example, because « s » is not a word boundary.
# is considered as a word boundary (useful for hashtags)\bupermario
: will find « upermario », « #upermario », but not « supermario ».
➡️ \ ⬅️ followed by NOT a letter means: « I want this specific character, it’s not a command »
As a lot of characters are used to describe commands in regex, so if you want to find those specific characters, you need to put a « \ » in front of them. It’s called « escaping » a character.
For example, « . » means « any character. But if you want to explicitely look for a period, you must type « \. »
good\.?guy
: will find « goodguy » or « good.guy »
good.?guy
: will find « goodguy » or « good » and « guy » followed by any character, then « guy »
➡️ * ⬅️ means « any number of occurence of the previous character »
go*d : will find « gd », « god », « good », « goood », « gooooooooooood », etc.
luz.*amity
: will find any post containing « luz » and « amity » separated by any number of characters
➡️ + ⬅️ means « at least one occurence of the previous character »
lo+l
: will find « lol », « lool », « loooooool » but not « ll ».
Real-world regex example
This is from my Hellaverse feed (only part of the regex):
hellu?va ?boss|\bhazbin|\bblitzo\b|\bstolitz\b|\bstolas|vivziepop\b|hellaverse|\bvoxval|\bhusk(er)?dust|\bchaggie|pentious|#alastor|cherrisnake|radiostatic|#radioapple
The main part is of course search terms separated by | (« or »).
I often refine the regex when I see false positives popping into the feed. That’s when I start adding \b to avoid matching words that contain the word I’m looking for.
hellu?va ?boss – matches helluvaboss, helluva boss, hellvaboss, hellva boss (« hellva » was used by some Japanese accounts)
\bhazbin – matches any word or hashtag starting with « hazbin »
\bblitzo\b – matches the single individual word or hashtag « blitzo »
\bhusk(er)?dust – matches anything (including hashtags) starting with huskerdust or huskdust.
#alastor – matches any hashtag starting with alastor (can’t use « alastor » as a standalone word, there’s too many false positives)
Ping : My Bluesky feeds - Coredump