Twenty Nine · Twenty Nine game verifier

Offline game proof and receipt checker. Synthetic example only; no game-server calls. Verifier snapshot 2026-10-24.

HTML

<main class="verifier" aria-labelledby="title">
  <header><span class="eyebrow">TWENTYNINE.IO / OPEN VERIFIER</span><span class="local">Runs in your browser</span><h1 id="title">Twenty Nine</h1><p class="lead">Verify the game. Inspect the evidence.</p><p>All four players’ recorded client seeds are combined with each deal’s server secret and pinned public randomness. The checker validates the beacon, deck, transcript and settlement.</p></header>
  <section class="instructions"><h2>Start with your proof</h2><ol><li>After the entire game ends, open its proof in History or Fairness on twentynine.io.</li><li>Download the proof JSON. Open it below or paste the JSON text. Add “my receipt” if you saved it.</li><li>Select Verify game. A matching calculation and a matching original receipt are reported separately.</li></ol><p>Use the seeds recorded in that game’s proof, even if you have since regenerated your account seed.</p></section>
  <div class="inputs"><section><label for="proof">Game proof <span>Required · up to 8 MiB</span></label><input type="file" id="proof-file" accept=".json,application/json" aria-label="Open game proof JSON"><textarea id="proof" spellcheck="false" placeholder="Paste the downloaded proof JSON here…"></textarea></section><section><label for="receipt">Your saved receipt <span>Optional</span></label><input type="file" id="receipt-file" accept=".json,application/json" aria-label="Open saved receipt JSON"><textarea id="receipt" spellcheck="false" placeholder="Paste your separately saved receipt, if available…"></textarea></section></div>
  <div class="actions"><button id="verify" type="button">Verify game</button><button id="example" class="secondary" type="button">Load example</button><button id="clear" class="secondary" type="button">Clear</button><button id="download" class="secondary" type="button" disabled>Download report</button></div>
  <p id="notice" role="status">No game loaded. Your proof stays in this verifier; no request is sent to...

CSS

*{box-sizing:border-box}body{margin:0;background:#101318;color:#edf2f3;font:15px/1.6 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}.verifier{max-width:1060px;margin:auto;padding:36px 24px 56px}header{border-bottom:1px solid #303942;padding-bottom:24px}.eyebrow{color:#9ee8d7;font-size:11px;font-weight:750;letter-spacing:.13em}.local{float:right;color:#9eaaaF;font-size:12px}h1{font-size:clamp(30px,6vw,48px);line-height:1.05;letter-spacing:-.04em;margin:22px 0 10px}h2{font-size:18px;margin:0 0 10px}h3{font-size:14px;margin:0}.lead{font-size:19px;color:#f2f7f5;margin:0 0 14px}p{color:#b3bfc5;margin:8px 0}.instructions{margin:24px 0;padding:20px;background:#1a2028;border:1px solid #303942;border-radius:12px}ol{padding-left:22px;margin:8px 0}.inputs{display:grid;grid-template-columns:1.25fr 1fr;gap:20px}label{display:block;font-weight:650;margin-bottom:10px}label span{display:block;color:#91a1aa;font-size:12px;font-weight:400}input[type=file]{display:block;font-size:12px;max-width:100%;margin:10px 0;color:#b3bfc5}input::file-selector-button{border:1px solid #435159;border-radius:6px;background:#202831;color:#e7f0ee;padding:7px 11px;margin-right:9px;cursor:pointer}textarea{resize:vertical;min-height:235px;width:100%;border:1px solid #435159;border-radius:9px;background:#0d1015;color:#dde9e7;padding:14px;font:12px/1.55 ui-monospace,SFMono-Regular,Consolas,monospace}textarea:focus,button:focus-visible{outline:2px solid #99e8d4;outline-offset:3px}.actions{display:flex;flex-wrap:wrap;gap:10px;margin:20px 0 10px}button{background:#9de4d3;color:#0e2620;border:1px solid transparent;border-radius:8px;font:650 14px system-ui;padding:12px 18px;cursor:pointer}button.secondary{background:#202831;border-color:#39454e;color:#e3eeec}button:disabled{opacity:.5;cursor:wait}#notice{font-size:13px;min-height:23px}#result{margin-top:24px;padding:22px;background:#1a2028;border:1px solid...

JavaScript

/*! Third-party licenses
The MIT License (MIT)

Copyright (c) 2022 Paul Miller (https://paulmillr.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
The MIT License (MIT)

Copyright (c) 2022 Paul Miller (https://paulmillr.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND...