Provably fair

Every deck is generated from a server seed the house commits to before the hand, mixed with client seeds chosen by the players at the table. After the hand the server seed is revealed, so anyone can recompute the shuffle and check every card that was dealt. Verification runs entirely in your browser.

1. Commit

Before a hand, the table shows sha256(serverSeed). The seed can't change after this.

2. Mix

When the hand starts, each dealt-in player's client seed is locked in. You can change yours any time.

3. Reveal

After the hand, the server seed is published. Hash it, re-shuffle, and compare with what was dealt.

Verify a hand

The algorithm

commitment = sha256(utf8(serverSeed))                       // hex
message    = tableId + ":" + handNumber + ":" + clientSeeds.join(",")   // seeds in deal order
stream     = HMAC_SHA256(key=utf8(serverSeed), utf8(message + ":" + i)) for i = 0, 1, 2, ...
randInt(n) = next 4 bytes as big-endian uint32 x; reject x >= floor(2^32/n)*n; return x % n

deck = [2c 2d 2h 2s 3c ... As]                                // ranks 2..A, suits c d h s
for i = 51 down to 1: j = randInt(i+1); swap(deck[i], deck[j])  // Fisher-Yates

deal: one card to each player starting left of the button, twice;
      then burn, flop x3, burn, turn, burn, river

What this proves: the deck was fixed by a seed chosen before the client seeds were known, so the house could not arrange the cards. What it can't prove: as the dealer, the server knows the deck during the hand, just as any online poker room does.

Compute from raw inputs