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.
Before a hand, the table shows sha256(serverSeed). The seed can't change after this.
When the hand starts, each dealt-in player's client seed is locked in. You can change yours any time.
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, riverWhat 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.