Proof.
Every night at 00:20 UTC, 10% of the pool wins a spot and leaves it. Everyone else stays in for the next night. Each round is decided by a random seed we commit to before it runs: the hash goes up a day early, the seed itself comes out once the round is drawn, and the pool it was drawn from is frozen and published. Anyone can replay any round and confirm it produced the winners we published.
The next round
b446a3ca6bf5aff2a341184dc81ff855de37475447c8cfcb160ca4cf17e178d3Committed Sat, 26 Sep 2026 01:19:05 GMT. It draws at 00:20 UTC.
How to check a round
Each entry in the round's pool gets a key of u ^ (1 / tickets), where u comes from HMAC-SHA256(seed, entryId). The highest ceil(pool × 10%) keys win, capped by the spots left. More tickets pushes your key closer to 1, so the weighting is exact, and because every input is published, the result is reproducible.
// pool: the round's frozen entries, published below
const key = (seed, id, tickets) => {
const mac = crypto.createHmac("sha256", seed).update(id).digest();
const hi = mac.readUInt32BE(0) & 0xfffff; // 20 bits
const lo = mac.readUInt32BE(4); // 32 bits
const u = (hi * 2 ** 32 + lo + 1) / (2 ** 52 + 1);
return Math.pow(u, 1 / Math.max(1, tickets));
};
const n = Math.min(SPOTS_LEFT, Math.max(1, Math.ceil(pool.length * 1000 / 10000)));
pool
.map(e => ({ ...e, k: key(SEED, e.id, e.tickets) }))
.sort((a, b) => b.k - a.k || a.id.localeCompare(b.id))
.slice(0, n)
.map(e => e.id);Same code the draw runs, from src/lib/draw.ts. Ties break on entry id so the order is fully determined.