How the dice are fair

Your roll is not drawn when you press. It is determined at UTC midnight by that day's secret and merely discovered. Once the day is over the secret is published, and anyone can recompute any roll from it, forever.

Nobody can predict tomorrow, because tomorrow's secret does not exist yet. And nothing can be gained by learning one early: you cannot reroll, decline, or time your entry into a better outcome, so the worst an early leak could do is spoil a surprise.

Check a roll

This runs in your browser, on the published secret, with the algorithm below. Nothing is sent anywhere.

Checkable days run from 2026-08-11 to 2026-09-25. A day's secret is published once the day is over.

A signed-in Player finds theirs on their own profile, under Your account. Any roll page for a closed day fills this in for you.

That day's published secret

0df0d0c53ae3e4647a2ab27775afa9fa3507ad9c5e0eebd3177e360b59142c18

The algorithm, exactly

This is normative. Anyone reimplementing it should reproduce our faces byte for byte.

Message
YYYY-MM-DD|<player_id>
The UTC date and the canonical lowercase hyphenated uuid. The date is in the message even though the secret is already per-day, so a secret can never be replayed across days.
Key
That day's secret: 32 bytes, published as 64 hex characters.
Stream
HMAC-SHA256(secret, message)
32 bytes. If exhausted, the next block is HMAC-SHA256(secret, message + "|1"), then "|2", and so on. A second block has never been needed; the rule exists so the behaviour is defined rather than undefined.
Dice, in this fixed order
d4, d6, d8, d10, d12, d20
Per die of n sides
limit = 256 − (256 mod n); discard any byte ≥ limit; face = (byte mod n) + 1
Rejection rather than plain modulo, because 256 is not a multiple of 6, 10, 12 or 20, so plain modulo would make low faces come up measurably more often on four of the six dice. Expected consumption is 6.1224 of the 32 bytes available.
Die Sides Limit Bytes rejected
d442560.00%
d662521.56%
d882560.00%
d10102502.34%
d12122521.56%
d20202406.25%

How the score follows from the faces

Every one of the 460,800 possible rolls is scanned against the same 166 badge rules. Within each family only the rarest badge you matched is charged for, and every one of those pays its own rarity:

EP(badge) = round(460 × weight × log2(1 ÷ P(badge))3)
EP(roll) = the sum of them

So a rarer badge is worth more than a commoner one of the same weight, exactly and checkably, and the rungs beneath the one that counted are still earned without being paid for twice. The weight is 1 for every badge that says something about the roll and 0.08 for the six per-die families, which say only which face came up: one member of each fires on every roll no matter what, so paying them in full made two thirds of an ordinary score a fee everybody paid alike.

EP runs from 9,993 on the most ordinary roll possible to 9,819,430 on the rarest, and every rung of the tier ladder including SSS is a percentile cut off that distribution. The scale is still lopsided and that is the formula being honest rather than a flaw: a badge occurring once in 460,800 rolls pays 3,063,276 by itself, so a median roll sits at half a percent of the maximum. Compare yourself against the percentile, never against the ceiling.

One thing a sum cannot do, said plainly because the mirror above rests on it: two rolls of identical probability need not score identically. Six ones and every die at its maximum are both exactly one in 460,800, and they score 9,819,430 and 5,640,404, because the first earns a deeper ladder of badges than the second. Both are SSS.

What publishing a roll costs you

The verifier needs a player id, and a shared roll page publishes yours. Day secrets are published once their day is over and are kept forever. So anyone holding a link to one of your rolls can recompute your faces for every closed day in Raredle's history, including days you never claimed.

We opened that door on purpose. A verifier only you could run would prove nothing to anyone else, which would leave the fairness claim existing only in this paragraph. Know that before you share.