Free 6-max No-Limit Hold'em poker trainer that runs entirely in your browser (Pyodide/WebAssembly) + the open, measured poker-bot research lab behind it: 272 modules and every measurement documented, refuted ideas included.
See the codeA 6-max No-Limit Hold'em trainer that runs entirely in your browser, and the open, measured poker-bot laboratory behind it.
▶ Play now: quantplay.io — no account, no install, no server. The Python engine (~1.5 MB) is downloaded once and runs on your machine via WebAssembly. Your hands never leave your browser.

Every decision you make is graded within the hand against the engine's own line, with a written explanation and the math behind it (pot odds, MDF, equity, solver frequencies). Five modes: GTO, Exploit (the bots learn you live), Arena (rotating adaptive opponents), Tournament (60-player MTT with exact ICM) and Match (no coaching, everything recorded for review). Details: The trainer.
docs/PROJECT_BALANCE_2026-09-10.md
says why, in detail. What remains is unusual: a bot whose every number has a source and a channel, two
catalogues that document 272 modules and every measurement, including the ideas that were refuted, and a
measurement discipline that transfers to any noisy A/B problem.CLAUDE.md, AGENTS.md, llms.txt),
the routes can be driven without HTTP, and the tests are plain python -m modules. A coding agent can pick
any module and decide: reuse, rebuild, or skip — and it can see what was already tried and failed.| Mode | What it trains |
|---|---|
| GTO | The league of profiled bots (TAG, LAG, nit, station, maniac, whale, shark, rock …) plays its baseline straight. Every decision is graded against the engine's own line with a written explanation. |
| Exploit | The bots build a live model of you and attack your leaks. You experience your own exploitability. |
| Arena | Rotating, adaptive opponent types across all stack depths. A stress test for staying disciplined. |
| Tournament | A 60-player MTT (6 tables × 10) with rising blinds, antes, table balancing, a final table and a top-9 payout. ICM hints appear once the bubble factor bites. Exact Malmuth-Harville ICM, tested against independent enumeration. |
| Match | Same opponents, no coaching, no distractions. Everything is recorded and graded for review afterwards. |
Plus: pre-fold while others still act (the hand is played out in the background and chips move correctly),
hand replay with per-decision grades, an opponent panel showing what the bots have learned about you, a
session analysis after ~100 hands, and a 61-entry glossary whose formulas are the audited ones in
knowledge_base/math/formulas.py.
pip install -r requirements.txt
python -m pokerbot.web.six_server --trainer
Python 3.12, run from the repo root; the trainer is at http://127.0.0.1:8000/training (Windows launchers in
scripts/). Bot decisions are local, instant and free; no LLM is involved in play.
web/ turns the same trainer into a static site. web/build.py zips the Python
package plus the knowledge files it reads at runtime; web/src/worker.js boots
Pyodide in a Web Worker, installs five pure-Python wheels and imports the trainer;
web/src/bridge.js replaces fetch('/api/…') so the unchanged front-end talks to the
worker instead of a server. The route dispatcher is
pokerbot/web/browser_bridge.py (it calls the FastAPI endpoints directly,
because Pyodide has no threads for the ASGI threadpool). Measured in Node + Pyodide: import 0.9 s, five full hands
with grading 0.32 s, slowest request 0.11 s (tournament 0.35 s). Tests: tests/test_browser_bridge.py.
python web/build.py # -> web/dist (deterministic, content-hashed)
python -m http.server 8765 --directory web/dist
A heuristic engine (preflop blueprint from CFR push/fold + solver-distilled tables; postflop equity, pot odds, MDF with solver-frequency advisors) wrapped in a chain of measured guards, a bounded exploit overlay, and optional real-time re-solving (TexasSolver) at river/turn nodes. Every number below has a source in the measurement catalogue; the channel decides what a number means.
| Measurement | Result | Channel / n | Meaning |
|---|---|---|---|
| Heads-up vs GTO Wizard AI (the only true GTO anchor) | −21.1 ± 9.4 bb/100 (v4, AIVAT) | live API, n = 979 | 95 % band ≈ [−39.5, −2.7]. Leaderboard top: private bots at −3.1; best frontier LLM −9.2. The current champion (v5) was never anchored. |
| v5 vs its own base | +30.6 bb/100 | paired self-play mirror | A non-regression bound, not strength. Individual guard gains (~+53) did not add up. |
| Tournament risk premium (proportional bubble factor) | +10.0 ± 5.0 pp ROI | paired SNG arena, n = 1,500 | The full bubble factor was refuted (−8 pp); the proportional one validated. |
| vs PokerSnowie via the screen bridge | +3.2 bb/100 [−37, +44] | 3,114 clean hands of 3,651 | Break-even; the automation errors, not the bot, cost the account. |
| Kaggle Game Arena heads-up (LLM field, 100 bb) | −0.7 ± 2.5 bb/100 vs champion | paired, 150 decks | A cheap volume channel, not a GTO anchor. |
| Opponents who are not GTO | +300 … +700 bb/100 | local benchmark bots | The exploit layer works against exploitable play. |
| Decision latency | 83 ms (resolver off), ~6 s (river re-solve) | single CPU core | No GPU needed: an advisor micro-benchmark gained nothing from the GPU (3.20 vs 3.52 ms; launch and transfer eat the difference), so live inference stays on CPU. |
What was learned the hard way: guards around a heuristic engine hit an asymptote (≈ −10 predicted, never reached); self-play gains do not transfer to a re-solver; the per-hand standard deviation is 294 bb, so a ±4 bb/100 answer costs ~5,400 hands; and a well-prompted frontier LLM plays heads-up better than this bot. The refuted ideas are listed explicitly in the module catalogue — for anyone rebuilding, that is the most valuable part.
Everything the project trusts came from a small set of rules, all of them learned from being wrong first:
pokerbot/benchmark/duplicate.py, pokerbot/autogym/pargate.py).Reusable pieces: paired/duplicate harnesses, the A/A gate, the bootstrap verdicts (stats.verdikt), the
pre-registration templates in docs/catalogs/CANDIDATES.md, and an exact ICM
implementation (pokerbot/strategy/icm.py).
| Path | What |
|---|---|
pokerbot/engine/ | cards, evaluator (treys), Monte-Carlo equity, the N-player table (2–10 seats, side pots) |
pokerbot/strategy/ | preflop blueprint, range tracker, postflop math, advisors, exploit model, ICM, tournament doctrine, the guard chain (auslese.py) |
pokerbot/arena/ | the opponent league (sixmax.py), MTT director, tournament arena |
pokerbot/web/ | the trainer server (six_server.py), the UI (static/training.html), the serverless bridge |
pokerbot/coach/ | decision capture, grading oracle, feedback templates, replay, opponent panel, glossary |
pokerbot/autogym/ | the self-improving loop: math oracle, paired gyms, gates, journal |
pokerbot/benchmark/ | GTO Wizard, Slumbot, Kaggle Game Arena harnesses, duplicate/paired evaluation |
pokerbot/brain/ | the engine as a typed API for programs (api.py), canonical spot format, the LLM-brain experiments |
pokerbot/vision/ | the PokerSnowie screen bridge (template matching, state gates, marathon guard) |
knowledge_base/ | extracted, structured knowledge: audited formulas, ranges, concepts, exploit playbook |
web/ | the static browser build of the trainer (quantplay.io) |
docs/ | STATE.md · catalogs/ (modules, measurements, candidates, data) · doctrine/ · plans/ · reports/ · consults/ (LLM consult transcripts) · archive/ |
research/ | one-off measurement and mining scripts (python -m research.<name>) |
tests/ | python -m tests.test_table, test_bot, test_icm, test_tournament, test_prefold, test_browser_bridge … |
scripts/ | Windows launchers |
For AI agents: AGENTS.md (how to work here), llms.txt (machine-readable map),
CLAUDE.md (full conventions and doctrine). Cite via CITATION.cff.
PolyForm Noncommercial 1.0.0. Use, copy, modify and share everything here for noncommercial
purposes: personal study, research, teaching, hobby projects, noncommercial organizations. Any commercial use
— selling, running as a paid service, using the bot, trainer, ranges, knowledge base or measurements inside a
commercial product or to make money at the tables for a business — requires written permission from
Leonhard Hampe (open a GitHub issue). Keep the NOTICE file with every copy.
Closed as a leaderboard race on 2026-09-10; published and kept alive as a trainer and a reference on 2026-09-24. Large artifacts (solver caches, trained nets, LLM checkpoints, hand histories) and the source books are not in the repository. Most documentation was translated from German; code comments are partly still German.
Python
96.0%
HTML
3.0%
Free 6-max No-Limit Hold'em poker trainer that runs entirely in your browser (Pyodide/WebAssembly) + the open, measured poker-bot research lab behind it: 272 modules and every measurement documented, refuted ideas included.
See the codeA 6-max No-Limit Hold'em trainer that runs entirely in your browser, and the open, measured poker-bot laboratory behind it.
▶ Play now: quantplay.io — no account, no install, no server. The Python engine (~1.5 MB) is downloaded once and runs on your machine via WebAssembly. Your hands never leave your browser.

