DOLLA$
DOLLA$

How the algorithm works

The whole formula, in plain English.

Most platforms call their ranking algorithm a trade secret. We don't. The exact code lives in our public repo and is reproduced here for anyone — user, journalist, critic — who wants to verify what we're actually doing.

The 30-second version

If you only read one paragraph

Trending posts are the ones earning the most weighted engagement per hour since they were published. We give resharing the most credit (it costs the most social capital), saving and commenting next, likes the least. Then we divide the total by how many hours old the post is, raised to the power of 1.5 — so a post that scored 100 in its first hour beats a post that scored 300 over three days. That's the whole trick. There's no shadow profile, no political tilt, no engagement-bait multiplier, no paid boost. Just the math.

The actual formula

Engagement weights, time decay

For every published post, we compute one number — the trending_score — and rank the trending feed by that. Here's the actual SQL from supabase/migrations/00004_performance.sql:

( reshare_count × 4
  + save_count    × 3
  + comment_count × 2
  + like_count    × 1 )
÷
POWER( hours_since_published, 1.5 )

That's it. Five inputs, two operations. Run it yourself against any of our posts and you can verify our trending ranking matches.

Why these weights

The cost-of-action principle

We weight by how much social capital each action costs. The more skin in the game an action requires, the more signal it carries.

ActionWeightWhy
Reshare×4Costs the most — reshares put your name on the post for everyone you follow
Save×3Strong intent to come back. Private, but high-signal
Comment×2Took time to write something. Visible attribution
Like×1Cheap. Useful in volume but easy to game alone

Watch time gets a small bonus too — capped at +5 per post so a single long-watched video can't dominate the rest of the math.

Why time decay

Newer beats bigger, on purpose

We divide the engagement score by hours_since_published1.5. The 1.5 exponent is a Wilson-score-inspired choice — it decays faster than linear time but slower than the square, so a viral post still has a chance to be seen, but not forever. In practice this means:

  • A post in its first hour with even a few engagements ranks higher than a 3-day-old post with the same total. New voices get oxygen.
  • A truly viral post still keeps ranking for days — the decay is not a cliff, just a slope.
  • A week-old post has effectively decayed out of the trending feed unless the engagement is genuinely massive. The discover feed still surfaces it for the right viewer.

What we deliberately do NOT use

The negative space matters too

Equally important — these are inputs we do not feed into the ranking, on principle:

  • Paid boost. No creator can pay to be ranked higher. Period. Premium tiers buy features, never visibility.
  • Political tilt.No content classifier upranks or downranks based on viewpoint, party, faith tradition, or geography. The algorithm doesn't know what your post is about — only how people are responding to it.
  • Engagement-bait multipliers.Comments are weighted equally whether they're thoughtful replies or hot-take pile-ons. We don't reward content that maximizes anger or controversy.
  • Shadow profile or behavioral DNA.The feed doesn't personalize off a tracked profile of who you are or what you've clicked elsewhere. The same trending post is the same trending post for everyone in your country.
  • Creator favoritism.No allowlist of accounts that get a multiplier. Verified and Sovereign tier creators get a verified badge and tier-gated features, but their posts compete on the same trending math as anyone else's.
  • Engagement from minted-but-inactive accounts. Seeded accounts (placeholder data we used to bootstrap early demos) are excluded from every count. The materialized view filters them out before the score is ever computed.

When the rankings update

Refresh cadence + caveats

The trending materialized view refreshes on a regular cadence (currently several times an hour, batched to avoid thrashing the database). Until the next refresh, the rankings you see are a small number of minutes stale. That's a deliberate trade-off: a slightly delayed but consistent ranking is healthier than a real-time one that flickers based on each new like.

We also operate three feeds, not one:

FeedSort
Trendingtrending_score (the formula above) — what's hot right now
FollowingStrict reverse-chronological — the people you follow, newest first, no algorithm
DiscoverRecently-published posts from creators you don't follow yet — light personalization (vertical match), no behavioral profile

If you find a problem

Tell us

If you can demonstrate that this page is wrong — that the live ranking is doing something different from what this page describes — that's a bug, and we want to know. Open an issue in the public repo or email affluenceer@gmail.com. The right outcome is either we fix the code or we update this page. Either way, you win, and so do the next person who reads it.

The source of truth is supabase/migrations/00004_performance.sql in our public GitHub repo. This page exists to translate that SQL into a sentence anyone can read. If the SQL ever changes, this page changes in the same commit.