Skip to main content

Poker TUI

A terminal gym for no-limit hold'em: drill preflop decisions against GTO-style charts, then play 6-max cash games (100bb) against agents powered by the local pi coding-agent CLI. Built with Textual and managed with uv. Requires Python 3.11 or newer.

Quick start

uvx poker-tui

uvx downloads the published package into an isolated, cached environment and starts the TUI without a manual install. For a persistent command:

uv tool install poker-tui
poker-tui

Check the installed release with poker-tui --version.

Screens:

  • Preflop Trainer — random spots (RFI + facing opens across all positions), you pick fold/call/raise, graded against built-in charts with frequencies. Reveals a 13x13 range grid after each decision, tracks accuracy by seat, and "Why?" explanations in three styles (newb / learner / expert) generated by ox-alpha via pi and cached locally.
  • Play vs Agents — six-handed NLHE, unitless BB, auto-rebuy. Five villain seats decide via pi (one-shot LLM calls) with a fast heuristic bot as fallback. Once you're out of a hand the rest plays out at high speed; N jumps to the next deal.
  • Stats — quiz accuracy by spot and table results.

Keys: T trainer · P play · S stats · Q quit · inside screens N next, Esc back. Trainer actions use F/C/R; table actions use F to fold, C to check or call, and R to raise at the selected size. S changes table speed.

Agents

Villain brains come from the pi CLI in print mode (pi -p --no-tools --no-session ...). Each seat gets one of four personas; invalid/failed LLM replies fall back to the heuristic bot (chart-based preflop, Monte-Carlo-equity postflop) automatically.

Environment:

Variable Effect
POKER_GYM_BOTS=heuristic skip LLM entirely (fast, free, offline)
POKER_GYM_PI_ARGS="--model anthropic/..." pick model/provider for pi

The solver

poker_gym.solve implements CFR+ over heads-up preflop subgames on top of a 169×169 all-in equity matrix (poker_gym.equity) computed by a custom vectorized numpy 7-card evaluator that is fuzz-tested against treys.

uvx --from poker-tui poker-gym-solve --quality fast --jobs 4
uvx --from poker-tui poker-gym-stats

Quality tiers: fast (~2k trials/matchup), standard (4k), thorough (8k). Builds are chunked with deterministic seeds and checkpointed, so they can be interrupted and resumed, and parallelized with --jobs. On a Raspberry Pi, prefer --quality fast --jobs 4; the evaluator is int32/vectorized to keep the working set cache-friendly.

Honest caveat: the solver's game abstraction folds everyone but two players and models postflop as equity × realization factors. Calibration shows this cannot reproduce position-dependent open frequencies (UTG and BTN become literally the same game), so the trainer grades against hand-calibrated charts modeled on published solver baselines; solver output is stored separately as an experimental "solver view" (kind='solver' in the charts table).

Data

Everything persists under $XDG_DATA_HOME/poker_gym (default ~/.local/share/poker_gym): gym.db (quiz attempts, hand histories, explanation cache, charts) and equity.npz.

Development

uv sync
uv run poker-tui
uv run pytest -m "not slow"   # full suite minus long equity-matrix test
uv run pytest -m slow         # equity matrix sanity (builds a small matrix)
uv run python scripts/smoke_app.py    # headless TUI smoke test

Build the same artifacts uploaded to PyPI with:

uv build --clear
uv publish

Layout: src/poker_gym/cards, ranges (chart DSL), charts (the ranges themselves — edit freely, they're plain strings), spots (trainer), engine (table state machine), agents, explain, equity, solve, db, cli, app.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

poker_tui-0.1.0.tar.gz (44.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

poker_tui-0.1.0-py3-none-any.whl (50.0 kB view details)

Uploaded Python 3

File details

Details for the file poker_tui-0.1.0.tar.gz.

File metadata

  • Download URL: poker_tui-0.1.0.tar.gz
  • Upload date:
  • Size: 44.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for poker_tui-0.1.0.tar.gz
Algorithm Hash digest
SHA256 917b0d28a4737cd989c7fd2dbf624c1e23798596b3b8e22d991d627268c20067
MD5 ae501a2fba7fdf282a5895d88b0e3c8c
BLAKE2b-256 4c0ac3a3b880002086014ef3aba2519f611ad3d17539c81343638e91c751303c

See more details on using hashes here.

File details

Details for the file poker_tui-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: poker_tui-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 50.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.28 {"installer":{"name":"uv","version":"0.9.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for poker_tui-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 99a551c5146adf5e52bca16d5bb900a9bfa9bbcb67b0adc75eaf983be428f409
MD5 f2e7bac933640f79723604d583b8bf76
BLAKE2b-256 5c48fd9984e75b9f8be228f96ada4718fa061b2a58de41b12b68a84af698bb93

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page