Understanding Our Vote Decay Algorithm
A technical deep dive into the exponential half-life decay behind our rankings - 14 days of grace, a 14-day half-life, and why the leaderboard shows what players actually play.
In How Voting Works, we explained the basics: each visitor can vote once per rolling 24 hours, and votes feed the rankings. But we glossed over the most interesting part - votes don’t count equally. This post is the deep dive into the decay math behind the “Top” and “Trending” lists: the exact formula, the constants we picked, and what it means in practice.
The Formula
Every vote carries a weight between just above zero and 1.0, determined by exactly one thing:
how old it is.
age = days since the vote was cast
weight = 0.5 ^ ( max(0, age - 14) / 14 )
A server’s decayed score is the sum of these weights over every vote it has ever received. That score - not the raw vote count - is what orders the Top page and the “votes” sort on browse.
Two constants do all the work:
- Grace period: 14 days. The
max(0, ...)means every vote younger than two weeks has a weight of exactly 1.0. Recent votes count at full strength. - Half-life: 14 days. After the grace period, a vote’s weight halves every two weeks, forever.
Here’s what that looks like across a vote’s lifetime:
| Vote age | Weight |
|---|---|
| 0-14 days | 1.0 |
| 21 days | ~0.71 |
| 28 days | 0.5 |
| 42 days | 0.25 |
| 56 days | 0.125 |
| 70 days | 0.0625 |
| 98 days | ~0.016 |
Notice the 21-day row: decay is a smooth exponential, not a step function. Between the half-life checkpoints, weight falls continuously - a 21-day-old vote is already worth about 71%. Weights never reach exactly zero, but after about three months a vote contributes under 2%, and after 16 weeks it’s under 1%.
Computed Live, Every View
There’s no nightly job that recalculates scores and no stored “ranking”. The decayed score is computed inside the database on every ranking query: each vote’s weight is evaluated against the current timestamp, then summed per server. Three consequences:
- Rankings are always current. There’s no stale snapshot; the math runs at read time.
- A vote is worth slightly less tomorrow than today once it’s past the grace period. Scores decay even when nobody votes.
- Ordering can shift with zero new votes. As old weights drift downward, servers with fresher vote histories overtake them.
Example: 300 Fresh Votes vs. 1,000 Stale Ones
Consider two servers:
- Server A received 1,000 votes in one big push 60 days ago - and nothing since. Each of those votes is worth
0.5^(46/14) ≈ 0.103, for a decayed score of ≈ 103. - Server B gets a steady 10 votes per day, over just the last 30 days - 300 raw votes. About 140 of them are inside the grace period at full weight (140 points), and the 160 votes aged 15-30 days average around 0.67 each (≈ 108 points), for a decayed score of ≈ 248.
Server B outranks Server A by more than 2x with less than a third of the raw votes. That’s the point: the ranking reflects where votes are coming from now, not where they came from a year ago.
The Steady State: A Score That Means “Now”
Because the score is a plain sum, it scales linearly with sustained voting. A server earning exactly one vote per day converges to a score of roughly 34: fourteen full-weight days from the grace period, plus about 20 more from the exponentially-decaying tail of older votes. Double your daily vote rate and your long-run score doubles too.
Read that in reverse and you get the philosophy: a server’s decayed score approximates its current vote rate - which is a proxy for how many people are actually playing and caring today. A giant historical pile of votes buys you nothing on its own.
The flip side: if a community stops voting, the score holds flat for 14 days (grace), then halves every two weeks. Ten weeks after the last vote, even the newest vote is worth just 6.25% - and everything older, less.
Where the Decayed Score Is Used
- Top and the “votes” sort on browse - full-history decayed score, as described above.
- Trending - the decayed score restricted to votes inside a selectable window (7, 30, or 90 days). The window decides which votes count; decay decides how much they count. A quirk worth knowing: in the 7-day window, every vote is at most 7 days old - still inside the grace period - so the weekly trending view effectively ranks by raw votes from the past week. Decay only starts differentiating servers in the 30- and 90-day windows.
- Voting leaderboard - the top-servers table ranks by the decayed score (rounded to a whole number); the top-voters table ranks people by their raw vote count. Your personal total is never decayed - only server scores are.
- Server cards - the vote count displayed on listings is always the raw total. Decay affects sort order only, so the number you see is the number the community actually cast.
Why Not Just Use Raw Votes?
A raw-count ranking freezes history at the top: the first server to accumulate 10,000 votes sits on page one forever, and a one-time burst - a launch day or a Reddit spike - becomes a permanent trophy. With decay, a burst is a lease, not a purchase. 100 extra votes today are worth +100 to your score right now, about +50 in four weeks, and roughly +10 after two months. You still get full credit immediately - you just have to keep earning it.
And why the grace period at all? Without it, a vote would start losing value the second it’s cast, and today’s vote would always be worth less than yesterday’s. We’d rather have the recent fortnight count at full strength: each visitor can vote once per rolling 24 hours, so 14 days of grace spans two full weeks of daily votes from your entire community before anything starts to fade.
What This Means for Server Owners
- Consistency beats bursts. The math above is the whole argument: 10 votes a day outperform 1,000 votes once, within two months.
- Bursts still help. Decay isn’t deletion - a launch-day spike is worth full points for two full weeks and half points for the two weeks after that.
- Diagnose your ranking. If your raw vote count is high but your position is low, your vote history is stale. A daily reminder in Discord or at spawn restarts the clock.
- Keep voters coming back. The vote widget and the tips in our promotion guide exist for exactly this.
Curious where your server stands? Check the Top list, then go earn some full-weight votes - they’re worth the most right now.