Every decision you make is graded within the hand against the engine's own line, with a written explanation and the math behind it (pot odds, MDF, equity, solver frequencies). Five modes: GTO, Exploit (the bots learn you live), Arena (rotating adaptive opponents), Tournament (60-player MTT with exact ICM) and Match (no coaching, everything recorded for review). Details: The trainer.
docs/PROJECT_BALANCE_2026-09-10.md
says why, in detail. What remains is unusual: a bot whose every number has a source and a channel, two
catalogues that document 272 modules and every measurement, including the ideas that were refuted, and a
measurement discipline that transfers to any noisy A/B problem.CLAUDE.md, AGENTS.md, llms.txt),
the routes can be driven without HTTP, and the tests are plain python -m modules. A coding agent can pick
any module and decide: reuse, rebuild, or skip — and it can see what was already tried and failed.| Mode | What it trains |
|---|---|
| GTO | The league of profiled bots (TAG, LAG, nit, station, maniac, whale, shark, rock …) plays its baseline straight. Every decision is graded against the engine's own line with a written explanation. |
| Exploit | The bots build a live model of you and attack your leaks. You experience your own exploitability. |
| Arena | Rotating, adaptive opponent types across all stack depths. A stress test for staying disciplined. |
| Tournament | A 60-player MTT (6 tables × 10) with rising blinds, antes, table balancing, a final table and a top-9 payout. ICM hints appear once the bubble factor bites. Exact Malmuth-Harville ICM, tested against independent enumeration. |
| Match | Same opponents, no coaching, no distractions. Everything is recorded and graded for review afterwards. |
Plus: pre-fold while others still act (the hand is played out in the background and chips move correctly),
hand replay with per-decision grades, an opponent panel showing what the bots have learned about you, a
session analysis after ~100 hands, and a 61-entry glossary whose formulas are the audited ones in
knowledge_base/math/formulas.py.
pip install -r requirements.txt
python -m pokerbot.web.six_server --trainer
Python 3.12, run from the repo root; the trainer is at http://127.0.0.1:8000/training (Windows launchers in
scripts/). Bot decisions are local, instant and free; no LLM is involved in play.
web/ turns the same trainer into a static site. web/build.py zips the Python
package plus the knowledge files it reads at runtime; web/src/worker.js boots
Pyodide in a Web Worker, installs five pure-Python wheels and imports the trainer;
web/src/bridge.js replaces fetch('/api/…') so the unchanged front-end talks to the
worker instead of a server. The route dispatcher is
pokerbot/web/browser_bridge.py (it calls the FastAPI endpoints directly,
because Pyodide has no threads for the ASGI threadpool). Measured in Node + Pyodide: import 0.9 s, five full hands
with grading 0.32 s, slowest request 0.11 s (tournament 0.35 s). Tests: tests/test_browser_bridge.py.
python web/build.py # -> web/dist (deterministic, content-hashed)
python -m http.server 8765 --directory web/dist
A heuristic engine (preflop blueprint from CFR push/fold + solver-distilled tables; postflop equity, pot odds, MDF with solver-frequency advisors) wrapped in a chain of measured guards, a bounded exploit overlay, and optional real-time re-solving (TexasSolver) at river/turn nodes. Every number below has a source in the measurement catalogue; the channel decides what a number means.
| Measurement | Result | Channel / n | Meaning |
|---|---|---|---|
| Heads-up vs GTO Wizard AI (the only true GTO anchor) | −21.1 ± 9.4 bb/100 (v4, AIVAT) | live API, n = 979 | 95 % band ≈ [−39.5, −2.7]. Leaderboard top: private bots at −3.1; best frontier LLM −9.2. The current champion (v5) was never anchored. |
| v5 vs its own base | +30.6 bb/100 | paired self-play mirror | A non-regression bound, not strength. Individual guard gains (~+53) did not add up. |
| Tournament risk premium (proportional bubble factor) | +10.0 ± 5.0 pp ROI | paired SNG arena, n = 1,500 | The full bubble factor was refuted (−8 pp); the proportional one validated. |
| vs PokerSnowie via the screen bridge | +3.2 bb/100 [−37, +44] | 3,114 clean hands of 3,651 | Break-even; the automation errors, not the bot, cost the account. |
| Kaggle Game Arena heads-up (LLM field, 100 bb) | −0.7 ± 2.5 bb/100 vs champion | paired, 150 decks | A cheap volume channel, not a GTO anchor. |
| Opponents who are not GTO | +300 … +700 bb/100 | local benchmark bots | The exploit layer works against exploitable play. |
| Decision latency | 83 ms (resolver off), ~6 s (river re-solve) | single CPU core | No GPU needed: an advisor micro-benchmark gained nothing from the GPU (3.20 vs 3.52 ms; launch and transfer eat the difference), so live inference stays on CPU. |
What was learned the hard way: guards around a heuristic engine hit an asymptote (≈ −10 predicted, never reached); self-play gains do not transfer to a re-solver; the per-hand standard deviation is 294 bb, so a ±4 bb/100 answer costs ~5,400 hands; and a well-prompted frontier LLM plays heads-up better than this bot. The refuted ideas are listed explicitly in the module catalogue — for anyone rebuilding, that is the most valuable part.
Everything the project trusts came from a small set of rules, all of them learned from being wrong first:
pokerbot/benchmark/duplicate.py, pokerbot/autogym/pargate.py).Reusable pieces: paired/duplicate harnesses, the A/A gate, the bootstrap verdicts (stats.verdikt), the
pre-registration templates in docs/catalogs/CANDIDATES.md, and an exact ICM
implementation (pokerbot/strategy/icm.py).
| Path | What |
|---|---|
pokerbot/engine/ | cards, evaluator (treys), Monte-Carlo equity, the N-player table (2–10 seats, side pots) |
pokerbot/strategy/ | preflop blueprint, range tracker, postflop math, advisors, exploit model, ICM, tournament doctrine, the guard chain (auslese.py) |
pokerbot/arena/ | the opponent league (sixmax.py), MTT director, tournament arena |
pokerbot/web/ | the trainer server (six_server.py), the UI (static/training.html), the serverless bridge |
pokerbot/coach/ | decision capture, grading oracle, feedback templates, replay, opponent panel, glossary |
pokerbot/autogym/ | the self-improving loop: math oracle, paired gyms, gates, journal |
pokerbot/benchmark/ | GTO Wizard, Slumbot, Kaggle Game Arena harnesses, duplicate/paired evaluation |
pokerbot/brain/ | the engine as a typed API for programs (api.py), canonical spot format, the LLM-brain experiments |
pokerbot/vision/ | the PokerSnowie screen bridge (template matching, state gates, marathon guard) |
knowledge_base/ | extracted, structured knowledge: audited formulas, ranges, concepts, exploit playbook |
web/ | the static browser build of the trainer (quantplay.io) |
docs/ | STATE.md · catalogs/ (modules, measurements, candidates, data) · doctrine/ · plans/ · reports/ · consults/ (LLM consult transcripts) · archive/ |
research/ | one-off measurement and mining scripts (python -m research.<name>) |
tests/ | python -m tests.test_table, test_bot, test_icm, test_tournament, test_prefold, test_browser_bridge … |
scripts/ | Windows launchers |
For AI agents: AGENTS.md (how to work here), llms.txt (machine-readable map),
CLAUDE.md (full conventions and doctrine). Cite via CITATION.cff.
PolyForm Noncommercial 1.0.0. Use, copy, modify and share everything here for noncommercial
purposes: personal study, research, teaching, hobby projects, noncommercial organizations. Any commercial use
— selling, running as a paid service, using the bot, trainer, ranges, knowledge base or measurements inside a
commercial product or to make money at the tables for a business — requires written permission from
Leonhard Hampe (open a GitHub issue). Keep the NOTICE file with every copy.
Closed as a leaderboard race on 2026-09-10; published and kept alive as a trainer and a reference on 2026-09-24. Large artifacts (solver caches, trained nets, LLM checkpoints, hand histories) and the source books are not in the repository. Most documentation was translated from German; code comments are partly still German.
Python
96.0%
HTML
3.0%