CloakzyLive
Sign in with Kick

Provably fair

Every card and every number, checkable after the fact

How it works

Before you play a single hand, the server picks a secret server seed and shows you only its SHA-256 hash. That hash is a commitment: it fixes the seed in advance, and it cannot be changed afterwards without the hash changing too.

You supply your own client seed. Because half the input is yours, the house cannot have picked a shuffle that beats you — it would have needed your seed first. A nonce counts rounds, so one pair of seeds gives a different result every hand.

When you rotate your seeds, the old server seed is revealed. Hash it: if it matches the commitment you were shown, it was never swapped. Then re-run the shuffle below and confirm every card you were dealt.

The seed is only revealed once it is out of play. A revealed seed that was still live would let anyone compute the next hand before it was dealt, which is why rotating happens first and revealing second.
Check a round

Re-deals the shoe for one round.

Only shown after the seed is rotated out. Rotate yours on any game table to reveal the one you have been playing on.
This is the important one. It proves the seed existed before the round and was not swapped afterwards.
Whatever you set on the table. Yours, not ours.
Counts up by one each round on the same seed pair.
Check it without trusting us

The form above runs on this server, which is convenient but proves nothing to anyone who suspects the server. This is the whole algorithm — save it as verify.mjs and run node verify.mjs on your own machine. It uses nothing from this site.

import { createHash, createHmac } from "node:crypto";

// ---- paste yours here -------------------------------------------------
const SERVER_SEED = "";   // revealed seed
const CLIENT_SEED = "";   // yours
const NONCE       = 0;
// -----------------------------------------------------------------------

// 1. The commitment. This must equal the hash you were shown BEFORE playing.
console.log("sha256(serverSeed) =", createHash("sha256").update(SERVER_SEED, "utf8").digest("hex"));

// 2. The number stream: HMAC-SHA256(key=serverSeed, msg="clientSeed:nonce:cursor"),
//    read four bytes at a time as a base-256 fraction.
function* floats(serverSeed, clientSeed, nonce) {
  for (let cursor = 0; ; cursor++) {
    const b = createHmac("sha256", serverSeed)
      .update(`${clientSeed}:${nonce}:${cursor}`, "utf8")
      .digest();
    for (let i = 0; i + 4 <= b.length; i += 4) {
      yield b[i] / 256 + b[i+1] / 256**2 + b[i+2] / 256**3 + b[i+3] / 256**4;
    }
  }
}

// 3a. KENO - ten distinct numbers from 1..40, partial Fisher-Yates.
{
  const f = floats(SERVER_SEED, CLIENT_SEED, NONCE);
  const pool = Array.from({ length: 40 }, (_, i) => i + 1);
  const drawn = [];
  for (let i = 0; i < 10; i++) {
    let j = i + Math.floor(f.next().value * (40 - i));
    if (j > 39) j = 39;
    [pool[i], pool[j]] = [pool[j], pool[i]];
    drawn.push(pool[i]);
  }
  console.log("keno drawn =", drawn.join(", "));
}

// 3b. BLACKJACK - 6 decks, 312 cards, full Fisher-Yates from the top down.
{
  const RANKS = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"];
  const SUITS = ["s","h","d","c"];
  const shoe = [];
  for (let d = 0; d < 6; d++) for (let c = 0; c < 52; c++) shoe.push(c);

  const f = floats(SERVER_SEED, CLIENT_SEED, NONCE);
  for (let i = shoe.length - 1; i > 0; i--) {
    const j = Math.floor(f.next().value * (i + 1));
    [shoe[i], shoe[j]] = [shoe[j], shoe[i]];
  }
  const label = (n) => RANKS[n % 13] + SUITS[Math.floor(n / 13) % 4];
  console.log("first 8 cards =", shoe.slice(0, 8).map(label).join(" "));
}

If those numbers differ from what the game showed you, something is wrong and we want to know — take a screenshot and tell a moderator.