A quieter feed
The ranker's real job
A recommendation ranker is a system that answers one question, over and over: which item should we show next? For a broadcast feed, the answer is trained on "which item will maximise the expected engagement of the current session." That target function has a well-known consequence: the ranker learns to pick items that hold attention for the longest, and sessions get longer over time as the ranker gets better at its job.
We think that target function is wrong for the product we're building. Seldeo's ranker answers a different question: which item, out of everything the user has not yet caught up with, is most worth surfacing first? The target is not "maximise time." The target is "get the user to the caught-up state efficiently."
This is not a philosophical distinction. It changes the architecture.
The three-layer ranker
Seldeo's feed ranker has three layers.
1. Freshness. Everything the user hasn't yet seen from the accounts they follow, ordered by post time. This is the default order. If you have twenty unseen posts, they come in newest-first.
2. Bucketing. Sequential posts from a single account are merged into one "bundle" card. If your college roommate posted seven vacation photos in a row, they show up as a single card with a photo grid, not seven cards in a row. The bundle is still ordered by post time; it just doesn't crowd out everyone else's material.
3. Small-poster protection. A "signal boost" pass gives a small nudge upward to the most recent post from any account that has posted less than once a week for the last month. The nudge is deliberately weak: it moves a small poster up a few positions, not to the top of the feed. Enough to make sure the small poster is not swallowed by the loudest voice in your graph.
That's it. There is no engagement-prediction model. There is no click-through-rate signal. There is no learned "you seem to like this kind of content" personalisation.
Caught up
The most important state in the Seldeo feed is caught up. When you have viewed every fresh post from every account you follow, the feed displays:
- A quiet "You're caught up" card at the top of the list.
- Below it, an optional "recent from your Circles" section showing posts you've already seen from the smallest Circles you follow, in case you want to re-read.
- Below that, nothing.
We do not autoplay related content. We do not fill the scroll with suggested strangers. We do not warm the feed with sponsored content to give the user something to do. The caught-up state is a natural stopping point, and the app signals that clearly.
What we measure
The metrics we optimise against are deliberately not "time-in-app" or "daily active users."
The two headline metrics for the feed team are:
- Catch-up rate. The fraction of sessions in which the user reaches the "You're caught up" state. Higher is better.
- Return-to-catch-up latency. For a user who's caught up, how long until they next open the app to catch up again. The right value here is not short. A user who catches up every ten minutes is not being well served.
Our internal telemetry system tracks a third metric that we watch defensively: average session length. If session length ever starts trending up, we treat it as a signal that we've accidentally introduced a broadcast-style feature. We'd rather roll a change back than let sessions get longer.
Sessions on Seldeo currently median around three minutes and 40 seconds. That number has been stable for three months. It's not a target — it's the shape of the product working the way we designed it.
What the algorithm does not do
The following behaviours are explicitly not present in the Seldeo feed ranker:
- Predicted-engagement ordering. No model that predicts which of two posts you'll interact with more.
- Reaction / comment count boosting. A post with a lot of reactions and a post with none get the same freshness score. Reactions are how you tell the poster you saw the post; they are not a ranking signal.
- Time-decay of hidden posts. Older posts don't get quietly de-ranked to make room for newer ones. If you haven't caught up yet, everything is still there.
- Cross-account topical clustering. The feed does not group your friends' posts by topic. It groups them by poster.
- Personalisation from ad or off-app behaviour. Nothing the ad stack learns is fed back into feed ranking.
What the algorithm does do
Here is the ordering of the ranker in plain English, top to bottom:
- Sort every unseen post from every account you follow by post time, newest first.
- Merge sequential posts from the same account (within a defined window) into a single bundle card.
- Nudge the newest bundle from any small poster up by a fixed number of positions.
- Insert the ad slots defined by the feed monetisation pattern (six per 21 posts, at fixed indices), if the user is in a region where ads are enabled and if ads are on the account. Ads are labelled Sponsored and are always distinguishable.
- Show the result. When there is nothing left unseen, surface the "You're caught up" state.
That's the whole thing.
Why we published this
The most consequential piece of software behind a social network is the feed ranker, and the industry convention is to keep the ranker opaque. Every couple of years, an internal memo leaks and everyone's suspicions turn out to be correct.
We think publishing the shape of our ranker in advance is a better trade. If we ever start doing something at variance with this description, someone will notice. We'll notice too. The public description forces us to keep the internal implementation aligned with the promise we made here.
If our ranker ever changes in a way that affects any of the above, it will get a full News post before the change lands.
