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 via pi and cached locally. Range charts and explanations can be opened full-screen; expanded range cells show the complete action mix in hover tooltips.
  • 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. Dedicated seat chips keep each blind post and latest street action visible. 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.
  • Agent Settings — choose from models discovered through Pi for the default, trainer coach, and each of the five villains, or enter any custom provider/model ID. You can also switch to heuristic-only play.

Keys: T trainer · P play · S stats · G settings · 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. In the trainer, G expands the revealed range and X expands a loaded explanation.

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 settings screen loads Pi's local model catalog and persists choices in settings.json. Per-agent models can inherit the default, while leaving the default unset uses Pi's own configured default. Environment variables override saved settings, which is useful for one-off runs and automation.

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), settings.json (Pi model routing), 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.2.1.tar.gz (50.0 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.2.1-py3-none-any.whl (55.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: poker_tui-0.2.1.tar.gz
  • Upload date:
  • Size: 50.0 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.2.1.tar.gz
Algorithm Hash digest
SHA256 4848a30f190bcbe812219eae25362a26e76fb46a68c06f4c79ffac02239744dd
MD5 d2a41f96660fa7cbee47af04a12d5747
BLAKE2b-256 08481a6587445fe50110e9b172bc3afeac9cf329ae2983a55e24fd97198cc999

See more details on using hashes here.

File details

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

File metadata

  • Download URL: poker_tui-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 55.5 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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d5b9d365b96686967dace23cc275ba07500502074cb3dc947da543e83fab59a0
MD5 cc977451064c21fcef12db21964548df
BLAKE2b-256 539a441515b63916c244074bb3e76d4108f18d29dd8962c3fcca6c0070b88bc0

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.1

2 files

0.3.0

2 files

This release

0.2.1 This release

2 files

0.2.0

2 files

0.1.0

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