Inspiration: Most poker bots either play a safe game-theory strategy or try to exploit opponents. We wanted one bot that could do both and decide which approach each opponent called for. Heads-up Short Deck 5-card PLO made this a fun challenge: only 36 cards, different hand rankings, and pots that grow very fast.

What it does: FiWBot plays heads-up Short Deck 5-card Pot-Limit Omaha as a self-contained web server. It starts from a pre-trained game-theory strategy, watches how its opponent plays, and shifts toward exploiting them once they stop looking balanced. Against players who call too much it mostly bets strong hands, and against players who fold too much it bluffs more.

How we built it: We trained a CFR+ strategy offline on the game's exact betting tree, grouping hands into strength buckets and using NumPy to process large batches of deals across multiple workers. During a match, the bot uses lookup tables and fast Monte Carlo simulation to estimate its chances against the hands an opponent is likely to hold. An opponent model tracks how often each player folds, calls and raises, and focuses on roughly the last 250 hands so it can keep up with changes. We tested it in a local arena against many play styles, and with the organizers' Docker build check.

Challenges we ran into: The biggest challenge was time: each 1,000-hand half allows only 8 seconds of total thinking on about one CPU. We also had to make sure the bot never forfeits, since five errors in a half loses the whole match. To handle both, every decision has a safe fallback, and the bot switches to cheaper methods if its time runs low. The unusual hand rankings also made normal poker intuition unreliable, and grouping hands into buckets meant constantly balancing detail against size.

Accomplishments that we're proud of: We built a bot that switches between game-theory and exploitative play on its own during a match. The trained strategy and lookup tables add only 44 MB to the base image, and decisions took about 1 ms in the organizers' smoke test. Its safeguards also mean slowdowns or bugs weaken its play instead of forfeiting the match.

What we learned: Duplicate scoring rewards consistent edges over flashy wins. When you only have milliseconds per decision, faster code directly means better decisions. A game-theory strategy is a safe starting point, but most of the extra profit comes from adapting to imperfect opponents. Testing against many different play styles also exposed weaknesses that self-play alone would have missed.

What's next for FiWBot: We want to train longer with more detailed hand groupings, add real-time solving on later streets, get better at spotting opponents who change strategy mid-match, and build a tougher set of test opponents.

Built With

Share this project:

Updates