Varun Srinivasan pfp
Varun Srinivasan
@v
A quick history of the Farcaster feed. Back in 2021, the first version of the feed just showed you every post, starting with the newest. There wasn't a way to unfollow! This was ok because we were just a 100 or so weird internet people who liked hanging out together. We added follows soon after, when someone started annoying someone else. This hurt new users quite a bit because they started with an empty feed and had to do a lot of work to make it good. So we picked the most active users each week and suggested they follow them when signing up. It was built in an incredibly simple way. Every time you loaded your app, we'd run a sql query to fetch the latest casts, hydrate the links and images and serve you a feed. At some point, we moved this into a background job so it would run every 30 seconds, and slow down if you stopped checking the app.
11 replies
29 recasts
236 reactions

Varun Srinivasan pfp
Varun Srinivasan
@v
We added replies soon after, and had them show up in the feed. The network was still really small and slow at this time so we added "reply bumping". If a post got replied to, it would get bumped all the way to the top of your feed, showing you the newest reply. This made the feed feel a lot more dynamic and active. People quickly figured out that the best way to get engagement was to ask feel good questions. You'd get a lot of replies which kept you at the top of the feed. This was the first "algo gaming" and we had to put some limits on how often things got bumped up. The original feed architecture also stopped working when we got to a few hundred users. We switched to a fan-out model where a user’s feed was regenerated only when someone they followed casted. This had the nice property that every feed generation was useful β€” it would be guaranteed to add something new to the top of your feed. This new architecture introduced caching problems with counts. The feed would only regenrate if they were new posts, but people were liking the old posts frequently. These counts wouldn't update and then the user would get annoyed because they'd click into a post and see a different count. We solved this by adding periodic regeneration so you wouldn’t go a really long time without updating the counts. We also added a client side solution β€” if you loaded a conversation page and discovered a new cast count, your local cache would be updated which would override whatever the server response was.
3 replies
6 recasts
66 reactions

D’ Guine-man πŸ’ͺ🏿 pfp
D’ Guine-man πŸ’ͺ🏿
@guineman
Wow Built brick by brick 🧱 πŸ’œ
0 reply
0 recast
0 reaction