How Weirling ranks your reading

Relevance is a relationship between content, a specific person, and time, not a property of content alone. Weirling computes a Personalized Relevance Score (PRS) per item, per user, from eight signals, then learns how to weight them from how you actually read.

The eight signals

  1. Semantic alignment: cosine similarity between the article and your interest clusters (per-cluster max, so a cooking-plus-compilers reader isn't averaged into a blur), plus transitive "bridge" vectors for the intersection of two connected interests.
  2. Reading depth: real scroll depth and active reading time from the in-app reader, not clicks.
  3. Suggestion signal: what you read from sources you didn't follow (the purest signal that discovery is working).
  4. Explicit feedback: thumbs, tagged reasons, saves.
  5. Source & creator trust: learned per source, and even per creator-per-topic.
  6. Content quality: length, citations, originality heuristics.
  7. Temporal context: long-term interests, medium-term focus, and session saturation.
  8. Novelty: a configurable serendipity band for discovery outside your established clusters.

Per-user learned weights

The weights are learned per user via single-layer gradient descent on prediction accuracy, so the engine gets sharper the more you read. Signals that are themselves derived from the engagement target (reading depth, explicit feedback) are held out of the regression so the model can't inflate them by predicting its own inputs.

Explainable, not a black box

Every item shows why it ranked: the contributing signals and, when a graph connection drove it, the named topics ("connects your interest in compilers and language design"). You can validate the claim yourself: scripts/ranking_eval.py reports read-prediction AUC per cohort.

Open and honest

The full ranking engine is free, the code is open source and self-hostable (Docker Compose), and platforms without a public feed (Twitter/X, LinkedIn) are marked unsupported rather than silently failing.

Try it →