How Ranking Works
By the end of this page, you'll understand the philosophy behind Scour's ranking and how it differs from algorithmic feeds on other platforms.
The Philosophy: Hidden Gems Over Viral Content
Most algorithmic feeds optimize for engagement. Clicks, shares, and time-on-site drive what gets shown. This creates a bias toward viral content: the article everyone already saw, the hot take designed to provoke, the clickbait that works.
Scour takes a different approach. The goal is to surface content you'd never find otherwise: the indie blog with 50 readers, the obscure technical post that's exactly what you needed, the thoughtful essay that didn't go viral because it required attention.
To do this, Scour deliberately avoids using popularity signals. There's no consideration of how many shares a post has, how many backlinks point to it, or how much engagement it's getting elsewhere. Instead, ranking is based entirely on:
- Your explicit interests — topics you've told Scour you care about
- Content quality — filtering out low-quality spam and listicles
- Source diversity — ensuring no single topic or source dominates your feed
Explicit Interests, No Pigeonholing
On most platforms, clicking one article about cooking can flood your feed with cooking content for weeks. The algorithm infers your interests from behavior and doubles down.
Scour doesn't work this way. Your feed is determined by the interests you explicitly add. One click on a random article won't change anything. If you want more cooking content, you add a cooking interest. If you don't, you don't.
Scour does use signals like your reactions and reading history to suggest new topics you might be interested in. But suggestions are just suggestions. Your feed won't change until you explicitly choose to add them.
This keeps your feed predictable. You always know why you're seeing something because it matches an interest you chose. No mysterious algorithmic drift.
How Interest Matching Works
When you add an interest like "distributed systems" or "fermentation", Scour converts that phrase into a semantic embedding. Every article in Scour's database also has an embedding generated from its content.
Ranking works by comparing these embeddings. Articles whose meaning is close to your interests score higher. This is semantic matching, not keyword search:
- An interest in "machine learning" will find articles about "neural networks" and "deep learning" even if they don't contain the exact phrase
- A specific interest like "PyTorch distributed training" will find relevant content even when phrased differently
- Articles that match multiple interests get a boost (if you're into both Rust and WebAssembly, a post about compiling Rust to Wasm ranks higher)
What Are Embeddings?
An embedding is a vector (a list of numbers) that represents the meaning of text. Scour converts each interest and article into an embedding of several hundred values. Texts with similar meanings produce similar vectors.
The embedding model learns semantic relationships from training data. "Machine learning" and "neural networks" end up with similar vectors even though they share no words. "Baking bread" is far away in the embedding space.
To rank articles, Scour computes how similar each article's embedding is to your interests' embeddings. Scour uses binary quantized embeddings with Hamming distance for fast search, which allows real-time ranking across hundreds of thousands of articles.
For the technical details (why binary quantization works surprisingly well and how Scour indexes embeddings), see Binary Vector Embeddings Are So Cool.
Scoring: Relevance with Exponential Decay
For the technically curious: when an article matches multiple interests, Scour doesn't just add up the similarity scores. Instead, it uses exponential decay: the closest interest contributes most, with diminishing returns for additional matches.
This means an article that's a perfect match for one interest can still beat an article that's a mediocre match for three. Quality of match matters more than quantity.
Timeframe & Recency
The timeframe selector affects how recency factors into ranking:
- Fresh — Looks at content from the past few days and balances recency with relevance. You'll see a mix of new posts and highly relevant ones. This is the default.
- Day, Week, Month — Show content from that time period ranked purely by relevance.
Rankings are computed in real-time on each page load, not precomputed. This means changes to your interests or filter settings take effect instantly.
Quality Filtering
Before ranking, Scour filters out content from low-quality sources. A domain blocklist of 906393 domains removes known spam, content farms, and SEO-heavy sites.
An ML classifier also assigns each article a probability of being junk: listicles, marketing fluff, beginner questions that lack depth. Currently, this classifier is conservative and not where I want it to be—it only removes content with high confidence of being low quality.
Additionally, articles with listicle-style titles ("5 Ways to...", "Top 10...") receive a ranking penalty. Those articles are tempting to click on, but often contain particularly unsatisfying content.
Quality assessment is an area of active development. For more on filtering options you control, see Content Filtering.
Source Discovery Within Your Interests
Discovery on Scour means finding new voices on topics you already care about—not being pushed toward new topics. The unknown indie blog writing about Rust is the win, not an algorithm deciding you should suddenly care about cryptocurrency.
This is why source diversity is a core ranking factor. Relevance alone would produce a boring feed: if all your top-scoring articles came from the same few sources, you'd miss the breadth of perspectives Scour has access to. New and obscure sources aren't disadvantaged compared to established ones.
To ensure diversity, Scour uses a reranking step called Maximal Marginal Relevance (MMR). After initial scoring, MMR reorders results to maximize both relevance and diversity. Each selected article must add something the previous ones didn't.
In practice, this means:
- You won't see five articles from the same source in a row
- If you have ten interests, your feed will reflect a mix, not just your most active topic
- Similar articles (near-duplicates or content from the same story) get spread out
There's also a cap on how many articles can come from a single domain per page, currently 10%. This ensures no single source dominates.
Works for Niche Interests
Some recommendation systems only work well when you have similar users to learn from. Scour doesn't require this. If you have a unique combination of interests—say, fermentation and formal verification—the algorithm works just as well for you as for someone with mainstream tastes.
Ranking is computed entirely from your explicit interests and the content itself. There's no cold-start problem and no degradation for niche users.
What Reactions Don't Do
When you like or love a post, it doesn't directly affect ranking. Your reactions influence the interest recommendation system which helps Scour suggest new interests you might want to add, but they don't change how existing content is scored.
This is intentional. The explicit interest model means your feed changes when you decide to add or modify interests, not when an algorithm infers something from your behavior.
What's on the Roadmap
Ranking is an ongoing project. A few things I'm working on:
- Better quality assessment — The current ML classifier is not very good (it classified one of my own technical deep dive blog posts as low quality. I worked hard on that!). I'm actively working on alternatives.
- More tuning controls — Exposing more ranking parameters so you can adjust the balance between recency and relevance, strictness of quality filtering, and more. You can track this feature request on the feedback board.
- Boosting good sources — I've been looking into ways to boost content from sources that are consistently high quality, or that you consistently interact with. It's tricky to do this without pigeonholing you or making Scour fall into the popularity trap, so I'm still exploring this.
If you have ideas for how Scour's ranking algorithm could work better for you, I'd love to hear them: feedback.scour.ing.