How we score — and why
Three score families (article score, vote aggregation, topic weights) decide what is prominent. Here are the formulas in readable form.
Article score
Composite 0..100Composite score that weights five normalised inputs (each 0..100). It drives the order in lists and the radar.
articleScore = 0.30 · truth + 0.25 · rating + 0.20 · engagement + 0.15 · topicGrowth + 0.10 · freshness | Input | Weight | What it captures |
|---|---|---|
| truth | 0.30 | How well the article holds up against verifiable facts. |
| rating | 0.25 | Aggregated star / like rating from the community. |
| engagement | 0.20 | Logarithmic mix of views, votes and predictions. |
| topicGrowth | 0.15 | Recent activity around the topic vs. its 30-day baseline. |
| freshness | 0.10 | Exponential decay; default half-life 14 days. |
Truth dominates because Hypexio is judged on it. Engagement is logarithmic so a single viral story does not overwhelm the rest. Topic growth and freshness are real but weaker signals.
Vote aggregation
Approval, reality, controversyFrom individual votes we compute weighted averages and a controversy score. Weights amplify trustworthy users; raw counts remain visible so the UI stays honest.
approvalRatio = likeWeight / (likeWeight + dislikeWeight)realityAvg = sum(weight · realityValue) / sum(weight)controversyScore = 100 · (1 − |approvalRatio − 0.5| · 2)
Controversy is a separate dimension so that polarising stories surface explicitly instead of being averaged out of the approval ratio.
Topic weights
Activity distributionActivity-weighted distribution across all categories — the total sums to exactly 100. Trends use a 30-day baseline.
activity = 1 · votes + 3 · predictions + 5 · articlesweight = round(100 · activity_7d / Σ activity_7d)trend(up) when activity_7d / baseline ≥ 1.2trend(down) when activity_7d / baseline ≤ 0.8trend(stable) otherwise
Vote weight
Reputation 0..100Each vote is scaled into the 1.0..2.5 range — linear in reputation, clamped on both sides.
voteWeight(reputation) = 1.0 + min(max(reputation, 0), 100) / 100 · 1.5 Source methodology
Trust 0..100Every source carries a trust score (0..100) combining crawl density, historical corrections, and cross-check confirmations.
- Active sources are crawled daily; HTML hashes deduplicate.
- Sources below trust score 30 appear only inside article bodies, never as a lead.
- Corrections are documented publicly via diff.
- Anonymous posts and press releases without a named author count as low-trust.
Full reference
ReferenceThe full description, including edge cases, lives in the shared package.
packages/shared/README.md