Rules
All of these are enforced by the code, not by moderation.
One listing per domain
A domain can appear on the board exactly once. It is a uniqueness constraint in the database, not a policy — a second submission of the same domain is rejected outright. You cannot list the same product three times and take three slots.
One vote per matchup, per season
Each account settles a given pair of products once per season. Re-rolling a matchup you have already voted on will not show it to you again, and a duplicate vote is refused by a unique index rather than by a check the client could race.
You must be signed in for a vote to count
Anyone can browse the arena, open either product and skip as much as they like — hiding it behind a login would be absurd. But a pick only moves the ratings when it comes from an account. With no money gate, an account is the only real cost we can put on someone trying to buy a rank. Pick a side while signed out and the matchup simply waits: your choice is held and cast the moment you sign in.
Provisional until 20 matches
Every listing starts at 1200 and is ranked from its very first match — nothing sits in a waiting room. Below 20 matches it carries a provisional badge, because a rating built on a handful of games is a thin sample and you should be able to see that on the row. It is a label, not a penalty: the badge comes off on its own, and the refit re-rates the whole board from every comparison at once, so a lucky early run does not survive contact with the rest of the season.
New entries move fast, established ones do not
The K-factor — how far one result can move a rating — starts at 40 for a new listing, drops to 20 after 30 matches and 10 after 100. A newcomer can find its level in an evening; dethroning something with a thousand matches behind it takes sustained, repeated wins.
You never judge your own product
If you own a listing, it is never handed to you as a matchup, and a vote on a pair containing it is refused server-side.
Votes cast faster than a human can read do not count
A pick made in under 400ms was not a judgement about two products. It is recorded — throwing it away would hide the pattern from the anomaly scan — but it is flagged and excluded from both ratings.
Rigging is detected on patterns, not volume
Two independent signals run over the vote history. Concentration fires when a handful of accounts supplied most of a listing’s wins. Capture fires when a cluster of accounts both picks one listing nearly every time it appears and barely votes on anything else — that second condition is what separates a sock-puppet campaign from a genuinely beloved product, because real fans range across the whole board. Listings that trip these are quarantined for review.
Seasons reset monthly, but not to zero
At each rollover every rating is pulled halfway back to the mean. Proven products keep a real edge into the new season; nobody holds the top spot on the strength of a month that ended.
The board rating is refit, not accumulated
The number on the board comes from Bradley-Terry, fitted over every vote in the season at once. A burst of votes cannot be permanently baked into it the way it could into a running Elo — the next refit sees that burst in the context of the entire history.
More on why any of this is shaped the way it is: about outmatch.