Choose NLHE, PLO or PLO5 in the left pane's Game row, then set the players and stack below it. Each game remembers your last solve and keeps its own practice accuracy.
Your first visit opens Postflop Study. Later visits restore your last mode. This guide covers the shared controls, with separate sections for the PLO5 library and NLHE library.
Two different controls are called Game. The left-pane Game row picks NLHE, PLO or PLO5. The Game pill in the mode row at the top of the center pane opens Game mode.
Players
Choose HU or 6max. All three games support both formats.
- HU - Heads-up. Positions are OOP (out of position) and IP (in position).
- 6max - Six seats: UTG, HJ, CO, BTN, SB and BB.
Stack sizes
The Stacks row below picks the effective stack in big blinds. Every depth is its own solve:
| Game | HU | 6max |
|---|---|---|
| PLO | 100bb | 12, 20, 30, 40, 50, 100, 150 and 200bb |
| PLO5 | 100bb | 100bb |
| NLHE | 100bb | 20, 30, 40, 50, 70, 100, 150 and 200bb |
Changing stacks keeps your board and follows the same action path as far as the new solve allows. A message identifies where the path stops if a size is unavailable. In NLHE, the selected depth's rake appears below Stacks; see the NLHE library.
Seats (6max)
In 6-max Postflop Study, pick two positions in Seats. Clicking a third replaces the seat you picked first. The pair selects one of the 15 heads-up postflop matchups and determines the available preflop lines.
In Postflop Practice, use the Hero and Opponent rows. Preflop Practice has a Hero Position row. In Preflop Study, click a seat on the table.
Open Postflop Study, pick NLHE, PLO or PLO5, then set the table size and stack. A sample flop is the fastest way to see the strategy. For a specific hand from your games, choose the seats and preflop line first, then enter its flop.
Choose your daily flop
A free account gets one flop of its own each Chicago day, alongside the three rotating sample flops. Press Your flop (or Choose a flop), pick three cards and confirm the choice. The confirmation spends that day's choice. Opening the picker or following a link to an unavailable board does not choose it for you.
Your chosen flop is available across PLO, PLO5 and NLHE, at every available stack depth. Switching games does not create another choice. Your chosen flop appears beside the sample flops so you can return to it.
On that flop, you choose five distinct cards total to reuse on the turn or river. Pick a new card to add it to the pool. Pick one already in the pool to reuse it. With 2s and 9h chosen, you can study a 2s turn and 9h river, then reverse them on another line without spending another card. A card already on the board cannot be dealt again.
You can fill the remaining slots later. Once all five are filled, you cannot replace a card until the reset. Both the flop and its pool reset at midnight Chicago time. The pool is separate from the extra runouts earned by a streak on the rotating flops. Free runout depth explains that ladder. Core lets you choose every board and runout.
Guided study
From the welcome screen, press Start guided study on "Work through a 3-bet pot", or launch it from Guided study on the site. It uses your selected game and a 6-max 100bb line: BTN opens, BB 3-bets, BTN calls.
The guide takes you through BB's flop betting range, the AA hands within it, BTN's call, a checked-through turn and a river bet into BTN's decision. You make the actions in the normal solver controls. Reading steps have a Next button. You choose the turn and river yourself from the cards you can study, so the guide does not spend your flop or runout choices automatically.
Read both range panels at each step. Filtering to AA changes which hands you are inspecting. Calling a bet changes which hands reach the next decision. Bet labels and the AA example follow the selected game, including its two, four or five hole cards. Changing games restarts the setup.
Turn a hand into a drill
- Rebuild the hand in Study with the right stack, seats and preflop line. Follow the actions to the decision you want to check.
- Read the whole range's action bar, then filter to your hand or hand group. Check what your cards remove from the opponent's range.
- Change one runout card and compare the hands that change action. Write down the reason you expect the strategy to move.
- Open Postflop Practice and set the same line, seats and street. Use Starting hands and Boards to repeat the part you missed.
Use Copy link to keep a library decision or send it to a study partner. Use Open in Notebook for a repeatable query. If the question depends on an opponent departing from the solver, use node locking and save it in My locked spots.
Browse the preflop strategy for every position, line and stack depth, down to single hands: how often the solver opens, 3-bets, calls or folds with each hand class. Preflop Study never counts against the practice meter, so it stays open when the day's practice hands are gone.
Configure the spot
Preflop Action - A row of toggle buttons selects which preflop decision you're studying:
- RFI - Raise first in (open-raising). The first aggressive action preflop.
- vs RFI - Facing an open raise (the 3-bet decision).
- vs 3-Bet - The original raiser facing a 3-bet (the 4-bet decision).
- vs 4-Bet - Facing a 4-bet (the 5-bet decision).
- vs 5-Bet and vs 6-Bet - Deeper re-raise levels (when available).
- vs Limp, vs Limp-Raise, etc. - Limp-related lines (when available for the solve).
Opener / Opponent - Lines past RFI add a second row of position buttons. For vs RFI it is labeled Opener and picks who opened; for deeper lines (vs 3-Bet, vs 4-Bet and the limp lines after vs Limp) it is labeled Opponent and picks who you're facing. vs Limp itself has no second row. The first available opener is selected for you when you switch lines.
Together, Preflop Action and Opener/Opponent fix the decision point. Changing the line clears any category, action and tag filters you had set.
Read the strategy table
The center pane shows a poker table visualization and a strategy table for the selected preflop line.
Poker Table - A compact top-down view with a seat box per position. Seats sit in fixed places (no hero rotation); the position you're studying is highlighted, and stacks show for the players in the scenario. Click any seat that has a decision in this line to switch to its strategy - this is how Preflop Study picks the seat.
A › beside an action means it opens the next published decision. Click a raise to study the next player's response, or a limp to open the next vs Limp spot. The tooltip names the destination. Folds and calls that close the preflop action keep you on the current decision.
Spot summary - Above the category table, one line names the spot and how much of the deal reaches it ("UTG RFI ... 100.0% of hands"), over a bar of the node's fold, call and raise mix. The bar adds up to 100% of the hands that reach the spot, and clicking a segment filters by that action.
Strategy Table - Hands are organized into collapsible meta-groups, each expanding to its categories. PLO and PLO5 share nine groups - Aces, High Pairs, Medium Pairs, Low Pairs, Rundowns, Gapped, 2-3 Broadway, Ace-High and Trash - holding 40 categories in PLO and 42 in PLO5, which adds Five-Card Rundown and Five-Card 1-Gap and marks the rundown labels "+ D" where the fifth card is a dangler. NLHE groups its 169 hands as Pairs, Broadway, Ax, Suited and Offsuit. A group with no hands reaching the spot is hidden.
For each category row, you see:
- Category name - e.g., "AA + Broadway", "High Rundown"
- Hands - The category's share of every dealt combo in the game that arrives at this decision. The column adds up to the spot's reach from the summary line, so it only totals 100% on a spot every hand reaches.
- Action Mix bar - Colored segments for the category's raise, call and fold frequencies. The raise label ("Open", "3-Bet", "4-Bet") follows the line.
Table Controls:
- Sortable columns - Click the column headers (Starting Hand Categories, Hands, Action Mix) to sort ascending or descending
- Weighted toggle - On by default: each bar's length shows the category's reach against the biggest row, so thin categories draw short. Turn it off and every bar runs full width, which makes a small category's mix readable.
- Click a category to filter the Hands list on the right to that category
- Click an action segment to select that row and that action together; click the same segment again to clear both
Under the category table, suit chips show the suit make-up of whatever is filtered: DS / SS / R / M / 3F in PLO, six patterns in PLO5 (xxyyz double-suited, xxyzw single-suited, xxxyz 3-flush, xxxyy 3-flush plus two of a second suit, xxxxy 4-flush, xxxxx monotone), and Pair / Suited / Offsuit in NLHE. Only chips with hands in them show; hover one for its name and share.
Inspect the hands
The right pane, headed Hands, lists every hand class that reaches the spot, with its preflop frequencies.
PPT Filter - The box at the top reads PPT syntax (AA, AxKx, RR:$ds; PLO5 adds suit patterns like xxxyy). The list updates after you pause typing and shows "filtering..." while it works.
Tag Filters - Chips under the box filter by hand properties - suit shape (ds, ss, rainbow, mono, 3flush in PLO; the six patterns in PLO5), pairing, gaps and connectedness, rank bands, and shortcuts such as aces, suited-aces and rundown-ds. Each chip shows how many hands it holds, and only chips with matches in the current view appear. Click to toggle; several chips combine as AND, and they narrow the category table and suit chips too.
Hand List - Each row shows:
- Hand - The hole cards: four in PLO, five in PLO5, two in NLHE
- Combos - The number of card combinations represented by the row (1, 4, 6, 12 or 24 in PLO; 4, 12 or 24 in PLO5; 4, 6 or 12 in NLHE)
- Freq - The frequency of the displayed action, color-stepped from green (90%+) through yellow and orange down to red
- Action - Raise, Call or Fold: the hand's most frequent action, or the one you filtered by
- Category - The hand's category, in short form
The list is flat, sorted by frequency, and updates as you change position, line, tags or filters. The header gives the share of hands shown and says "(showing 500)" when it hits the 500-row cap.
Game mode's View in solver and Career Analysis's Study buttons open Preflop Study on the exact spot and seat they came from, and so do the solve links in the Hand Tracker's decision report.
Open Practice, then Pre. Play full preflop hands, the checkbox at the top of the left pane, is on by default. You play every decision from a rotating seat until the hand ends before the flop. Switch it off for a one-spot quiz: one hand, one decision.
Full preflop hands
With Play full preflop hands on, the center pane is a table like Game mode's, and every hand stops before the flop:
- Your seat - It moves one place after each hand, as in Game mode: BB, SB, BTN, CO, HJ, UTG, then BB again, and heads-up alternates between the two seats. Every hand comes from a fresh deck, and your cards and seat stay the same until the hand ends.
- The other seats - The drill brings back opens, 3-bets, 4-bets and squeezes, including lines you should fold to. Your decisions are graded against the solver's strategy. An earlier action the solver never takes with your hand can leave you without a continuation to practice. Opponents' actions create the drill, so their hidden cards need not explain every bet.
- Your decisions - The buttons are the solve's actions in the tool's order, Fold, Check or Call, then each raise size on its own button, in big blinds. Keys 1-N press them left to right. There is no Mix button, and sizes count exactly as clicked. Each decision is graded like a Game mode decision, Wrong size included.
- The end of a hand - Play stops when you fold, win the pot preflop or would see a flop. The review lists your decisions, grades, chosen actions and the solver's frequencies, alongside hand and session scores. Press Next hand, Space, Enter or Shift+N to continue. Close the review to inspect the table; Review hand reopens it.
- The clock - Decision timer, under the checkbox, gives you 5 to 60 seconds per decision. It is the same setting as the quiz's Timer. When it runs out the table checks if that's free and folds otherwise. That decision shows "By clock", isn't scored and ends your streak.
- Filters - Preflop Action, Hero Position and Starting hands are hidden while full hands are on, and come back as you left them when you switch it off. Career Analysis's Drill button switches full hands off, so its line and seat are dealt.
- Score and meter - The left pane's Session block shows Correct, Total, Accuracy and Streak, and the right pane adds Hands, Decisions and By clock. Every scored decision earns XP like a quiz answer. A hand uses one practice hand from the daily meter when it ends, however many decisions you made in it, and counts once toward the daily goal. A hand where the clock made every decision uses none. When the meter is spent, the next hand isn't dealt.
Full preflop hands count toward preflop practice in the Training Dashboard. They do not appear in Game mode's review or Career Analysis.
The rest of this section is the one-spot quiz, with Play full preflop hands switched off.
Choose quiz filters
Preflop Action - Checkboxes for the lines to drill: RFI, vs RFI (the 3-bet decision), vs 3-Bet, vs 4-Bet, and vs 5-Bet and vs 6-Bet where the solve has them. RFI alone is selected when you arrive, and at least one line must stay selected. The limp lines are Study-only.
Hero Position - The seats you can be dealt, built from the selected lines. Every seat starts selected. Click one to drill only that seat; click it again to open all the seats back up.
Starting hands limits the deal to your selections. In Categories, choose hand groups and, in PLO or PLO5, suit shapes. Groups appear strongest first, with their share of all starting hands. PLO offers Any, DS, SS, Rainbow, 3F and Mono; PLO5 uses the five-card patterns. In Tags, a hand must match at least one selected tag from each group you use.
Leave every selection clear to deal all hands, or press Clear, deal every hand to reset. Filters stay separate for each game until you close the tab. If no selected hands can reach your lines and seats, the table offers Deal every hand. Spots come up more often when more of your selected hands reach them.
Timer - A slider from 5 to 60 seconds in 5-second steps, 60 by default and shared with Postflop Practice. Changes apply from the next hand. When time runs out, the hand is marked wrong and the answer is revealed.
New Spot - Deals a fresh hand. The button reads "Dealing..." while the next spot is prepared.
Session - Running totals: Correct, Total, Accuracy, Streak (consecutive correct answers, back to 0 on a wrong answer or a timeout) and Reset Stats, which clears the counters and deals a new spot.
The quiz varies lines, seats and answer types so folds do not dominate the session. It excludes hands that reach the spot less than 1% of the time.
Answer a preflop quiz
Poker Table - Your seat sits at the bottom center on a highlighted plaque, the others around it with their stacks, blinds and raises in chips, a "D" on the button, and dimmed seats for players who have folded.
Hole Cards - Four cards in PLO, five in PLO5, two in NLHE, in the 4-color deck.
Timer Bar - A horizontal bar below the hole cards that shrinks as time passes. Color changes from green to yellow to red as time runs low.
Action Path - A text line above the action buttons showing the line and the actions already taken.
Action Buttons - Always three, plus Mix:
- Fold - Always there, even where the solve never folds; picking it then scores 0%.
- Check or Call - Always there too, even as a limp the solve never makes (the BTN's "Call 1" in an RFI spot); Call shows the amount in big blinds.
- Raise - One button for aggression, showing the raise-to amount ("Raise 11.5"), or reading All-in when the raise is a jam. Where a spot offers several raise sizes it reads plain "Raise", because the preflop data counts every size as one raise.
- Mix - Your answer when the hand is mixed (see below).
Keys 1-3 press the buttons left to right, and M presses Mix.
After answering, the buttons show the solver's frequencies. Correct options turn green, a wrong choice turns red, and Mix reads "Mixed" on a mixed hand. The result shows "Correct!", "Wrong" or "Time's Up!", with a frequency bar for each action.
Press Continue, Space or Enter for the next hand. Dismiss the result to study the table first, then use the floating Next Hand button when ready.
Today's meter - Under the buttons, "Today 42 of 50" counts the practice hands you have left on a free account (15 a day signed out; Core has no meter). Each quiz answer costs one, timeouts included (a full preflop hand costs one however many decisions it has), and the count resets at midnight Chicago time. A notice appears once 10 or fewer are left, and when the last one is gone practice pauses and offers a free account (signed out) or Core. The same meter covers Postflop Practice and Game mode; Postflop Practice spells out what each one costs.
Answer a mixed hand
Most preflop hands are played with a mixed strategy - the solver splits them between actions. The Mix button is your answer when you believe no single action dominates.
A hand counts as mixed when no single action is played more than 75% of the time, so a 75/25 hand is mixed. Press Mix on a mixed hand and you're correct; press it when one action is above 75% and you're wrong.
Picking an action is graded on its own, mixed hand or not: an answer is wrong only when the solver takes it 3% of the time or less with your hand. Anything else is correct, low-frequency plays included. On the reveal, the solver's most frequent action and any action it takes 15% of the time or more light green.
The one-spot quiz always offers Mix, in all three games, because preflop strategies mix at every depth. Full preflop hands have no Mix button. Postflop the button appears only on solves whose postflop strategy mixes - see Postflop Practice for which those are.
Review session results
The right pane shows session information:
- Section title - "Preflop Practice" with the current line and position
- Score - Correct/Total with accuracy percentage
- Streak - Consecutive correct answers, shown once it is above zero
- Session - Correct, Total, Accuracy and Reset Stats
Career Analysis's Drill button on a preflop result lands here with Play full preflop hands switched off and that line and seat already selected.
Study a flop, follow the action to later streets, inspect hands and opponent ranges, or solve a custom turn or river with your own bet sizes.
Board and action path
River sizes - The box under the streak widget, shown on the river only. It works at the first river decision of a line and is grayed on the river decisions after it. See Custom turn and river solves.
Click an empty board slot to open the Card Picker. Choose all three flop cards in sequence. Cards already on the board are unavailable.
On rotating free boards, turn and river choices use your daily unlocked cards. Your chosen daily flop instead has a shared pool of five distinct cards. Reusing a chosen card costs no extra slot. See Free runout depth.
- Click a filled card slot to replace that card (and remove all cards after it)
- Click the Reset button below the board to clear all cards
Today's Free Boards - Three preset flops, the same three for everyone and in every game, rotating at midnight Chicago time. They stay available to free accounts and signed-out visitors. A free account can also choose one custom flop a day: enter three cards and confirm the choice. That flop is shared across PLO, PLO5 and NLHE, at every available depth. Choose up to five distinct turn/river cards as you study it, then reuse them in any order. The chosen flop and card pool stay fixed until midnight Chicago time, when both reset. Selecting a rotating free board does not use your custom flop. Core members can type in any board and choose every runout.
Browse all flops opens a sortable table of boards for the selected spot. Compare how often OOP bets, IP bets after a check, and OOP responds to each bet size. Column names follow the spot's betting menu. The weight column shows how many dealt flops each row represents.
- Filter by suit, pairing, high card and connectivity; click any value column to sort; click a row's flop to load it. A summary line counts the matching flops, their share of all boards by weight, and the weighted mean of each column.
- The table renders the first 300 matches and says how many more the filter holds. A "How these numbers were made" note under it explains the method.
- Tables cover all three games and most library solves, including PLO and PLO5 heads-up. Use the explorer's dropdown to see the published seat matchups and preflop lines for your solve. A handful of thin lines are skipped (at 12bb nobody reaches a 3-bet-pot flop, for example); pick one of those and the explorer says no table is published and offers the spots that have one.
- Browsing the tables uses none of your data allowance. Signed-out visitors see the rows for the three rotating boards. Free accounts also see their chosen flop; Core opens every flop.
While the explorer is open, the button reads "Back to board". Changing the board, line, seats or stack closes it.
Copy link saves the game, solve, seats, line, board, actions, hand filter and category lens in a short solvepoker.app/solver/spot/ link. A link made by a Core member opens its board for any reader, including signed-out visitors. Open in Notebook beside it creates a query for the same spot.
Preflop Line - A row of buttons for the available preflop lines (e.g., SRP, 3BP). Click a line to navigate to its entry point in the game tree.
Tree Navigator - Once a board is set, the tree navigator shows your current position in the game tree, organized by street:
- Flop header - Shows the three flop cards and the pot. Click to rewind to the start of flop action. Below it, each action taken on the flop appears as a button showing the player name (colored by position) and the action with its size in big blinds (colored by action type). Click any past action to rewind to just before that decision.
- Current actor - At the bottom, "BB to act" (or whoever it is), with the node's actions listed underneath as links. Click one to step forward from here; clicks made while a strategy loads are queued.
- Turn and River headers - Appear as soon as the line reaches that street, dimmed and reading "pick card" until a card is dealt. Same layout as the flop.
Navigate forward with the action buttons in the center pane or the links under "to act", and backward by clicking past actions. Any move to another node clears the filters set at the old one - action, category, key card, the NLHE matrix cell and the hand filter text.
Pot & Eff - Below the tree navigator:
- Pot - The total pot size (including current-street bets)
- Eff - The effective stack (the smallest stack among active players)
Display - The same BB / $ toggle as Postflop Practice sits under Pot & Eff, so study amounts can read in real money at a chosen stake.
Read the strategy
When no board is set - A placeholder prompting you to select a flop.
Spot context header - Above the action bar, a header states the spot in one line: who is to act, the preflop line, the matchup, street, board and pot, with a back arrow that undoes one action and a clickable breadcrumb of the whole line grouped by street.
When a turn or river card is needed - The Runout Grid appears, headed "BB strategy by run-out" (or whoever acts next): a 13×4 matrix of the remaining cards, each showing a small bar of how the strategy shifts if that card comes. The bars are range-weighted with card removal where the range is loaded, and the header says whether a grid is "range-weighted" or "unweighted". Click any card to deal it. On a free account, cards outside your unlocked runout set show a lock ("Study tomorrow to unlock more run-outs").
Action Bar - Action buttons with names and percentages sit above a horizontal frequency bar whose colored segments are proportional to the solver's aggregate strategy. The two layers do different jobs:
- Click an action button to take that action and navigate deeper into the tree
- Click a bar segment to isolate that action: the hand list keeps only hands that take it and re-sorts by weight times frequency ("Wt×F"), and the Opponent's Range recomputes against those hands. The Hand Categories table stays as it is.
Hand Categories - Each hand is categorized on the current board. PLO and PLO5 use 59 categories: 26 made hands, and 33 classes for hands with no made hand, named by their draw. A top set with the nut flush draw appears under Top Set and also counts as an NFD in the Draw lens. The categories sit in 14 meta-categories:
| Meta-Category | Categories |
|---|---|
| Monsters | Straight Flush, Quads, Nut Full House, Full House |
| Flushes | Nut Flush, 2nd Nut Flush, Non-Nut Flush |
| Straights | Nut Straight, 2nd Nut Straight, Non-Nut Straight |
| Sets / Trips | Top Set, Middle Set, Bottom Set, Trips |
| Two Pair | Top Two Pair, Top + Middle, Top + Bottom, Middle Two Pair, Middle + Bottom, Bottom Two Pair - both pairs use a hole card, so an overpair on a paired board files as an Overpair |
| Overpair | Overpair |
| Top Pair | Top Pair |
| Mid / Btm Pair | Middle Pair, Bottom Pair |
| Pocket Pair | Pocket Pair (between the board's top and bottom ranks), Underpair |
| Flush Draws | NFD, 2nd NFD and FD, each alone or with a Nut Wrap, Wrap, Nut OESD, OESD, Nut Gutshot or Gutshot |
| Straight Draws | Nut Wrap, Wrap, Nut OESD, OESD, Nut Gutshot, Gutshot |
| Backdoors | BDNFD, BDFD (flop only - the group disappears on turn and river) |
| Blockers | Nut Flush Blocker, Flush Blocker, NFD Blocker |
| Air | No made hand and no draw |
NLHE uses its own 40 categories in 15 groups, one of them Board Trips, with the same draw flags.
Each row shows the category name, its share of the weighted range (% Range) and the action mix; hover a row for the combo count ("N combos (M weighted, x%)"). One segmented control above the table picks how rows are grouped - a lens, or Classic for the flat list of every category present at the node.
Lenses - The same hands, regrouped along a different axis:
- Strength - Made-hand strength, strongest first, in ten groups: the made-hand groups above, then every hand with no made hand collected at the bottom under No Made Hand. Use the Draw lens to split those.
- Draw - The draws a hand holds, whatever it has already made: NFD + Straight Draw, Flush Draw + Straight Draw, Nut Flush Draw, 2nd Nut Flush Draw, Flush Draw, Nut Wrap, Wrap, Nut OESD, OESD, Nut Gutshot, Gutshot, Backdoor Flush Draw, Overcards, Flush Blocker and No Draw. 2nd Nut Flush Draw, Nut Wrap, Wrap, Nut OESD, Nut Gutshot and Flush Blocker come up in PLO and PLO5 only, and Overcards in NLHE only. Every game has the lens; it drops out on the river, where nothing is left to draw.
- Value - How much of the opponent's current range each hand beats at showdown, split into Value (ahead of 65%+), Marginal (35-65%) and Weak (under 35%). This is computed for this board and this node, which is why the same set can be Value on one flop and Weak on a river where the opponent's betting range has passed it. In PLO it is worked out combo by combo with exact card removal, so one category can split across bands; PLO5 and NLHE use a per-category estimate. Draws count as their made part, since draw equity is not showdown strength. Two-player pots only; it shows "Waiting for the opponent's range..." until that range has loaded.
Table controls:
- Click column headers (Hand Categories, % Range, Action Mix) to sort
- Weighted toggle (on by default) - each bar's length follows the row's share of the range. Turn it off for full-width bars. The mix inside is range-weighted either way.
- Click a category row to filter the right-pane hand list
- Click an action segment within a row to filter by that category and action together
Use Categories | Key cards beside a lens to see which cards change the strategy. This toggle is unavailable in Classic. Each row represents a card, with a final "none of these" row. Columns are the lens groups. A cell shows that group's action mix among hands holding the card, and an arrow shows the change in betting or raising. Cards with no effect are listed below.
Click a cell to filter by its group and card. In PLO and PLO5, clicking the row's card chip enters it in the hand filter. PLO5 calculates key cards when requested, showing "Key cards..." while it works. If none affect the strategy, it returns to Categories.
Opponent's Range - Below the categories, in two-player pots, a panel titled "Opponent's Range" (or "Opponent's Bet 33% Range" and so on, once you are looking at the reply to a bet) breaks the opponent's range at this node into strength groups. It always groups by made-hand strength, whatever lens you picked above, so you can read your draws against their made hands. Group rows expand like the categories table. It reacts to what you point at:
- Hover a hand in the list to remove its cards from the opponent's range. The panel shows the remaining combos, arrows beside the groups that changed, and the share of the range blocked by your hand. Its caption reads "your cards removed".
- Hover a category row, group or key-card cell and the panel shows the range facing hands like that ("holding Top Pair").
- Any filter you set (action, category, card, PPT text, NLHE matrix cell) conditions the panel on your selection, with a line giving how much of their range your selection blocks on average.
Touch screens have no hover, so on a phone the panel follows your filters only. In PLO5 the panel answers single-hand hovers.
Filter the hand list
The right pane lists every hand still in the acting player's range on this board, with its solver strategy: four cards in PLO, five in PLO5. Hands the range never brings here are left out. In NLHE the list sits under a 13×13 matrix with Strategy, Range and EQ pills. Click a cell to filter the list to that hand's combos. The header then shows the hand ("AKs") with an × to clear it, and clicking the cell again does the same. See The NLHE Library.
Header - The total count, e.g., "62,947 combos (51,710 weighted)", and "(showing first 500)" when the list is capped.
PPT Filter - A text input for PPT syntax. A ? help icon shows a quick reference, and a Strength… dropdown writes made-hand comparators into the box: Full house & better, Flushes & better, Straights & better, Sets / trips & better, Two pair & better and Top pair & better, each with a "Below" partner (NLHE splits sets and trips).
Columns:
- Hand - The hole cards
- Cat - The hand's category in short form, draws included (e.g. "TSet+NFD"); hover for the full name
- Key - Up to three key-card chips for the hand
- Wt - Reaching weight, with a bar. The default sort, heaviest first; with an action isolated it becomes "Wt×F", weight times that action's frequency.
- Action and Freq - The solver's preferred action and each action's percentage. On solves whose postflop strategy mixes, these merge into one Action Mix bar: the heads-up and 6-max 100bb PLO solves and both PLO5 solves. NLHE's list shows the bar at every depth, including 40/70/150bb, which store one action per hand postflop.
Filter bar - With any filter on, a breadcrumb names it ("Group › Category › chips", each with an ×), the share of the range it keeps, and the combined strategy of the filtered hands. The list caps at 500 visible hands; hover a row to see its blockers in the Opponent's Range.
The library gives you the sizes in its published tree. Turn sizes and River sizes solve the spot on screen with a menu you choose, starting from the ranges that arrived there. Use them to check a missing size or prepare a spot for node locking.
Supported spots
In Postflop Study, go to the first decision of the turn or river. The button is at the top of the left pane, under the streak widget. On mobile, open the Spot tab. River sizes appears after a river card has been dealt. Later decisions tell you to return to the first decision of that street.
Both tools support NLHE and four-card PLO at eligible two-player spots. PLO5, custom preflop and flop solves, and multiway postflop solves are unavailable. A disabled button explains the restriction. If a supported turn is too large, reduce the number of sizes and try again. A refusal before the solve starts spends no allowance.
Solve a turn
- Follow the flop action to the turn, choose its card and stay at the first turn decision.
- Open Turn sizes. Set the turn's bet and raise sizes, then the river's. The river menu applies to every river card.
- Read the estimated wait, the allowance cost and any size or accuracy warning before pressing Solve.
- When the result opens, follow the turn actions and choose a river through the normal card picker. The solve includes every legal river, while the cards you can open still follow your account's runout access.
Each street takes up to three bet sizes and two raise sizes. Both players use the same menu. PLO opens with a 66% bet and a pot-sized raise on each street. Pot is the largest size in PLO. A size that would exceed the remaining stack is limited by that stack. After two raises, only the largest raise size continues.
Lock villain also lets you keep the library's sizes and edit its strategy. You can begin those edits at a later decision. The first Apply solves the street from its beginning, including the river continuations of a turn. The library-lock workflow explains the draft and its cost.
Choose river sizes
At the first river decision, open River sizes. Choose up to three bet sizes and two raise sizes in PLO, or four bets and three raises in NLHE. The starting river menu is 50% and pot for bets, with a pot-sized raise.
Bet presets include 25, 33, 50, 66, 75 and Pot. NLHE also offers 125, 150 and All-in. Raise presets include 50, 66 and Pot. You can type a whole percentage from 10 to 100 in PLO or 10 to 300 in NLHE. Both players get the menu you choose.
The smallest bet is 1bb. On a 5.5bb pot, 10% would be too small, so that preset is disabled and the input tells you the minimum percentage. Remove a size by clicking its selected chip. Leaving the raise row empty gives a bet only a call or fold response.
Raises and all-ins
On a custom river, your raise menu is used for the first two raises. After that, its largest raise repeats until the stack is in. In NLHE, a size within 15% of the remaining stack snaps to all-in. In PLO, a pot-limited bet or raise goes all-in only when it reaches the remaining stack. The size strip above the result lists the sizes used.
Read the accuracy figure
Custom turns aim for 0.3% of the pot and show a strategy only when it finishes within 1%. This rule applies to both NLHE and PLO turns. A result above the limit is withheld and the solve is refunded. Rivers aim for 0.1% of the pot and report the figure they reached, even if a time limit stopped them before the target.
"Solved to within 0.29% of the pot" describes how much room remains for the two players to improve against that strategy in the stated spot. It does not say your chosen action loses 0.29%, or that the same strategy is right against every opponent. With locks or profile incentives, read the quality label as applying to those assumptions. Frequency targets have their own attainment report.
NLHE turns have a 120-second solving ceiling, PLO turns a solving budget of up to 5 minutes, and rivers a 60-second solving ceiling. Preparing the spot, waiting in a queue and returning the answer add to that time. A solve that produces an accepted answer still counts when it uses all its time.
Waits and reconnecting
The panel shows the expected wait before you start. Wider ranges, deeper stacks and more sizes take longer. While it runs, the panel distinguishes waiting for your account's other solve, waiting in the queue, solving and preparing the result. An accuracy figure shown during the run is progress, not the final result.
You can keep studying while a solve runs. A banner gives its status, and Open it returns to its spot. A lost connection shows Reconnecting while the app follows the same solve. Reloading recovers the active solve instead of requiring another Solve click. Repeated clicks follow the same running solve. Leaving its spot does not cancel a solve that has started.
Daily and monthly allowances
Sign in to solve or reopen a custom result. Turn solves, river solves and counters have separate allowances shared across NLHE and PLO:
| Action | Free account | Core |
|---|---|---|
| Custom turns and turn re-solves | 1 a day | 20 a day, 200 a month |
| Custom rivers and river re-solves | 1 a day | 100 a day, 600 a month |
| Best counters | 3 a day | 500 a day |
These allowances reset at midnight UTC, with monthly limits resetting on the 1st. The practice meter and daily flop use Chicago time instead. The panel names the cost of your next action and how much is left. Your first Apply on a library draft can need an exact base solve plus the counter or re-solve you asked for, so read its full cost before applying. Results already available are free to reuse. Failed solves are refunded.
Study the result
The action bar, hand list, categories, key cards and Opponent's Range switch to the custom result. Filter and walk the tree as you do in the library. Its strip names the sizes and accuracy. Custom results also provide their own hand and action EVs. Those values belong to the ranges, sizes and locks used in that solve.
Back to the library sizes returns to the published tree. Changing games, stack, board or the earlier line leaves the custom spot. Use Save in the lock section to keep an experiment you want to return to.
Custom NLHE solves use the selected solve's rake. PLO 6-max 12-50bb rivers use 5% capped at 1bb. Other PLO custom rivers use a declared 5% cap of 2bb, which has not been verified against every source solve. An exact custom solve can differ from the library even with the same sizes, so use the result's own quality figure.
Reopen a result
Asking for the same available spot and sizes again reuses the result without spending another solve, including when another account first solved it. Answers are kept for 60 days from the original solve. A newer library or solver build can require a fresh answer. Opening a saved spot reads its answers back while they remain available. Walking within a result spends no additional custom solve.
Lock the hands you believe an opponent plays differently, then study the response. You can edit individual combos, hand classes or a filtered group at multiple decisions on a supported NLHE or PLO turn or river. A turn experiment can include locks on different river cards. PLO5 locking is unavailable.
Start on the library
- Open the turn or river decision in Postflop Study and press Lock villain in the left pane.
- Press Edit locks to open the editor. It starts from the library strategy. Opening it and making edits spend no solve.
- Close the editor to inspect Library | Preview on the page, or continue to another decision and add a lock there.
- Choose how the opponent should adapt, check the cost, then press Apply in the editor or the run button in the lock panel.
Before Apply, stripes mark your edited hands. Other hands still show the library strategy. Later ranges reflect your edits, but their strategies have not been re-solved, so the preview says "Not solved yet". Press Apply to calculate the response; other hands can change too. Save keeps a draft before or after applying.
Paint hands and mixes
The editor's Range, Hand classes and Combos views show the same strategy at different detail. Use the filter box to narrow it with your game's hand notation, such as AA in Omaha or AKs in NLHE. Use the chips and view selector to focus on the hands you want to edit.
In Hand frequency, choose an action brush for a pure strategy, or set the sliders to a mix and paint that mix. Frequencies use 0.5% steps and must total 100%. Click or drag over hands to paint. A class edit covers its combos. In the matrix, right-click or long-press a class to open its individual combos.
Lock all holds every hand at that decision as it currently plays. Unlock all returns that decision's hands to the starting strategy. Show initial strategy lets you inspect the starting mix without discarding edits. Closing the editor also keeps your edits.
Undo uses Cmd/Ctrl+Z. Redo uses Shift+Cmd/Ctrl+Z or Ctrl+Y. Reset clears the current decision's locks and targets. Reset every decision is in the More menu. The lock panel lists edits by decision so you can return to or remove one without clearing the rest.
The panel also has frequency sliders and presets for common departures, such as folding more or bluffing less. Hands that change controls which hands move first: Evenly, Weakest hands first, Strongest hands first, or Cheapest for them. Cheapest for them needs action EVs, so it is unavailable in an unsolved library draft.
Range frequency targets
Range frequency asks the re-solve to reach an overall action frequency across the range or filtered slice. Use it when you know "this player folds this group 60%" but do not want to choose every folding combo yourself. Hand frequency instead fixes the specific painted hands.
Set the action and target for the hands in view. The editor shows the achievable bounds with the current locks. Overwrite unlocked keeps painted hands fixed. Overwrite all releases them so every hand at that decision can move toward the target. Targets require Villain adapts elsewhere.
After applying, check the achieved frequency and any warning. The solve's accuracy limit does not guarantee that every target was met. A target at a decision that is no longer reached is reported as unreached.
Combo locking and earlier decisions
Combo locking is on by default. At a painted decision, it keeps unpainted hands at the version you are editing while holding your painted rows. Turn it off if the re-solve should adapt every unpainted hand at that decision. At a decision with a range-frequency target, the unpainted hands are available to meet that target.
Lock previous nodes, also on by default, keeps earlier decisions on the path fixed. Use it to ask how to respond once this exact line has happened. Choose Re-solve entire street in Apply options when you want earlier play within the solved street to adapt too. It still starts from that street's arriving ranges.
In a re-solve, select You play to identify your seat. You can hold parts of your own plan as well as the opponent's. Locks on your own decisions require Villain adapts elsewhere.
Counter or re-solve
| Mode | Question it answers | Run button |
|---|---|---|
| Villain plays exactly this | The opponent follows the base strategy plus your locks. Find your best response under that assumption. | Show best counter |
| Villain adapts elsewhere | Hold your locks and let both players find their best replies everywhere left free. | Re-solve with these locks |
A counter uses the counter allowance. A re-solve uses one custom turn or river for its street. Frequency targets, profiles and your own plan locks need the re-solve mode. Remove those controls or switch modes when the run button explains that they cannot be used in a counter.
A best counter assumes the opponent keeps making the specified choices. It can lose value when that assumption is wrong. A re-solve instead assumes the opponent finds the best reply wherever you have left it free. Read any gain as applying to that experiment. A gain at one decision is per hand arriving there, so it is not a claim about your overall bb/100.
Player profiles
A profile gives a selected player four incentives: Fold, Check, Call and Bet/Raise. Each is a percentage of the pot at the decision. Positive values push that player toward the action, negative values away from it. For example, a positive Call incentive studies a player more willing to call throughout the solved spot.
Profiles need Villain adapts elsewhere. They change the opponent you are modeling across its decisions, while hand locks name particular hands at particular decisions. The EV displayed in the result excludes the artificial incentives. Start with a single changed incentive so you can tell what caused the response.
Versions and Compare
Each successful Apply creates a version. The Versions list keeps up to eight, including the base, which is always kept. Switch versions to study their trees. Your next edits build on the version identified by "your edits build on this". A counter is measured against GTO plus its locks.
Open Compare to put two versions beside each other at the current decision. Previous is on the left, Current on the right. The pickers let you change either one. Strategy compares action frequencies, EV compares expected value, Range compares the reaching hands, and Equity and EQR are available where equity is computed. Breakdowns include Hands, Draws and EQ buckets where applicable.
Each side is weighted by its own arriving range. If an earlier lock changes which hands reach this decision, an aggregate EV change includes that change in the arriving hands. EQR compares EV with equity's share of the net pot. Omaha turns do not offer Equity, EQR or EQ buckets, and rivers do not offer Draws.
Save the spot to keep its retained versions after reloading. Unsaved versions are lost when you reload or close the tab.
Study an opponent who overfolds
- Open a river decision where the opponent faces a bet. Press Lock villain, then Edit locks.
- Use a filter or Hand classes to find the bluff-catchers you think this player gives up. Paint those hands to Fold, or use Range frequency if you only know the group's overall fold rate.
- Keep Lock previous nodes on to preserve the line that led here. Choose Villain adapts elsewhere if you set a target, or Villain plays exactly this for a fixed opponent strategy.
- Apply, then go back to your betting decision. Compare it with the base and inspect which bluffs gained frequency.
- Save the spot with the assumption in its title, such as "BB folds weak bluff-catchers". Change that assumption in another version before treating the response as a plan for a real opponent.
My locked spots in the Study sidebar holds the turn and river experiments you save to your account. A spot includes its game, stack, board, line, current locks, targets and profile, plus the result versions still retained when you save.
Save drafts and results
- In the lock section, press Save, enter a name and confirm. A library draft can be saved before its first Apply.
- After another edit or Apply, press Save changes to keep that state. Saving is manual.
- Open My locked spots and press Open beside the experiment. It returns to the saved line, restores the edits and reads the available answers without another solve.
A free account can save 3 spots, and Core can save 50. The list shows how many you have used. After leaving Core, you can still open, share or delete existing spots. You can save again once you are below the free limit.
Drafts are marked "locks not applied yet" and reopen without starting a solve. Use the list to rename a spot or delete it after a second confirmation. Press Save changes before leaving an experiment whose latest edits you want to keep.
Share or copy a spot
Press Share in the lock section, or Copy link beside the saved spot. Anyone with that link who signs in can open the saved experiment read-only. Copy to my spots creates an editable copy in the reader's account. Copying preserves the assumptions so the reader can change one without editing yours.
Stop sharing in My locked spots disables the shared link. Readers still need access to the flop and runouts; sharing does not grant Core access. A library Copy link opens the library decision. A locked-spot Share link includes the saved experiment and its versions.
Expired answers
Answers remain available for 60 days after they were first solved. Saving or reopening a spot does not restart that clock. If an answer has expired, the app keeps the saved assumptions and explains that it must be solved again. Running it again uses the relevant allowance. A reader of a shared spot must copy it to their spots before changing or re-solving it.
Practice postflop decisions against the solver's strategy. Choose the game, stack, line and street in the left pane, then answer the dealt spot using the action buttons. The filters below let you repeat a particular board texture, hand group or decision.
The practice meter. A free account gets 50 practice hands a day (15 signed out), shared by Postflop Practice, Preflop Practice and Game mode and by all three games. Here every decision you answer uses one, so a hand played from flop to river can use three; timeouts count. A Spot Rush run uses five, and a Game mode hand or a full preflop hand one. The "Today 42 of 50" chip under the buttons shows what's left, and it resets at midnight Chicago time. Study never touches it, and Core has no meter.
Boards on a free account. Free accounts are dealt one of the three rotating boards or their chosen flop; signed-out visitors get the rotating three. A spot that starts on the turn or river uses the runout cards already available on that flop. Practice never spends a place in your five-card pool. If the chosen flop needs more runout cards, choose them in Study first (see Free Runout Depth).
Choose practice filters
Lines - Checkboxes for which preflop lines to include (SRP, 3BP, 4BP and the limp lines). When a solve loads, the lines of the spot you were studying start selected - SRP, 3BP and 4BP for BB vs BTN.
Streets - Checkboxes: Flop, Turn, River. Flop alone is selected when you arrive. Disabled while "Play Flop to River" is on.
Spot - Any / First-in / Facing bet / Facing raise, so you can drill only the spots where money is already in. Pinned to Any while "Start at first flop action" is on.
Turn card - Which turn classes to deal: Pair, Flush, Straight, Blank (T+) and Blank (9-). Leave them all off for any turn. It shows only when Play Flop to River is off and Turn or River is selected.
Position - In HU: OOP and IP checkboxes (with both selected and "Start at first flop action" on, every hand starts at the OOP player's first decision). In 6max: two seat-pill rows, Hero and Opponent, each defaulting to all six seats; every valid hero-vs-opponent pairing you leave selected gets drilled.
Starting hands - Deal only the hand types you select, by category or by tag, with a suit menu per category. It works the same way as in Preflop Practice; spots where your selected hands make up more of the arriving range come up more often.
Boards - Deal only the flops you select, from 18 classes in four groups: suits, pairing (trips is opt-in), straight texture, and high card (A-high, K/Q/J-high, T/9/8-high, 7 or lower). Within a group any selected class passes; across groups a flop must pass every group you used. "Clear, deal any flop" resets it. On a free account it picks among today's free boards, and says so if none of them match.
Timer - Slider from 5 to 60 seconds in 5-second steps, 60 by default. Changes apply from the next hand.
Display - Toggle between two value display modes:
- BB - Show all values in big blinds
- $ - Show values in real money. A dropdown appears to choose the cash game stake ($0.25/$0.50 through $50/$100).
Options - Two checkboxes:
- Play Flop to River (on by default) - Each spot starts on the flop and continues through turn and river with the same hole cards. See Play Flop to River.
- Start at first flop action (shown with Play Flop to River, on by default) - Start each hand at your first flop decision instead of a random mid-flop node.
New Spot - Generates a new random scenario.
Changing Lines, Streets, Spot, Turn card, the seats, Starting hands or Boards resets the session score and ends your answer streak, because a running total would otherwise measure a different mix of spots. Timer, Display and the Options leave them alone. None of these filters are remembered after you close the tab.
Answer a postflop decision
Your hand and the action buttons appear at the table in the center pane.
The table shows:
- Seat boxes - Each active player showing position name and remaining stack. Hero is always at the bottom. Inactive seats appear dimmed.
- Dealer chip - A "D" marker on the button position.
- Pot chips - Stacks on the felt use the chip colors listed in Reference.
- Bet chips - Player bet stacks between seats and the center. Single stacks for bets, double for raises.
- Board cards - The community cards in the 4-color deck.
Hole Cards - Four cards in PLO, five in PLO5, two in NLHE, shown below the table.
Timer Bar - Shrinks as time passes. Green >50%, yellow 20-50%, red <20%. If time expires, the answer is auto-revealed and marked incorrect.
Action Path - The preflop line name and sequence of actions leading to this decision. Street names in bold, actions color-coded.
Action Buttons - Ordered passive to aggressive: Fold, Check/Call, Bet/Raise sizes, All-In, colored by your action palette (see Action Colors). Number keys 1-9 map to buttons left to right. A Mix button (key M) appears on the solves whose postflop strategy mixes: PLO heads-up 100bb, PLO 6-max 100bb, both PLO5 solves, and the NLHE re-solves at 20/30/50/100/200bb. The other PLO depths and the remaining NLHE depths store one action per hand postflop, so there is no mix to call.
Result Modal - After answering: "Correct!", "Wrong", or "Time's Up!" header, frequency bars for every action, a line showing what the hand's whole class does at this node, and a Continue button (Space or Enter). Dismissible when you want to study the table first.
Grading - An answer is wrong only when it is an error: an action the solver takes 3% of the time or less with your hand, or a Wrong size, a bet or raise size it takes less than 15% of the time when it takes another size 15% or more. Everything else is correct, low-frequency plays included. Bet sizes count: if the solver bets 33% with your hand most of the time and you click 75%, a size it uses 10% of the time, the answer is a Wrong size. On the solves with a Mix button, Mix is correct when no action is above 75%.
Session Stats - Below the buttons: the flame streak badge with your current XP combo multiplier, score (Correct/Total), accuracy percentage, and the day's meter.
Review results and history
Title - "Practice Mode" ("Spot Rush" during a rush run).
Spot Rush - A button here starts a 60-second rush run; see Spot Rush. Your current and best answer streaks also live in this pane.
Score - Large Correct/Total with accuracy percentage.
All-Combo Display (after reveal) - Shows every suit combination of the hand rank you were dealt, with the solver's best action for each combo. Your exact combo is highlighted.
Action History - A condensed tree navigator showing the current line, action path by street, and current decision point.
Session Stats - Correct / Total / Accuracy % / Reset Stats button.
A 60-second survival run inside Postflop Practice (Practice, then Post), started from the Spot Rush button in the right pane. Correct answers score by street - 1 point for a flop decision, 2 for a turn, 3 for a river - and the next spot deals instantly, with no feedback pause. The first wrong answer ends the run; so does the clock. A run costs 5 from the daily practice meter and needs 5 left to start, so a signed-out visitor gets three runs a day.
- Per-spot timers are suspended during a run; only the 60-second clock matters
- Play Flop to River switches off for the run and restores when it ends, so the Streets filter sets the points: with the default Flop only, every spot is worth 1. Select Turn and River for 2- and 3-point spots.
- The Starting hands and Boards filters apply, and Mix works on the solves that have it
- The HUD shows seconds left and score, and turns urgent under 10 seconds
- Your high score saves, signed out too (it moves to your account when you sign up), and the end-of-run summary offers Retry and Share
Outside a run, your current and best answer streaks show in the right pane during normal practice.
On by default in Postflop Practice, Play Flop to River turns each spot into a multi-street hand:
- You get a flop decision with your hole cards - your first flop action, unless you turn "Start at first flop action" off.
- Answer correctly and your chosen action is played into the tree, at the size you clicked. A correct Mix plays an action sampled from the solver's own frequencies.
- The opponent responds from the solver's strategy. The drill skips folds and river check-backs that would end the hand without another decision. When the street closes, it deals the next card from the remaining deck and keeps your hole cards.
- The hand runs until you fold, answer wrong, or reach showdown - where the villain's hand, sampled from their range on this line, is revealed face-up at their seat.
Each street's decision is graded on its own and uses one hand from the practice meter. While the option is on, the Streets filter is disabled, the Turn card filter is hidden, the timer applies to each street decision separately, and with "Start at first flop action" also on, Spot stays on Any. The turn and river are dealt from the whole remaining deck, so on a free account they can land outside your unlocked runout set. For whole hands from the first card preflop, use Game mode.
Game mode deals whole hands, from the first card preflop to showdown, at a table where every other seat plays the solver's strategy. You make every decision; after each hand the review grades every decision the solver reaches, with spot practice's thresholds. Parts of the app call it Full Game.
Sitting down
Click Practice: it opens Game mode and deals. A ?view=full-game link does the same. The table plays whatever solve the left pane has selected - PLO 6-max at any depth or heads-up at 100bb, PLO5 heads-up or 6-max at 100bb, NLHE 6-max at any depth or heads-up at 100bb - and a first visit lands on PLO 6-max 100bb.
- The deal - Every hand comes from a full shuffled deck, so free accounts and signed-out visitors play every flop, turn and river here. The Starting hands and Boards filters from spot practice don't apply.
- Your seat - It moves one place each hand, the way the button does: BB, SB, BTN, CO, HJ, UTG, then BB again. Heads-up alternates between the two seats, labeled IP (the button, posting the small blind) and OOP. There is no seat picker.
- Stacks and rake - Every hand starts with full stacks at the solve's depth. NLHE hands are raked at the solve's own rake, printed under the Stacks row, and only when a flop is dealt. PLO and PLO5 hands are not raked, because those solves don't state a rake.
- The other seats - Each villain plays its own dealt cards with the solver's strategy for that exact hand, preflop and postflop, folds included. Villains never invent a line: where the solve has no strategy for a villain's hand, it checks when that's free and otherwise folds. You can play any line you like; multiway pots happen wherever the solve has strategies for them.
At the table
Your cards sit face up below the felt and the villains' face down. Actions pop on the seats, board cards deal in, and at showdown the villains' cards flip with their hand names while a banner says who won ("You win 12.5", "BTN wins 24.5", "Split pot"). Nothing at the table says whether you played a hand well; grades wait for the review.
The buttons follow the tool's order - Fold, Check or Call, then bets and raises smallest first - with amounts in big blinds: "Call 6.6", "Bet 6.6" with its size (66%, pot or min) underneath, "Raise to 21.2", "All-in 94". Keys 1-N press them left to right. Sizes count exactly as clicked, as in every practice mode, and there is no Mix button, so a size the solver rarely uses grades that way. The band above the buttons holds the day's meter ("9 of 15 hands today") and View in solver.
Left pane and the clock
- Timer - 5 to 60 seconds per decision in 5-second steps, 30 by default, with a No timer box.
- Options - Auto-deal next hand (on by default; off, a Next hand button waits after each hand) and Show villain cards in review (on by default).
- Display - BB or $ with a stake picker, for the session figures. Button amounts stay in big blinds.
- Session - Hands, Decisions, Accuracy and Net, with Deal / Pause, New session and Open full analysis →, which opens Career Analysis.
When time runs out, the table checks if free and folds otherwise. The review labels that decision "timed out". It is excluded from accuracy, XP, Tendencies and Career Analysis. If it was the hand's last decision, play pauses until you press Next hand.
Pausing, leaving Game mode or changing the game, player count or stack during a hand discards it. That hand is not saved, graded or charged to the daily meter.
How decisions are graded
Each decision is compared with the solver's strategy for the exact hand you held, with the same thresholds as spot practice and full preflop hands:
| Grade | When |
|---|---|
| GTO | You took the solver's most frequent action with that hand. |
| OK | Another action the solver takes 15% of the time or more with that hand. |
| Low freq | An action the solver takes more than 3% and less than 15% of the time. |
| Wrong size | A bet or raise size the solver takes more than 3% and less than 15% of the time, when it takes another bet or raise size 15% or more with that hand. An all-in counts as one of the sizes. Wrong size is an error, like a Mistake. |
| Mistake | An action the solver takes 3% of the time or less with that hand. |
| N/A | The solver never reaches that spot with your hand, so there is nothing to compare. |
A frequency is graded as it is shown, to one decimal: 14.96% shows as 15.0% and is OK.
Accuracy counts every graded decision that wasn't a Mistake or a Wrong size, so an occasional low-frequency play doesn't cost you. Career Analysis shows whether you take it too often. You earn XP for every decision that wasn't a Mistake or a Wrong size, and that is also what Practice counts as correct.
Off range - Once one of your plays takes a hand somewhere the solver never goes, your later postflop decisions in that hand show "Off range" beside a dashed grade for what the solver does with hands like yours. They are shown for learning and never counted. Preflop decisions never go off range this way. Decisions made with the solver open (see View in solver) are graded and shown, and never counted either.
The review
The right pane (the Results tab on a phone) has two tabs, Session and Career. The header gives your accuracy with the graded count, then tiles for Hands, Decisions, Flops, Low freq, Errors (Mistakes and Wrong sizes) and Showdowns, and accuracy by street.
- Hand list - Newest first, titled by seat and pot ("BTN vs BB · SRP", "UTG · folded preflop", "BB · walk"), with your score ("2/3") and chips for errors, low-frequency plays, a clean hand (✓), solver viewed and timed out. The Session tab keeps up to 300 hands per browser tab and starts a new list when you switch solve; New session clears it.
- Open a hand to see its board, players' cards, action log and result. Hide villain cards conceals their holdings. Each decision shows its situation, grade, hand category and action frequencies, with your choice marked. Press Study to open that decision in the solver.
- Career tab - Every hand on your account, with Game, Stacks and Players filters, Load older hands, and a link to Career Analysis.
Tendencies compares your action frequencies with the solver's for the same hands. It groups postflop decisions by situation, including c-bets, barrels, leads, stabs and responses to bets or raises. It also groups barrels by runout, and preflop decisions by line and seat.
Callouts show repeated differences with their sample counts, such as "Call: you 9 of 10 (90%), the solver 15% with the same 10 hands. Too often." Show all situations includes every group with at least three spots.
View in solver
View in solver pauses the hand and clock, then opens Study at the current decision. Press Back to the game, Practice or Game to resume. The next decision is tagged "solver viewed". Changing the game, solve or stack, or starting the tour, discards the paused hand.
The review's Study button opens a completed hand's decision. Postflop review follows the free-board allowance. You can choose that board as your unused daily flop, or use Core to review every board.
Meter, XP and badges
Each finished hand uses one practice hand from the meter shared with spot practice - 50 a day on a free account, 15 signed out, none on Core - walks and preflop folds included. The chip switches to the accent color with 3 left, and when none are left the meter wall replaces the table. A finished hand also counts as one spot toward Perfect Day, the day streak and runout depth, and pays 10 XP per decision that wasn't a Mistake or a Wrong size, with no combo multiplier. Game hands don't feed daily quests, the answer streak or Best Heater.
Six badges are for Game mode: Sat Down (10 hands), Full Ring (100), Session Player (500), Grinder (2,500), Clean Ten (10 clean hands) and Textbook (100 clean hands). A clean hand has at least three graded decisions, every one GTO or OK.
Every finished hand is saved to your account the moment it ends. Signed out, hands are kept under your browser's guest ID and move to your account when you sign up or sign in in that browser; guest data is deleted after 90 days without activity.
Keys and mobile
1-N take the actions left to right. Space, Enter or Shift+N deal the next hand when the table is waiting. Shift+M goes back to Study and Shift+P to Preflop Study. On a phone the tabs are Spot (the settings and session), Play (the table, sized to fit the screen) and Results (the review).
Career Analysis, at solvepoker.app/solver/career, reads every Game mode hand on your account and shows where your play differs from the solver's: in which spots, with which hands, on which boards, and whether it's changing. Open it with Open full analysis → from Game mode's Session block or the review's Career tab. It reads Game mode hands only - spot practice answers and Hand Tracker imports stay out of it. Signed out, it shows the hands saved under your browser's guest ID.
Filters
The header counts what you're looking at - hands, decisions, and the share of postflop decisions that went off range. Below it:
- Game - PLO, Hold'em or PLO5, and Table - Heads-up or 6-max, when you have hands at both. Games and table sizes are never pooled; the page opens on the one you've played most.
- Stacks - All stacks, or one depth.
- Range - All, Last 500, Last 2,000, 30 days, or This sitting (hands less than 30 minutes apart).
- Evidence - Solver-range hands (the default) or All hands, which adds your off-range postflop decisions to the frequency views. They never count toward accuracy.
- Show - Actions or Sizes.
The filters and the open section live in the URL, so any view can be bookmarked.
Sections
Overview shows graded-decision accuracy, error rates and Game mode results. Compare your aggression and folding with the solver by street, then check Top leaks and What you do well.
Is it moving (per 250-hand block, once you're past 250 hands) tracks changes over time. What there is enough of identifies breakdowns that need more hands.
Preflop compares your VPIP, PFR, 3-bet, fold to 3-bet, 4-bet, cold-call, squeeze, steal and BB defend with the solver for the hands you were dealt. Open a line's row to inspect the hands you play differently.
Postflop groups flop, turn and river decisions by whether you can bet or face a bet, in heads-up and multiway pots. Open a row for the hands and boards behind the comparison.
| Section | Use it to review |
|---|---|
| Boards | Decisions by flop texture and runout. |
| Hands | Hand strength, draws and river value bands. |
| Positions | Decisions and bb/100 by seat. |
| Results | Results by seat and pot type, WTSD, W$SD, WWSF and your biggest pots. |
| Process | Decision time, timeouts, assists and changes during a sitting. |
| Progress | Pinned findings and your study plan. |
Tables put a "You vs solver" bar beside the gap, the extra or missed actions, the share in range, your accuracy and the sample. Rows with fewer than 15 spots are grayed.
Findings
A finding compares your choices with the solver for the hands you were actually dealt. Each card shows the sample, the direction and size of the difference, confidence, and whether it is new, active, improving, resolved or regressed. Thin rows are grayed. An impact index ranks findings; it is not measured EV loss or bb/100.
Start with a clear finding supported by several example hands. Example hands shows the decisions behind it, worst first. Study this spot opens a representative decision. Drill it sets up the relevant practice. A high overall accuracy does not rule out a habit of taking a low-frequency action too often.
Study opens the decision's exact spot in the solver, or the closest one if a re-solve has moved it. Drill opens Practice set up for the spot - the line, street, seats, turn class and spot type for a postflop leak; the line and hero seat in Preflop Practice for a preflop one - and deals.
Build a study plan
In Progress, pin a finding you intend to work on. Pins are kept for the selected player and game. Use its Study link to understand the spot, then Drill it for a focused session. Return after playing more Game mode hands to see whether the gap is improving. Keep the same game, table size and depth filters when comparing periods.
Results and bb/100 describe what happened in the simulated hands, with card variance included. Accuracy describes eligible decisions. Off-range, timed-out and solver-assisted decisions have separate labels so they do not inflate that score. The Hand Tracker's imported real hands have their own decision report and are not part of this Career.
Free and Core
A free account, and a signed-out visitor, gets the Overview and the first level of Preflop and Postflop; the Overview's Top leaks shows two of up to five. Core opens every section and level. A locked section explains the Core access needed to open it.
The Training Dashboard opens from the Stats button at the end of the mode row (desktop), the Stats pill in the streak widget when it's expanded, the Training Dashboard row in Settings, Shift+D in Postflop Practice, or the View button on an award notice. It needs an account, and shows, in order:
- Today's Quests and your Badges - See Streaks, XP & Quests
- Training Days - Current and best day streaks
- Total Spots, Accuracy and Best Heater - Your practice answers plus Game mode decisions, and your longest run of correct answers in Postflop Practice
- Study Activity - How many flop, turn, river and preflop Study views you've opened
- Accuracy by Mode, Street, Position and Spot - Four tables; the mode table has a Full Game row, and the Spot table (your 20 most-played spots) sorts worst-first or best-first
- Suggested Study - Up to five of your lowest-accuracy spots with more than 10 hands played
Accuracy is per game: the dashboard follows the NLHE / PLO / PLO5 pill, so the three never blend. Training days, XP, quests and badges are account-wide. Game mode decisions count by the Game mode rule - everything but a Mistake or a Wrong size is accurate, and timed-out, assisted and ungraded decisions are left out (see How decisions are graded). Decisions from full preflop hands count with the rest of your preflop practice.
Signed out, the dashboard has nothing to show, but your history still builds: training from this browser merges into your account the first time you sign up or sign in in that browser. Guest data is deleted after 90 days without activity.
The streak widget at the top of the left pane shows your day streak, level and progress toward today's goal. On mobile, find it on Spot. Expand it for the level gauge, Stats and free runout-depth counters. Core shows "Unlimited runouts".
- XP and levels - A correct practice answer earns 10 XP times the combo multiplier: ×2 from 3 correct in a row, ×3 from 6, ×4 from 10, shown on the flame badge. A Study view earns 2, a Game mode decision that wasn't a Mistake or a Wrong size earns 10 flat, and badges, quests, a Perfect Day and a monthly volume bonus add more. Level n takes 50·n·(n-1) XP, so level 2 is 100 XP, level 5 is 1,000 and level 10 is 4,500. XP earned on the site's calculators and study pages counts toward the same level.
- Perfect Day - 10 spots in a day completes the daily goal. Practice answers, right or wrong, Study views and finished Game mode hands all count, and a full preflop hand counts once however many decisions it had. Spot Rush answers don't.
- Daily quests - Three a day, drawn from seven ("Answer 15 postflop spots", "Answer 15 preflop spots", "Nail 10 turn/river spots", "Study 10 spots", "Use a calculator", "Hit a 6x combo", "Play a Spot Rush"). Each pays 20 XP; opening the dashboard claims the ones you've finished, and finishing all three opens a quest chest. A full preflop hand counts as one preflop spot. None of them counts Game mode hands.
- Badges - Milestone awards, including six for Game mode. Trophies from the site's calculators and study pages show in the same case. New ones queue up: at most one small notice a day tells you what's waiting, and opening the dashboard shows them all at once. Any badge can be shared as a card. Signed-out visitors earn them from the day they sign up.
- Handle - Signed in, click the pencil in the streak widget to set your display name.
Free runout depth
On the three rotating boards, free accounts and signed-out visitors study a daily set of 5 turn cards and 5 river cards, so each flop shows 5 turns and each turn 5 rivers; the rest of the runout grid shows locked. From your second day in a row on a free account, each day unlocks one more card (turns first), reaching 12 turns and 12 rivers on day 15. Any day you open the solver counts. Skip a whole day (Chicago time) and you are back to 5+5, with a notice saying so. Signed-out visitors stay at 5+5, and Core removes the ladder entirely. Single-street turn and river spots in Postflop Practice deal from the same unlocked set; Play Flop to River and Game mode deal from the whole deck.
Your custom daily flop has a separate allowance: five distinct cards total for both streets. For example, choosing 2♠ on the turn and 9♥ on the river uses two cards. In another line you can use 9♥ on the turn and 2♠ on the river without spending more. You can add the other three cards later, but cannot swap out a chosen card before the daily reset. The streak does not change this pool. A card cannot appear twice on the same board.
XP also unlocks three card styles - Aurora at level 2, Royal Felt at level 5, Midnight at level 10 (see Settings).
Click the gear icon in the top-left corner to open Settings. On mobile it sits top-right on the Spot tab.
Card Style - A carousel of 12 deck styles, browsed with the ‹ › arrows or the ← → keys, each previewing all four suits: Classic, Classic Big, Vivid, Tinted, Neon, Bold, Bold Dark, Standard, Icon, plus three that unlock with XP - Aurora (level 2), Royal Felt (level 5), and Midnight (level 10). Locked styles preview dimmed with the level required. Each style changes how card faces look throughout the tool.
Metered connection, under Data, loads study data only when you request it. Runout grids wait for you to press Load runout grid. The session counter shows data transferred and request count. If your browser reports Data Saver, the app suggests this setting once and leaves the choice to you.
Appearance - Themes live on your Account page under Appearance: 21 themes (15 dark, 6 light) plus a separate action-colors choice with a colorblind-safe palette. A theme covers the site and the solver together - an already-open solver tab updates to match - and follows your account to any device you sign in on. The action-color choice is saved per device. New visitors start on Harvest, a light theme; see Action Colors for what the palettes change.
Take the tour - Replays the guided tour, which runs by itself on a signed-out first visit. It has five chapters; the last walks through Game mode. A Training Dashboard row opens your stats.
Game mode keeps its own settings - timer, auto-deal, villain cards - in its left pane; see Game Mode.
On desktop, hold Shift for about a quarter-second to show the shortcuts available in the current view. Release it to dismiss. The overlay stays hidden while you type in a text field, below 1024px, or while Cmd, Ctrl or Alt is held.
If you want the cheatsheet to stay open while you experiment, press Shift+? to pin it (this one works inside text fields too); Esc closes it. New visitors also see a small "Hold ⇧ for shortcuts" hint in the corner. It goes away the first time you open the overlay or dismiss it, comes back after a week, and never shows on the Career Analysis or Notebook pages.
Global
| Shortcut | Action |
|---|---|
| Shift+? | Pin / unpin the cheatsheet |
| Shift+, | Open Settings |
| Shift+` | Focus the left pane (Players → Stacks → …) - see "Left-pane navigation" below |
| Shift+C | Open the Solver Notebook |
| Shift+F | Focus the filter input in the current view |
| Esc | Close the topmost modal or cheatsheet - or blur the focused text input (so you're not trapped inside the filter) |
Restart the tour from Settings > Take the tour.
Trainer (study, practice, game mode)
| Shortcut | Action |
|---|---|
| Shift+M | Toggle Study / Practice. From Study it opens Game mode; from Game mode it returns to the Study section you came from |
| Shift+P | Toggle Preflop / Postflop. From Game mode it opens Preflop Study |
| Shift+N | New spot in Postflop Practice and the one-spot preflop quiz; next hand in full preflop hands; next hand (or Deal) in Game mode |
| Shift+D | Open the Training Dashboard (Postflop Practice) |
Card picker (browse the 4×13 grid)
| Shortcut | Slot |
|---|---|
| Shift+[ | Flop card 1 |
| Shift+] | Flop card 2 |
| Shift+\ | Flop card 3 |
| Shift+; | Turn |
| Shift+' | River |
These card-picker shortcuts work in Postflop Study. In the picker, use the arrow keys, then Enter, or type a rank and suit: A then S for A♠.
Left-pane navigation
Press Shift+` to enter a Tab-scoped navigation mode for the left config pane; focus lands on the Players row. A colored stripe on the right edge of the pane confirms you're in nav mode. From there:
- Arrow keys move within a group (HU ↔ 6max, 100bb ↔ other stacks, SRP ↔ 3BP ↔ 4BP, …).
- Tab moves to the next control in the pane (Players, then Stacks, Seats, the free boards and Preflop Line, and the buttons between them) - scoped to the left pane only; Tab won't escape into the strategy panel or the hands list.
- Shift+Tab goes back.
- Enter or Space activates the focused option.
- Esc exits nav mode and blurs focus back to the page.
- Clicking anywhere outside the left pane also exits nav mode.
Each pill group is one Tab stop and Tab lands on the currently-selected option, so you start where you are. Practice works the same way for its Lines, Streets, Spot, Turn card and seat groups.
Flow keys (no modifier needed)
Flow keys work without Shift.
| Key | Action |
|---|---|
| 1-N | Press the action button at that position, left to right. Most spots have four actions or fewer. |
| Space or Enter | Continue to next hand after the answer is revealed; in Game mode and full preflop hands, deal the next hand when the table is waiting. Works while a left-pane control has focus, with one exception: inside the Starting hands and Boards lists, reached with the keyboard, Space ticks or presses the focused control and Enter presses a focused button. After a mouse click there, both still continue. |
| M | Press Mix in the one-spot preflop quiz - and in Postflop Practice on solves that show the button |
| Backspace | Undo the last Study step |
Action buttons are always laid out in a consistent order: Fold → Call → Raise (smallest → largest) when facing a bet, or Check → Bet (smallest → largest) otherwise. So 1 is always Fold (or Check), 2 is always Call (or the smallest Bet), and 3… are the raise/bet sizes in increasing order - same mapping at every node, whether you're in Study, Practice, or Preflop Practice.
Direct card entry (turn & river)
When the board is at 3 cards (turn waiting) or 4 cards (river waiting), you can add the next card in two keystrokes - no picker UI:
- Press Shift+rank - a small banner at the top arms the rank and waits for a suit.
- Press the suit letter (S ♠, H ♥, D ♦, C ♣) - with or without Shift held - and the card lands on the next empty slot.
| Example | Result |
|---|---|
| Shift+A then H | Ace of hearts → turn |
| Shift+3 then C | Three of clubs → river |
| Shift+T then S | Ten of spades |
Direct card entry works in Postflop Study. The selected rank waits until you enter a suit, press Esc, or press another key. You can keep Shift held while entering the suit. Cards already on the board are ignored.
During the guided tour: Esc skips it, → or Enter goes to the next step, ← back one.
Notebook-specific shortcuts (Run, Save, Stop, cell ops) live in the Solver Notebook → Keyboard Shortcuts section below.
Work with solver data
Use the Solver Notebook to compare hands across boards, filter ranges and reuse the results in later queries. Each line of a cell is a command. Assign a result to a $variable to use it again. For example, query ten flops, then compare which hands bet on each one.
The notebook uses the same solve data and account as Study. Results appear as tables, charts, comparisons or text. Your scratch work stays in the browser between visits; Save keeps a notebook on your account and gives it a share link.
A fresh session opens a welcome note, help and solves. These run automatically without using your browsing allowance. Usage records include command names and solve IDs, but not the arguments you entered.
Open in Notebook in Postflop Study hands the spot on screen to the notebook as a ready-made spot cell. It doesn't run by itself: a banner offers Run cell, Go to cell or Dismiss.
Three games (PLO, PLO5, NLHE)
A notebook can contain PLO, PLO5 and NLHE solves. The solve ID chooses the game: nlhe_ for NLHE, plo5_ for PLO5, and the remaining IDs for PLO. You do not need to switch a game setting.
Everything that differs between the games follows the solve automatically:
| PLO | PLO5 | NLHE | |
|---|---|---|---|
| Hand classes | 16,432 | 134,459 | 169 |
| Combos | 270,725 | 2,598,960 | 1,326 |
| Preflop categories | 40 of 52 | 42 of 52 | 13 |
| Postflop categories | 59 in 14 groups | 59 in 14 groups | 40 in 15 groups |
| Range syntax | PPT generic Omaha | PPT, five cards | Hold'em range notation |
| PQL game | game='omahahi' | game='omahahi5' | game='holdem' |
--categorize adds each hand's category without using extra browsing allowance. Every row also includes draw flags such as NFD, OESD, Gutshot and BDFD, whether or not you request categories.
NLHE has 169 hand classes, or 1,326 specific combos with --by-combo. PLO5 has 134,459 classes, and spot --limit defaults to all of them. Use a hand filter or a smaller limit when you only need part of the range.
spot --equity is NLHE-only. It calculates hero's equity against the opponent's arriving range, exactly on the turn and river and by sampling on the flop. The summary labels the method. The published NLHE library has no postflop EV values.
compare, join, diff, matchup, range-compare and sql require inputs from the same game. To study different games in one notebook, keep their analyses in separate cells.
Rake, bet sizes and whether individual hands mix postflop can differ between depths. Check solve-info before interpreting a cross-depth comparison:
solves --game nlhe
solve-info nlhe_6max_100bb # mixed postflop, rake 5% cap 2bb
solve-info nlhe_6max_200bb # pure postflop, rake 5% cap 1.5bb
$bb = spot nlhe_6max_100bb --line SRP --actor BB --opponent BTN --board Kh7s2c --postflop check --categorize Notebook controls
The notebook has a toolbar, a variables sidebar and a list of cells.
- Toolbar - Click the title to rename the notebook. File contains saving, sharing, examples and import/export. Use Run All, Stop and + Cell to run or add cells. A progress indicator shows the current run.
- Sidebar - the Variables panel. Every
$nameproduced by a cell appears here with its kind and shape. Click the name to insert$nameinto the focused cell at the caret (the last cell if none is focused); click ✕ to delete. - Cells - Each numbered cell shows its variable name, output and run time. Its controls run one cell or a range of cells, move or duplicate the cell, add another below it, clear its output, or delete it. Export results as CSV or JSON, copy the command, or copy results as Markdown. On mobile, additional controls are under ....
Cells & variables
Enter one command per line. Enter adds a line; Shift+Enter runs the cell. Commands run from top to bottom, so a later line can use variables from earlier lines. The last result appears below the cell. Errors identify the line that failed.
A quoted string can span lines, allowing a long sql query in one statement. Editing a cell clears its displayed output but keeps its variables. Put clear in a cell of its own.
| Input | Effect |
|---|---|
solves | Run a command, display its result inline (table, stats card, bar chart, etc. depending on what it returns). |
$x = spot hu_100bb --line SRP ... | Bind the result to $x. Appears in the sidebar; referenced in later cells as $x. |
$flops = [Kh7s2c, AhKhQh, 9h8h7s] | Make a list variable. |
each $flops | spot ... --board=$_ | Run a template once per list item; $_ substitutes the current value. |
$x = each $flops as b | spot ... --board=$b | Same with a named iteration variable; the iterations merge into one stacked table, bound by the outer $x =. |
# Just a comment | Cell with only # lines renders as a markdown note - not executed. |
Press Tab to complete a command, flag or known value such as a solve ID. Command completion works at the start of a statement or after =; $variable completion works anywhere. Use ↑/↓ to choose a suggestion, Enter to accept and Esc to dismiss.
History: with the cursor on a single-line cell, ↑/↓ cycle through the 100 most recent commands you've run (saved in your browser between visits).
Markdown cells
Start every non-blank line with # to make a Markdown note cell. It displays as prose rather than running commands.
Supported markdown subset:
- Headings: the first
#on a line is the comment marker itself, so## Titlerenders as the big heading,### Subheadthe next size down, and deeper levels render small. - Bullet lists: lines starting with
-or*. - Numbered lists: lines starting with
1.,2., … - Inline:
**bold**,*italic*,`code`,[link text](url). - Horizontal rule: a line of 3+ dashes, em-dashes, or underscores.
Markdown notes display when you open the notebook, including shared notebooks.
Running cells
Every cell can be run individually or as part of a range:
| Action | What it runs | Where |
|---|---|---|
| Run (per-cell) | Just this cell. | Cell's Run button, or Shift+Enter in the input. |
| ▲ run (per-cell) | All cells above this one, top-to-bottom. | Cell header, left of move buttons. |
| ▼ run (per-cell) | This cell and all cells below, top-to-bottom. | Cell header. |
| Run All | Every cell in the notebook, top-to-bottom. | Top bar button or ⌘⇧↵. |
| Stop | Halts a range run and aborts the cell currently executing - a lone hung cell stops too. | Top bar, beside the grayed-out Run All, or ⌘. |
During a range run, the top bar shows "Running cell N of M…". Runs halt immediately on the first cell that errors - you'll see a red-bordered cell pointing to what failed.
Keyboard shortcuts
Hold Shift for a quarter-second to show the notebook shortcuts. Use Cmd on Mac and Ctrl elsewhere for the aliases below. Shift shortcuts pause while you type in a cell; Cmd/Ctrl aliases still work.
Notebook
| Shortcut | Action |
|---|---|
| Shift+R | Run all cells |
| Shift+S | Save notebook (creates slug if new, updates if yours) |
| Shift+. | Stop a running range |
| Shift+\ | Toggle the variables sidebar |
| Shift+G | Jump to the cell that defined the first variable |
⌘⇧↵ | Run all (alias) |
⌘S | Save (alias) |
⌘. | Stop (alias) |
Cell operations (target = focused cell, or last cell)
| Shortcut | Action |
|---|---|
| Shift+A | Add a new cell below the focused one (and focus it) |
| Shift+O | Add a new cell above the focused one |
| Shift+Backspace | Delete the focused cell |
| Shift+Y | Duplicate (yank) the focused cell |
| Shift+J / Shift+K | Move the focused cell down / up (vim-style) |
| Shift+↑ / Shift+↓ | Focus previous / next cell |
⌘↑ / ⌘↓ | Focus previous / next cell (alias) |
Inside the cell editor
| Shortcut | Action |
|---|---|
| Shift+↵ | Run the current cell |
⌘↵ | Run the current cell (alias) |
| Tab | Autocomplete command name / variable |
| ↑ / ↓ | Cycle suggestions, or command history (on single-line cells) |
| ↵ | Accept the selected suggestion (when the suggestion panel is open) |
| Esc | Dismiss the suggestion panel |
Command reference
Run help for the full list, or help <cmd> for detail on one command. Commands are grouped:
Session
| Command | Purpose |
|---|---|
help [cmd] | List all commands, or show detail for one. |
vars | List active variables. |
clear $var / clear --all / clear --cells | Remove a single variable, everything, or just cells. |
export $var --format csv|json | Download a variable's result as CSV or JSON. |
Specify the solve for commands that read solve data, either as the positional argument or with --solve <id>. For example, hand --solve hu_100bb AAKK. Different cells can use different solves. Invalid numeric flags produce an error.
Solves & catalogs
| Command | Purpose |
|---|---|
solves | Every available solve - 9 PLO (hu_100bb, plus 6-max at 12, 20, 30, 40, 50, 100, 150 and 200bb), 2 PLO5 (plo5_hu_100bb, plo5_6max_100bb) and 9 NLHE (nlhe_hu_100bb, plus 6-max at 20, 30, 40, 50, 70, 100, 150 and 200bb). --game plo|plo5|nlhe filters the list. |
solve-info <solve> | Solve metadata: players, positions, spots, tree size, decision counts, rake, and postflop purity. |
flops [--suit --pair --high --conn --suited-high --pair-pos --gaps] | Every canonical flop with the same texture vocabulary agg uses (plus the suited high card, the paired card's position and the gaps between ranks), and each flop's multiplicity and weight share. --sample N draws a random set, repeatable with --seed. Zero data budget; joins agg results on board. |
hands <solve> --ppt "AA:$ds" | The solve's canonical hand catalog (16,432 classes in PLO, 134,459 in PLO5, 169 in NLHE), filterable by PPT / cat / suit pattern. Literal suits like As are refused on a canonical catalog, where one row stands for every suit combination; ppt, preflop-spot, range-summary and filter apply the same rule. |
hand <solve> AAKKds | One canonical hand's full record. |
hand-categories | All 5 categorization systems (preflop, preflop-meta, suit, postflop, postflop-meta) in one call. |
ppt "<expr>" --solve <solve> | Standalone PPT enumerator - every canonical hand matching an expression (--solve is required, and sets the game). |
Preflop
| Command | Purpose |
|---|---|
preflop-lines <solve> | All decision spots (RFI / SRP / 3BP / ...). |
preflop-spot <solve> --line RFI --actor IP | Full per-hand raise / call / fold / VPIP for a spot. --ev adds per-action EV in bb - the published library has EV preflop only; custom solve EV is separate, and EVs are absolute from the start of the hand, so folding is worth minus the blind you posted, not 0. |
preflop-hand <solve> AAKKds --line RFI --actor IP | Action mix for one hand (or all variants of a rank-name like AAKK); takes --ev too. |
Game tree
| Command | Purpose |
|---|---|
tree <solve> --street flop | Dump nodes for one street. |
node <solve> <nodeId> | One node's actions, children, parent chain. |
walk <solve> --path <action-codes> | Follow a sequence of action codes from the root (advanced - find-spot is the friendlier interface). |
find-spot hu_100bb --line SRP --actor IP --opponent OOP --postflop check | Resolve a line + actors + postflop sequence to a concrete nodeId. Board-independent - the trees are abstract. |
Ranges
| Command | Purpose |
|---|---|
range-index <solve> | Dump of the per-node range index for a solve. |
range <solve> <nodeId> | Raw range mass for a player at a flop-entry node. |
range-summary <solve> <nodeId> | Range aggregated per canonical hand, sorted by mass. |
Query a study spot
spot returns each hand's action frequencies for a line, board and sequence of postflop actions. By default, it weights hands by how often they reach the decision. Enter the command on one line:
$s = spot hu_100bb --line SRP --actor IP --opponent OOP --board Kh9s5s --turn 2d --river Qh --postflop check,bet100,call,check,bet100,call,check --categorize
# Narrow and shape the result:
$aa = spot hu_100bb --line SRP --actor IP --opponent OOP --board Kh7s2c --postflop check --ppt "AA" --action bet100 --threshold 50 --sort f_bet100 --limit 500 Optional flags:
--turn <card>/--river <card>- required when the postflop walk crosses into a later street. The strategy is runout-specific.--boardalso accepts the 4- or 5-card board inline.--by-combo- emit per-physical-combo rows (one row per specific combination) instead of per-canonical aggregation. Required by every command that needs real cards:blockers,blocker-map,combos-weighted,category-breakdown,matchup,pql,range-compare --by cat|metaandcompare --group-by postflop-*. Canonical rows carry each class's most common category; per-combo rows carry their own.--range "<expr>"/--ppt/--pql-range- hand filters; see Range filters in the notebook.--cat <id>- keep only hands in one preflop category.--equity(NLHE only) - hero equity vs the opponent's arriving range;--vs <seat>picks which opponent in a multiway line. See Three games.--no-reach- Give each combo weight 1 instead of its arriving weight. Use only for an unweighted comparison: downstream range summaries will otherwise overrepresent hands that rarely reach the spot.--categorize- annotate each hand with its hand category at every street (see below).--node-id <id>- skip line resolution if you already know the nodeId (--boardis still required).
Reach propagation (default)
reachWeight measures how much of the starting range reaches the decision with each hand. It combines the hand's preflop weight with its frequency for each of the player's earlier actions. A hand almost always folded earlier has little weight later. The summary's actionMix uses these weights, matching Study's action bar.
If the arriving range cannot load, the command reports an error. Use --no-reach only when you want an unweighted result. Hand classes with zero arriving weight are omitted and counted in the summary; --no-reach or --by-combo includes them.
Hand categories (--categorize)
You get one category column per street the board reaches:
flop cat(flopCatId/flopCatLabel) - The hand's category on the flop. Always present.turn cat(turnCatId/turnCatLabel) - The hand's category on the turn. Present on turn and river results.river cat(postflopCatId/catLabel;riverCatId/riverCatLabelon per-combo rows) - The hand's category on the river. Present on river results.
All three share one category id space per game (0-58 in PLO and PLO5, 0-39 in NLHE), so metaOf() / metaName() work on any of them. postflopCatId is always the final-board cat (= flop cat on flop spots, turn cat on turn spots, river cat on river spots).
This lets you trace how a hand's category evolves - e.g. a flop NFD that turns into Top Pair and rivers a Bottom Set, with all three columns side by side. Draws on made hands ride in the drawFlags column.
Categorizations
Six independent systems are exposed (the taxonomy commands take --game plo|plo5|nlhe to read another game's taxonomy; without it they follow the ambient solve):
| Command | What it returns |
|---|---|
preflop-categories | 52 preflop categories in 9 meta groups (Aces, High Pairs, Rundowns, etc.) - PLO reaches 40 of them, PLO5 42; NLHE has its own 13. |
suit-categories | Suit patterns: 5 in PLO (DS / SS / rainbow / mono / 3flush), 6 in PLO5, 3 in NLHE. |
postflop-category-labels | 59 postflop categories in PLO and PLO5 (Top Set, Nut Flush, NFD + Wrap, etc.), 40 in NLHE. |
meta-categories | 14 meta groups in PLO and PLO5 (Monsters, Flushes, Straights, Sets/Trips, ... Blockers, Air); NLHE adds Board Trips for 15. |
categories flop --solve hu_100bb --board Kh7s2c | Every hand on a board with its postflop category + meta. |
category-of flop Kh7s2c AhKsQsJs | One hand's category on a board (the hand can't share a card with the board). |
category-breakdown $s --by meta | Histogram of a spot's hands by meta group or full category, from a spot --categorize --by-combo source. --mass <action> weights each hand by reach times that action's frequency - the composition of the hands that actually take it. |
draw-flags | The draw-flag reference (NFD / FD / OESD / Gutshot / BDFD / Overcards and the rest) - the sixth system, one layout for every game. |
Blockers, runouts, combos
| Command | Purpose |
|---|---|
blockers $s AhKh | How much of the opponent's range is blocked by these cards. Needs --by-combo on the source spot. |
blocker-map $s | 52-row heatmap: what % of opponent range each card blocks (--top N keeps the strongest). Needs --by-combo on the source spot. |
runouts <solve> --line SRP --actor BTN --opponent BB --board Kh7s2c --postflop check,bet33,call | For every possible next card (turns by default; --target river from a 4-card base board), the mean frequency of each action at the decision node. The walk must END on the target street - after a flop bet-call, the next decision IS the turn node - and the command errors with guidance if it doesn't. The stat is an unweighted mean over all remaining combos. The Solver UI's runout grid is range-weighted, so the two can differ; on NLHE, --weighted switches to the arriving-range mix, and the summary names which ran. --group-by class rolls cards into texture classes. Result is a runout grid that's also queryable as a table (one row per card, columns card / cardIdx / f_<action>). |
combos <solve> AAKKds | Every physical combo of a canonical hand. |
combos-weighted $s AAKKds | Same list, with reach weight from a prior --by-combo spot. |
Equity / PQL
| Command | Purpose |
|---|---|
pql "<query>" | Run a Poker Query Language query - equity, hand-type histograms, percentile selectors, scenario predicates. Supports all 10 PQL games: PLO4/5/6, Hold'em, Omaha-8, 5-card Omaha-8, Stud, Stud-8, Razz, and Triton-rule shortdeck. $variables outside string literals expand to explicit combo lists - reach-weighted (combo@weight) whenever the rows carry reachWeight - so GTO ranges from spot --by-combo pipe straight in. Canonical rows, including preflop-spot's, are refused. Flags: --trials, --seed, --timeout, --unweighted. See PQL inside the notebook. |
matchup $a $b --board Kh7s2c | Range-vs-range all-in equity with win / tie / loss frequencies, reach-weighted, from two --by-combo spots. Cross-game pairs are rejected. |
Compare query results
| Command | Purpose |
|---|---|
filter $s --ppt "AAKK" --action f_check --threshold 70 | Filter rows by PPT / category (--cat, --meta) / action threshold (--max for an upper bound), with --sort / --asc / --limit. Takes --range/--ppt but not --pql-range. |
diff $a $b --action f_bet100 | Per-hand delta between two spots on one action. |
compare $a $b $c --action f_check --all-min 50 | Wide table: rows = hands, cols = each var's action frequency. --all-min keeps hands where every var clears the bar; --any-min where any does. |
compare $a $b $c --action f_bet100 --ppt "AA:$ds" | Filter each var's hands via PPT before the join. |
compare $a $b $c --action f_bet100 --group-by postflop-meta | Aggregate per category - rows = categories, cols = each var's combo-/reach-weighted avg frequency for hands in that group. |
compare --solves 6max_20bb,6max_100bb,6max_200bb --line SRP --actor BTN --opponent BB --board Kh7s2c --action check | Compare the same spot across the listed solves in one command. Rejects --node-id (node ids are per-solve) and reports an error if a solve lacks the action (different depths use different bet sizes). |
join $a $b --on display | Join two hand-row tables (--how inner|left; the right table's clashing columns get a b_ prefix). |
line-freq <solve> --line --actor --opponent --board --postflop | How much of a player's range keeps going along the line described - own-action reach retention, conditional on the board - on the flop, turn or river. |
range-compare $a $b --by meta | Composition shift between two ranges, grouped by category or meta group. |
describe $s | Row count, column names, numeric column stats (mean/min/max). |
agg / $a = agg srp_btn_bb --solve 6max_100bb / agg srp_btn_bb --by suit | Flop-by-flop action frequencies for a line, with texture rollups and SQL-queryable output. Use --solve to choose a depth. --by suit|pair|high|conn|suitedHigh|pairPos|gaps groups by texture; --sort, --asc and --limit shape the result. See Compare flop textures. |
--group-by values:
postflop-cat- fine-grained (59 postflop categories; 40 in NLHE). Needs--by-comboinputs.postflop-meta- 14 meta groups (Monsters, Flushes, Straights, Sets/Trips, ... Blockers, Air; 15 in NLHE). Needs--by-comboinputs.preflop-cat- 52 preflop categories (13 in NLHE)preflop-meta- 9 preflop meta groups (5 in NLHE)
Grouped averages use arriving-range weights by default. Run compare and diff with matching weight settings: they reject a mixture of weighted and --no-reach inputs. Rerun the named variables with the same setting.
compare matches hands by handIndex, display, combos and preflop category. It leaves out board-dependent values such as river category, reach weight and action frequencies from the shared identity columns. With --categorize, flop and turn labels remain available.
Compare flop textures
agg lists 753 flop tables across 19 of the 20 library solves. Each row gives a board's c-bet, donk and check-raise-response frequencies, weighted by the hands reaching that decision. Browsing these tables uses none of your browsing allowance.
Select the solve or pass --solve. Names follow <line>_<seats in preflop order>. For example, srp_btn_bb exists at 17 depths, so specify which one you want. HU names use _oop_ip on hu_100bb and _ip_oop on plo5_hu_100bb. A saved notebook can use its active solve; a scratch notebook asks you to choose when a name is ambiguous.
Columns prefixed oop_ describe the first player postflop; ip_ describes the second. Sizes vary by solve and pot type, so use the table's column names. Join tables on board, never by row order.
$a = agg srp_btn_bb --solve 6max_100bb
agg srp_btn_bb --solve 6max_100bb --by suitedHigh
agg srp_btn_bb --solve 6max_100bb --by pairPos
agg srp_btn_bb --solve 6max_100bb --by gaps Use flops to choose boards for a study set. It can filter by suit, pair position and rank gaps, then draw a repeatable sample:
$f = flops --suit two-tone --pair unpaired --suited-high A,K --sample 20 --seed 7
flops --pair paired --pair-pos low --sample 20 --seed 7
flops --suit rainbow --pair unpaired --gaps 0,1,2 --sample 20 The same seed repeats the selection. Sampling accounts for how often each board class occurs in real deals. Use the full table, weighted by mult, to measure a population frequency. A plain average of board classes gives rare and common classes equal weight. Listing flops is free of the browsing allowance; running a separate spot query for each one uses that allowance.
The rollups group boards by the highest card of the flush suit, the paired rank's position or rank gaps. For example, K77 and KK7 belong to different pair-position groups. A response group with no arriving hands means that decision was not reached on that board.
Signed-out visitors see the three rotating flops. Free accounts also see their chosen flop; Core opens every row. The summary counts withheld rows. A table from an outdated solve is rejected with a message naming the versions. Example notebooks include saved results that can be read without running queries.
SQL over $variables
Use sql for read-only queries over table variables. Keep the $ prefix: FROM $s1 or JOIN $other. Supported clauses include SELECT, WITH, inner/left joins, GROUP BY, ORDER BY, HAVING, UNION and subqueries. Inputs must belong to the same game.
Write one SQL statement per cell. A trailing semicolon is allowed, and the quoted query can span lines. In a UNION, column names come from the first SELECT, a leading WITH applies to every branch, and an empty branch produces an error. Use --limit to cap displayed rows.
User-defined functions you can call inside SQL:
| Function | Returns | Use |
|---|---|---|
range(cards, "<expr>") | 1 / 0 | Game-dispatched hand filter - PPT dialect on PLO and PLO5 rows, Hold'em notation on NLHE rows. On canonical rows it tests the class's representative hand, so use --by-combo rows for anything suit-specific. Percentile tokens aren't available inside SQL; filter with them at the spot/filter level instead. |
ppt(cards, "<expr>") | 1 / 0 | WHERE ppt(cards, 'AA:$ds') = 1 - PLO and PLO5 rows (errors on NLHE; use range()). ppt_match is an alias. |
drawFlags(bits) | string | Decode a row's draw-flag bitmask (NFD, OESD and so on), any game |
metaOf(postflopCatId) | int | postflop meta group id (0-13; 0-14 in NLHE) |
metaName(postflopCatId) | string | group label ("Sets / Trips", "Top Pair" and so on) |
preflopCat(preflopCatId) | string | preflop category label |
preflopMeta(preflopCatId) | string | preflop meta group label |
Examples:
# Top cbet hands that match a PPT expression
sql "SELECT display, f_bet100 FROM $s1
WHERE ppt(cards, 'AA') = 1
ORDER BY f_bet100 DESC LIMIT 20"
# Three-way JOIN across flops, sort by biggest cbet delta
sql "SELECT k.display,
k.f_bet100 AS k72,
m.f_bet100 AS mono,
(k.f_bet100 - m.f_bet100) AS delta
FROM $spot_k72 k
JOIN $spot_mono m ON k.handIndex = m.handIndex
ORDER BY delta DESC LIMIT 30"
# CTE + HAVING - preflop classes where hands cbet >=50% on avg, n>=10
sql "WITH by_class AS (
SELECT preflopCatLabel, AVG(f_bet100) AS avg_cbet, COUNT(*) AS n
FROM $s1 GROUP BY preflopCatLabel
)
SELECT * FROM by_class
WHERE avg_cbet >= 50 AND n >= 10
ORDER BY avg_cbet DESC" Reserved names: total, count, and a few other words are reserved by the SQL engine - use different aliases (e.g. total_combos). If you hit one, the error message names the conflicting keyword and suggests an alternative.
Window functions have limited support: ROW_NUMBER() over simple partitions works, but RANK() and more advanced analytical functions don't.
Column cheat-sheet for spot results:
| Column | Meaning |
|---|---|
handIndex | Canonical hand id: 0-16,431 in PLO, 0-134,458 in PLO5, 0-168 in NLHE. Stable identifier across solves of the same game. |
display | Human-readable canonical hand, e.g. AAKKds. |
cards | CSV of the hand's card values (4 in PLO, 5 in PLO5, 2 in NLHE). Used by range(cards, ...) and, on --by-combo rows, by the pql command's $var substitution. |
combos | Canonical combo multiplicity (1 / 4 / 6 / 12 / 24). |
reachWeight | Reach-weighted combo mass at this node. Present unless --no-reach was passed. |
preflopCatId / preflopCatLabel | Preflop category (0-51). |
flopCatId / flopCatLabel | Flop hand category (0-58 in PLO and PLO5, 0-39 in NLHE). Always present when --categorize. |
turnCatId / turnCatLabel | Turn hand category (same ids). Present on turn/river spots. |
postflopCatId / catLabel | Final-board hand category (same ids) - = flop cat on flop spots, turn cat on turn spots, river cat on river spots. |
f_<action> | Frequency % of that action. Token names are tree- and node-specific - hu_100bb offers f_bet33 / f_bet100 on the flop, with raises of 66% and pot (f_raise66 / f_raise100) facing a bet; 6max_50bb uses f_bet66 on the flop and f_bet100 on the turn; plus f_check, f_call, f_fold, f_allin. Run describe $s after fetching a spot to see the exact action columns the resolved node exposes. |
drawFlags / strength / pctile / equity | Draw-flag bitmask (every game, every spot), plus NLHE extras: hand rank 1 (nuts) to 7,462 and its percentile (per-combo tables), and hero equity (with --equity). Per-combo tables key the hand as combo as well as combos. |
Range filters in the notebook
Every command that filters hands accepts --range "<expr>" (and --ppt, its long-standing alias - both behave identically). Inside SQL, use the range(cards, '<expr>') UDF in any WHERE / SELECT context.
Range notation follows the solve's game. In Omaha, AKs means an ace and the king of spades. In NLHE, it means suited ace-king. Check the game before reusing an expression:
| On a PLO or PLO5 solve | On an NLHE solve |
|---|---|
AA, AAKK, AA:$ds | AA, AKs, AKo |
AA-JJ, AxKx, [A-J] | 99+, TT-77, ATs+, A5s-A2s |
$ds $ss $0g $np | Axs, AsKh, !TT |
15% / 10%-25% - percentile, every game | |
Percentile tokens rank hands by all-in equity using the PQL engine's own tables, so --range "15%" and pql "hero='15%'" describe exactly the same hands. See PPT Filter Syntax for the full PLO reference.
Use --pql-range for the raw PQL grammar in every game, including AK:$s, weighted ranges or solver-range references. It works with hands, categories, preflop-spot, range-summary, spot and compare. The filter command accepts --range and --ppt only. Unknown flags produce an error.
# Standalone enumerator - every canonical hand matching the expression:
ppt "AAKK:$ds" --solve hu_100bb
ppt "22+, ATs+, KQs" --solve nlhe_6max_100bb
# Filter a spot (PLO dialect):
$aces = spot hu_100bb --line SRP --actor IP --opponent OOP --board Kh7s2c --postflop check --range "AA"
# Filter a spot (NLHE dialect):
$broadway = spot nlhe_6max_100bb --line SRP --actor BB --opponent BTN --board Kh7s2c --postflop check --range "22+, ATs+, KQs"
# Filter a prior variable - uses that table's own game:
filter $s --range "AA-JJ"
# Filter inside SQL (suit shapes are safe on canonical rows; literal suits need --by-combo rows):
sql "SELECT display, f_bet100 FROM $s WHERE range(cards, 'AA:$ds')
ORDER BY f_bet100 DESC LIMIT 20" PQL inside the notebook
Use pql to calculate equity, percentile or scenario results from solver ranges inside your notebook. The PQL reference covers the language, games, functions and limits. The examples below show how to pass notebook results into a query.
Basic shape:
# Equity of AAKK double-suited vs random on a dry flop:
pql "select avg(equity(hero)) from game='omahahi', hero='AAKK:$ds', villain='**', board='Kh7s2c'"
# Hand-type histogram on the river:
pql "select histogram(handType(hero, river)) from game='omahahi', hero='AAKK:$ds', villain='****', board='Kh7s2c'"
# Percentile selector - top 15% of PLO hands by all-in equity vs random:
pql "select avg(equity(hero)) from game='omahahi', hero='15%', villain='**'"
# Different game - Triton-rule shortdeck (6+ Hold'em):
pql "select avg(equity(hero)) from game='shortdeck', hero='AKs', villain='QQ'" Supported games: holdem, omahahi (PLO), omaha8, omahahi5 (PLO5), omaha85 (Big O), omahahi6 (PLO6), studhi, stud8, razz, and shortdeck.
Piping GTO ranges into PQL
To use a table variable as a player range, fetch the source spot with --by-combo and write its $name outside quotation marks. PQL needs specific card combinations here; canonical hand classes, including preflop-spot results, are rejected.
# 1. Get the IP range at a postflop decision node, one row per combo.
$ip = spot hu_100bb --line SRP --actor IP --opponent OOP --board Kh7s2c --postflop check --by-combo
# 2. Equity of that range vs random:
pql "select avg(equity(hero)) from game='omahahi', hero=$ip, villain='**', board='Kh7s2c'"
# 3. Filter the GTO range first via SQL, then equity it - only hands betting >= 50%:
$ip_bets = sql "SELECT * FROM $ip WHERE f_bet100 >= 50"
pql "select avg(equity(hero)) from game='omahahi', hero=$ip_bets, villain='**', board='Kh7s2c'"
# 4. Both players' GTO ranges at the same node - the actual range vs range matchup:
$oop = spot hu_100bb --line SRP --actor OOP --opponent IP --board Kh7s2c --postflop check --by-combo
pql "select avg(equity(hero)) from game='omahahi', hero=$ip, villain=$oop, board='Kh7s2c'" Substitution happens outside string literals only, so '$ds' inside a quoted PQL range stays literal - exactly what the PPT shape macros need.
Multi-query batches
Separate queries with ; to run several in one cell, even across games. Multi-query results merge into a stats card with one labeled row per query, plus a queryable table projection underneath.
pql "select avg(equity(hero)) from game='omahahi', hero='15%', villain='**';
select avg(equity(hero)) from game='omahahi5', hero='15%', villain='**';
select avg(equity(hero)) from game='omahahi6', hero='15%', villain='**'" Flags
| Flag | Default | Effect |
|---|---|---|
--trials <n> | 100,000 | Monte-Carlo sample size. Higher = tighter CI, slower. |
--seed <n> | random per call | RNG seed for reproducibility. Same query + same seed = bit-for-bit identical results. |
--timeout <sec> | 60 | Hard wall-clock cap. The query stops cleanly with whatever it has so far if it hits the cap. |
--unweighted | off | Sample a piped $var uniformly, ignoring its reach weights. |
Result rendering & downstream use
- Scalar aggregators (
avg,count,min,max) render as a stats card with the value, plus the standard error on a Monte Carlo run (an exact run reports the configurations it enumerated instead). - A single
histogramrenders as a bar chart sorted by poker rank, straight flush first and high card last. - Mixed scalars and histograms, or multi-query batches, render as a stats card with a queryable table projection underneath. Bind to
$varand feed back intosqlif you want to post-process.
Notes
- Percentile syntax is
'15%'; PQL has notopkeyword. Bands like'15%-30%'work; the 6-handed variant is'15%6h'(Hold'em, PLO4, and Omaha-8 also ship a 3-handed variant; PLO5/6 are 6-handed only). PLO4/5/6, Hold'em, Omaha-8, and 5-card Omaha-8 ship with prebuilt percentile tables; shortdeck does not, and a percent range there is an error. $varexpands to a literal combo list, so PQL set-algebra operators (:,!,,) work inside a single quoted range string but not between two substituted variables. Use SQL pre-filtering (WHERE) on the variable, then pipe the filtered result into PQL.- First percentile query on PLO5/6 or Big O can take 30-60 seconds to prepare hand rankings for that game - the cell just shows running while it builds.
- Stop button cancels long-running PQL queries.
- Solver ranges retain their arriving weights in PQL. A hand with more
reachWeightis sampled more often. If a table has that column but no positive weights, the query reports an error. Pass--unweightedto sample its rows equally instead. - The published library has no postflop EV values. Use PQL to calculate equity against a range; equity alone does not give the EV of a betting decision.
Save & share
Sign in, then choose File > Save to create a link such as solvepoker.app/solver/notebook/AB23C9Y7. Anyone with the link can read the notebook and its saved results. Only you can overwrite it; other readers can fork a copy to their account. Keep private material out of shared notebooks.
Limits: 100 saved notebooks per account, 500 KB of content per notebook, and 500 cells. Result snapshots are trimmed so a save fits; only cell text over 500 KB blocks one. Saving is manual - there is no autosave. A saved notebook remembers its active solve.
| Action | What it does |
|---|---|
File > Save (⌘+S) | Creates a new slug if unsaved; overwrites if you own it. Copies the share link to your clipboard. |
| File > Copy share link | Appears for saved notebooks - copies the URL to clipboard. |
| File > Fork to my account | When viewing someone else's notebook, creates your own editable copy. |
| File > My notebooks | Lists your saved notebooks; click to open. |
| File > Import / Export JSON | Works regardless of auth - a local-only transport if you want to back up or sideload notebooks. Export carries the title, the active solve and the cell inputs, no results; an import is checked before it replaces anything. |
Click the toolbar title to rename the notebook. Saving includes result previews, with the first 200 rows of large tables. Run All recomputes them using the reader's account.
Your local scratch session also keeps full results and variables in the browser. Reloading restores results for unchanged cells. Edited cells show a prompt to run again.
Example notebooks
Open File > Examples to load one of four study notebooks. A fresh session also shows them above the first cell. Run cells individually, inspect the saved results or edit the queries.
| Notebook | What it covers |
|---|---|
| The texture atlas | The whole single-raised BTN-vs-BB flop table at 6max 100bb through agg, sliced with sql, spot-checked with spot, and equity-checked with pql (17 cells). |
| Donk and c-bet by flop texture | Who leads and who c-bets over every flop in four single-raised spots at 6max 100bb, from four agg tables and sql - no metered fetches at all (19 cells). |
| Anatomy of a river bluff: the ratio, then the selection | hu_100bb: find-spot, then spot, sql, blocker-map and blockers, ending on which blockers favor a bluff (19 cells). |
| Why this turn has two bet sizes (NLHE) | nlhe_6max_100bb: spot, sql and describe across a turn node where the re-solve uses both sizes (14 cells). |
All four carry saved results for every cell that runs, rendered straight away and marked as a snapshot, so you can read each study without running anything - handy when a notebook reads data your plan doesn't open. Run All recomputes everything live against your own account.
Build an analysis
Fetch a spot, filter it, then compare or export the result:
# 1. Resolve the spot you want to study.
find-spot hu_100bb --line SRP --actor IP --opponent OOP --postflop check
# 2. Fetch per-hand strategy, categorized.
$s1 = spot hu_100bb --line SRP --actor IP --opponent OOP --board Kh7s2c --postflop check --categorize
# 3. Look at what hands CBET >= 70% of the time.
filter $s1 --action f_bet100 --threshold 70 --limit 50
# 4. Compare the same spot across multiple flops.
$s2 = spot hu_100bb --line SRP --actor IP --opponent OOP --board AhKhQh --postflop check --categorize
$s3 = spot hu_100bb --line SRP --actor IP --opponent OOP --board 9h8h7s --postflop check --categorize
compare $s1 $s2 $s3 --action f_bet100 --limit 30
# 5. Isolate interesting subsets.
compare $s1 $s2 $s3 --action f_bet100 --all-min 80 --limit 25
# 6. Pipe the GTO range into PQL - equity vs random on this flop (PQL needs per-combo rows).
$c1 = spot hu_100bb --line SRP --actor IP --opponent OOP --board Kh7s2c --postflop check --by-combo
pql "select avg(equity(hero)) from game='omahahi', hero=$c1, villain='**', board='Kh7s2c'"
# 7. Same range, hand-type composition by the river.
pql "select histogram(handType(hero, river)) from game='omahahi', hero=$c1, villain='**', board='Kh7s2c'"
# 8. Export for offline analysis.
export $s1 --format csv --filename k72_cbet.csv Limits and reminders
- Results and variables survive a reload. The local scratch session keeps full results and
$variablesin the browser for 7 days, restored for any cell whose input hasn't changed (a solve-data re-pack invalidates them, and a session over 24 MB in total isn't kept). Edited cells show the re-run hint; ▶ Run All recomputes everything live. - Shift shortcuts pause while you type in a cell - Shift+S has to mean a capital S there. The ⌘/Ctrl aliases (⌘S, ⌘↵, ⌘.) still work mid-edit.
- Keep the
$prefix in SQL table names:FROM $s1. Without it, the query looks for a different table and fails. - Bet column keys are tree- and node-specific.
hu_100bband6max_100bb(and the two PLO5 solves, which use the same trees) bet 33% or pot on the flop and raise 66% or pot there, so the flop columns readf_bet33/f_bet100andf_raise66/f_raise100; later streets can differ (the hu_100bb river in the blocker example bets 50% or pot).6max_50bb(and the other 20-200bb PLO solves except 100bb) usesf_bet66on the flop andf_bet100on the turn. Facing-bet decisions addf_raise*/f_call/f_fold. Rundescribe $safter fetching a spot to see its action columns. - Cells are numbered in their current order. Moving a cell changes its number.
- Comment cells render as markdown. If every non-blank line of a cell starts with
#, the cell is prose, not code - and it auto-runs on notebook load. See Markdown Cells. - Position names are solve-specific: HU uses
IP/OOP; 6max usesUTG/HJ/CO/BTN/SB/BB. - Rate limits apply for non-paid accounts - same as the main tool.
The hand filter supports ProPokerTools (PPT) syntax - a compact notation for describing sets of Omaha hands. The same syntax drives the tool's hand filters and the calculators' range inputs (via the PQL engine); the few places the two implementations differ are flagged below.
PLO5. The tool's filter reads all five hole cards. Four-letter patterns then mean "at least": xxyy also matches a 3-flush with a pair of suits, xxxx also matches a 4-flush, and RRON no longer means exactly one pair. For exact five-card suit shapes use the five-letter patterns xxyyz, xxyzw, xxxyz, xxxyy, xxxxy and xxxxx (which match nothing on a four-card solve).
Basic patterns
| Pattern | Meaning |
|---|---|
AK | Hand contains an ace and a king |
AA | Hand contains a pair of aces |
Ah | Hand contains the ace of hearts |
As**Kh | Hand contains ace of spades AND king of hearts |
Operators
| Operator | Meaning |
|---|---|
, | OR - matches either pattern |
: | AND - matches both patterns |
! | NOT - excludes the pattern |
() | Grouping |
Suited patterns
| Pattern | Meaning |
|---|---|
AxKx | Suited ace-king (same suit) |
AxKy | Offsuit ace-king (different suits) |
AxAyxy | Double-suited aces |
AxAyxz | Single-suited aces |
xxyy | Double-suited hand |
xxyz | Single-suited hand |
xxxx | Monotone (all same suit) |
Rank patterns
| Pattern | Meaning |
|---|---|
RR | Any pair |
RROO | Two pair (two different pairs) |
RRON | Exactly one pair |
TT-77 | Pair from tens down to sevens |
Q+ | Queen or higher |
9876- | Rundown starting from 9 |
Modifier tags
| Pattern | Meaning |
|---|---|
$ds | Double-suited (2-2 in PLO4, 2-2-1 in PLO5, 2-2-1-1 in PLO6). How often each pattern is dealt: see the 5-card Omaha suit-pattern table. |
$ss | Single-suited (2-1-1 in PLO4, 2-1-1-1 in PLO5; n/a in PLO6) |
$ts | Triple-suited (2-2-2 - PLO6 only) |
$np | No pair (all distinct ranks) |
$nt | No trips or quads (pairs allowed), in both the tool's filter and the PQL engine |
$op | Exactly one pair |
$tp | Two pair (double paired) |
$0g | 0-gap rundown (consecutive ranks; n-card per game) |
$1g | 1-gap rundown - one skipped rank. The tool's filter treats the number as a total gap budget, so tighter rundowns match too. |
$2g | 2-gap rundown. In the PQL engine, exactly two missing ranks placed anywhere (AKQ9, KQT8 and QJ97 all match); the tool's filter matches a total gap of two or less |
Advanced syntax
| Pattern | Meaning |
|---|---|
[A-J] | Rank range: ace through jack |
[T+] | Ten or higher (tool hand filter only) |
[2s,Jc,T] | Specific card set |
15% | Top 15% of hands by strength (PQL engine and calculators; the tool's hand filter ignores percent terms) |
30%-50% | Percentile band (same caveat) |
>=set, <twopair | Made-hand comparators, postflop hand filter only: at least (or below) that hand group on the current board. The Strength… dropdown writes them for you; >N compares against a raw category id. |
Examples: (AA,KK):$ds - Aces or kings, double-suited. AA:$tp - Aces plus a second pair. KQ!Ks - King-queen without king of spades. RR:$ds - Any pair, double-suited.
Solver ranges (#...)
Drop a precomputed GTO preflop range straight into any range input. Shape: #<format><stack>/<line>/<hero>[/<opener>][/<action>]. PLO4 (Omaha-hi) only.
| Field | Values |
|---|---|
| format + stack | hu (100bb only); 6m = 100bb, or pick a stack: 6m12 6m20 6m30 6m40 6m50 6m100 6m150 6m200 |
| line | rfi, limp, 3b, 4b, 5b, 6b (also vslimp, vslimpraise and vslimp3b to vslimp6b; long forms like 3bet work too). A line holds a raise and the reply to it: 3b is both the 3-bet and the opener's answer to it, which is where the opener's 4-bet lives; 4b is the answer to a 4-bet. |
| hero / opener | HU: ip, oop. 6-max: utg hj co btn sb bb. The fourth field names the opener of the pot, and is only needed when the line alone is ambiguous (never in HU). |
| action (optional) | raise, call, or vpip (raise+call). Default = the line's headline action (the open for rfi, the 3-bet for 3b, and so on). |
Solver ranges are frequency-weighted - a hand that 3-bets 40% of the time enters at weight 0.40, so equities reflect the real mixed strategy. Examples: #6m/rfi/btn - BTN's 6-max open. #6m50/3b/bb/sb - BB's 3-bet vs an SB open, 50bb. #hu/3b/ip - the heads-up opener's 4-bet against a 3-bet. #6m/3b/sb/sb - the SB's 4-bet after the BB 3-bets its open. #6m/rfi/sb/vpip - SB's full open-or-limp range (in 6-max only the SB limps, heads-up only IP). Compose like any range: #6m/rfi/btn:$ds (double-suited opens).
Note: combining a solver range with : (AND) or ! (NOT) treats it as a set - the frequency weights are dropped - while , (OR) keeps and sums them. An @N suffix flattens the solver's per-hand frequencies to one constant weight. To narrow the hands by shape, use :.
A Monker sim is a solved game with a fixed stack, rake and betting menu. Choose the library depth closest to your game, then read the actual action buttons. A pure postflop solve assigns each individual combo one action; an averaged solve can mix that combo between actions. A category bar can look mixed in either case because it combines many hands.
The Omaha library has eleven sims: nine PLO and two PLO5. The NLHE library has nine more. Preflop opens are pot-sized except at 20bb, where they are min-raises. Only SB/BTN can limp in HU, and only SB can limp in 6-max. All 3-bets and later raises are pot-sized.
The four 100bb Omaha solves use flop bets of 33% or pot and raises of 66% or pot. All four have averaged strategies on every street, so individual hands can mix postflop and Practice offers Mix. The 6-max solves cover 50 matchups through four-way. PLO's 6max_100bb uses 5% rake capped at 2bb; rake is not recorded for the other three.
The other seven Omaha solves cover 6-max from 12bb to 200bb, with 5% rake capped at 1bb. Each combo takes one action postflop. At 20-200bb, excluding 100bb, the initial bet is 66% pot on the flop and pot on the turn and river, with pot-only raises.
These solves contain up to 57 positional matchups: 15 heads-up, 20 three-way, 15 four-way, six five-way and one six-way. The 12bb solve has 17 reachable spots, including 11 heads-up. Most use 50% pot; spots involving BB also offer pot.
The Seats picker selects heads-up matchups. Use Game mode or the Solver Notebook for multiway spots.
| Solve | Players | Stack | Rake | Postflop bet tree | Postflop strategy | Spots |
|---|---|---|---|---|---|---|
hu_100bb | 2 (HU) | 100bb | not recorded | flop bet: 33% or pot · raise: 66% or pot | averaged | 1 |
6max_12bb | 6 | 12bb | 5% (1bb cap) | bet: 50% (also pot when BB plays) · raise: pot | pure | 17 |
6max_20bb | 6 | 20bb | 5% (1bb cap) | flop bet 66% · turn/river bet pot · raise pot | pure | 57 |
6max_30bb | 6 | 30bb | 5% (1bb cap) | flop bet 66% · turn/river bet pot · raise pot | pure | 57 |
6max_40bb | 6 | 40bb | 5% (1bb cap) | flop bet 66% · turn/river bet pot · raise pot | pure | 57 |
6max_50bb | 6 | 50bb | 5% (1bb cap) | flop bet 66% · turn/river bet pot · raise pot | pure | 57 |
6max_100bb | 6 | 100bb | 5% (2bb cap) | flop bet: 33% or pot · raise: 66% or pot | averaged | 50 |
6max_150bb | 6 | 150bb | 5% (1bb cap) | flop bet 66% · turn/river bet pot · raise pot | pure | 57 |
6max_200bb | 6 | 200bb | 5% (1bb cap) | flop bet 66% · turn/river bet pot · raise pot | pure | 57 |
plo5_hu_100bb | 2 (HU) | 100bb | not recorded | same tree as hu_100bb | averaged | 1 |
plo5_6max_100bb | 6 | 100bb | not recorded | same tree as 6max_100bb | averaged | 50 |
Order a custom sim
Custom Sims is a separate service for a whole MonkerSolver game with settings you choose. It is useful when the cash library and its custom turn or river tools do not cover your setup. A sim order is paid separately from Core and delivers a downloadable .mkr file. To open that file yourself, you need MonkerSolver.
Choose the sim settings
- Select PLO, PLO5, PLO Hi-Lo or NLHE, 2-10 seats, and a stack from 5-500bb. Enter the rake percentage and cap. When rake is enabled, set No flop, no drop and No rake heads-up to match the game you want.
- Choose the preflop raise menu, then the flop, turn and river bet and raise menus. Separate sizes in and out of position gives each postflop player its own menus. Preflop retains one raise menu.
- Under Tree shape, set the maximum Players to a flop, whether open limps are allowed, and how close a size must be to the remaining stack to be treated as all-in.
- Choose the hand buckets and board textures under Abstraction. Finer settings distinguish more hands or boards and increase the quoted work. Use Ask a question first if you are unsure which setting your study needs.
- Set Averaged streets and EV streets separately. Averaged streets controls where a single hand can mix. EV streets controls where the delivered file includes EV values. Both count from preflop: 1 is preflop only, 2 adds the flop, 3 adds the turn, and 4 includes the river.
- Set I/N under How far to run it. A larger target runs longer. Check the updated quote before booking.
Quote, delivery and cancellation
The quote shows the price and expected ready date before checkout. If it asks you to Calculate price, press that first and wait for it to finish. If the tree is too large to quote, reduce the menus, seats or players to a flop, or use Ask about this one. A ready-date estimate includes the queue shown at the time of quoting.
Press Pay and book it to open checkout and review the final charge. Keep the order page and its reference. Your sims also lists orders on the Sims page and in Account's Subscription tab. Status moves from Waiting on payment to In the queue, Solving now and Delivered. A payment that has just completed can take a moment to appear. If it remains pending, contact the team with the order reference or receipt.
A delivered order provides Download the .mkr. An order still in the queue can be canceled for a full refund to the original card. Once solving starts, that queue-cancellation option is unavailable. Use the order page or Your sims to check the current status before requesting a cancellation.
Optional hosting
Host it on my account adds a separate $299/year subscription. The quote includes the first year, and hosting renews yearly. This is separate from Core. Browser access to an ordered sim is arranged by the team, so use Ask a question first to confirm the setup you need.
Manage hosting from Account's Subscription tab. Canceling renewal keeps it active until the displayed end date. The downloaded .mkr remains yours after hosting ends. Canceling an unstarted sim order also stops its hosting.
Choose NLHE in the left pane's Game row, or open the NLHE solver. It uses the same account and Core subscription as PLO and PLO5.
Nine cash solves cover heads-up at 100bb and 6-max at 20, 30, 40, 50, 70, 100, 150 and 200bb. Every depth covers every strategically distinct flop, with turn and river cards available through the normal runout controls. The selected depth's rake is printed under Stacks. It is 5% capped at 2bb at 20, 30, 50, 100 and 200bb, and at 1.5bb at the other 6-max depths.
Read its actual action buttons when following a hand: a bet menu from an older screenshot or a different depth may differ. Postflop, the 13x13 matrix sits above the hand list with Strategy, Range and EQ views. Click a cell to see its combos. EQ computes equity against the opponent's arriving range when you request it. Preflop Study instead has a Matrix | List toggle. On mobile, Preflop Study puts the matrix in Strategy and the category/list controls in Hands.
The published library shows action frequencies and has preflop EV in the Solver Notebook through preflop-spot --ev. Custom turn and river solves provide their own EVs for the spot you solve.
At the re-solved 6-max depths (20/30/50/100/200bb), individual combos can mix postflop. The other three depths assign one action per combo. A 13x13 matrix cell can still show several actions because it combines different combos. Click the cell to inspect each one. Preflop strategies mix at every depth.
All preflop ranges are free. Postflop access uses the three rotating flops and your daily chosen flop, with the runout allowances described above. Practice shares the daily meter across games. Core opens every flop and runout. A heavy study session can also reach a separate browsing allowance. The limit message gives its reset time; reusing a result already loaded does not spend that allowance again.
Practice and progress. Postflop practice deals spots from solved boards and grades your action against the solver's strategy; the preflop trainer drills ranges by position and depth; Game mode deals whole NLHE hands at 6-max on any depth. Practice accuracy and answer streaks are tracked per game, so your NLHE numbers never blend into your PLO or PLO5 numbers. XP, training days, daily quests, and badges are account-wide.
The library covers cash games. ICM, tournament setups, HUDs and custom preflop or flop solves are unavailable. You can solve custom NLHE/PLO4 turns and rivers and lock decisions within eligible two-player spots, subject to the solve limits. PLO5 on-demand solves are unavailable. To order a whole custom sim, use Custom Sims.
Free references built from these solves: the NLHE stack-depth reference works out opening, 3-betting, and defending frequencies at all eight depths with a CSV download, the NLHE preflop charts render any position, facing line, and depth, heads-up included, on an interactive 13x13 grid, the starting-hand rankings put all 169 hands' equity next to each seat's opening frequencies, and NLHE vs PLO variance measures the swing gap between the two games. The Hand Tracker's decision report sets your cash 6-max NLHE first-in play beside these exact solves.
Five-card PLO has two solves, heads-up and 6-max, both at 100bb. Pick PLO5 in the left pane's Game row, or link to /solver/?game=plo5. It runs on the same screens as PLO, and this section covers what differs. For how the game itself plays differently from four-card PLO, see the PLO5 page.
The solves. plo5_hu_100bb and plo5_6max_100bb use the same betting trees as the 100bb PLO solves - flop bets of 33% or pot, raises of 66% or pot - and store averaged postflop strategies, so hands mix postflop and Postflop Practice offers Mix. Monker Sims has both in its table.
The hands. PLO5 has 134,459 hand classes from 2,598,960 deals. Its preflop categories share PLO's ids and nine groups, with 42 categories to PLO's 40: Five-Card Rundown and Five-Card 1-Gap only exist with five cards, and four rundown labels carry "+ D" for the dangler. Suit shapes are the six five-card patterns - xxyyz (double-suited), xxyzw (single-suited), xxxyz (3-flush), xxxyy (3-flush plus two of a second suit), xxxxy (4-flush) and xxxxx (monotone) - in the suit chips, the tag filters and the PPT filter. Postflop, hands sort into the same 59 categories as PLO.
What works the same. Preflop and Postflop Study, Preflop and Postflop Practice, Spot Rush, Game mode at either table size, Career Analysis (its Game filter has a PLO5 option), the flops explorer and the notebook's agg (56 tables across the two solves), and the rest of the Solver Notebook, through the plo5_ solve ids. The free tier matches PLO and NLHE: the three rotating flops with the same runout ladder, your one daily custom flop with five reusable runout cards shared across all three games, the same practice meter, and everything open on Core.
What differs. Custom turn and river solves are unavailable in PLO5. In Postflop Study the Value lens estimates each category as a whole where PLO works hand by hand, key cards are computed when you ask for them, and the Opponent's Range panel follows single-hand hovers only. The calculators' #... solver ranges are PLO4 only. In Game mode, PLO5 hands leave the solver's range more often than PLO hands do, so more of your postflop decisions show a dashed, uncounted grade.
Compare 2-6 specific hands in NLHE, PLO4, PLO5, PLO6, Short Deck, O8, Big O or Big O6 at Hand Equity. Add a board and dead cards to study a particular spot. Double-board mode supports up to eight hands. No account is required. For range-vs-range calculations, use Range Equity.
Overview
The calculator picks its math automatically based on how many runouts are left:
- Flop, turn, or river: enumerates every remaining runout exactly on a single board. The result is labeled ✓ exact with no margin of error. (A double board multiplies the runouts, so it is exact only when the two boards together leave few enough; see Bomb Pots.)
- Many-way preflop: when the hands between them consume enough of the deck that only a handful of boards remain (for example, 6 hands of PLO6 leave just 4,368 possible boards), the calculator still enumerates exactly. You get ✓ exact preflop too.
- Heads-up / light preflop: falls back to a Monte Carlo simulation - tens of thousands of random runouts per second - and converges on the equity with a confidence interval that shrinks as more runouts accumulate. Stops early, after at least 10,000 runouts, and shows a converged badge once every hand is within ±0.3 pp.
Two variant quirks: standard-deck NLHE preflop uses sampling because there are so many remaining boards. Short Deck has fewer possible boards, so exact preflop calculation is more common. Read the result's exact or sampled label.
Setting up hands
Choose the game above the calculator. Switching between PLO4 and O8, PLO5 and Big O, or PLO6 and Big O6 keeps your cards and changes the scoring. A change in hole-card count, deck or board mode clears the setup. A note below the game controls explains any automatic change.
High-only standard-deck games also offer Single board and Double board; see Bomb pots. Short Deck uses 36 cards, without ranks 2-5, and ranks flushes above full houses.
Card bank - The 52-card grid in the middle. Click a card to place it into the currently selected slot. Cards that are already in play (in any hand, on the board, or marked dead) are grayed out and unclickable.
The highlighted slot receives your next card. After each pick, selection moves to the next empty slot. Press Esc to select the first empty slot on the page.
Click a filled slot to clear it, then choose its replacement from the card bank. Right-click, Del or Backspace also clears a slot. The next pick goes into the selected empty slot.
Arrow-key navigation - Use ← → to move the selected slot left / right within a row, and ↑ ↓ to jump between hands, the board, and the dead-cards tray.
Adding / removing hands - Use the dashed "+ Add hand" row below the last hand to add another (up to 6 on a single board, 8 in double-board mode). Once three or more hands are set up, every hand shows a × button to remove it; the count can't drop below two.
Board & dead cards
Board - Five slots in the right column: flop (grouped in a dashed box), turn, and river. Click a slot to select it, then pick a card from the bank. Partial flops (1 or 2 cards) are invalid - an amber validation banner ("Flop must have exactly 3 cards.") blocks the compute until you finish the flop. Similar banners appear if dead cards exhaust the deck.
Press Add dead cards below the board to enter known folded cards. Those cards are removed from the remaining deck. The tray adds an empty slot as you fill it, and the toggle shows the card count. You can collapse the tray without removing its cards.
Hi-lo games (O8, Big O, Big O6)
The three hi-lo pills score 8-or-better split pots: O8 is 4-card Omaha hi-lo, Big O the 5-card game, Big O6 the 6-card one. Each hand's headline number stays its total pot share, with a scoops X% - quartered Y% sub-line to show both outcomes alongside the total.
A Split breakdown accordion under the results opens the full accounting per hand: Scoop, Wins hi side, Wins lo side, Both sides, Quartered, and Total pot share. Under the equity bar, a low-possibility line reports how often a qualifying low is possible on the remaining runouts and how often a player makes one; on a complete board with fewer than three distinct ranks eight-or-lower, a banner says "No low possible - the whole pot plays for high."
Hi-lo scoring needs a current browser (see browser support), and hi-lo games have no double-board mode and no strength percentile chip.
Bomb pots (double board)
Switch the board-mode pills to Double board and the right column shows two labeled boards, Top board and Bottom board, each with its own flop, turn, and river slots, plus a Deal both flops button (shortcut F) that deals both from one shuffle. Up to 8 hands can sit in a double-board pot.
Each hand's headline is its total pot share across both boards, with a top X% - bottom Y% sub-line. A Per-board breakdown accordion adds Total share / Top board / Bottom board / Both boards / Scoops both columns, and a correlation line reports how often the hand that wins the top board also wins the bottom.
Double board is available for the high-only games on the standard deck (NLHE, PLO4, PLO5, PLO6) - the pill group is hidden for hi-lo and Short Deck - and needs a current browser. Two boards create many more runout combinations, so sampling is common even with both flops entered. Check the exact or sampled label and the confidence interval. Share links work as they do for a single board.
Randomize & locking
Randomize (a button in the controls column; shortcut r) - Replaces every unlocked hand with a fresh set of random cards drawn from the remaining deck. Useful for running a specific hero hand against N random opponents, or for exploring equity intuition quickly. After randomizing, the selection jumps to the first empty board slot so your next click goes to the flop.
Locking a hand - A padlock icon appears in the top-right corner of any hand card once all of its slots are filled. Click it to lock - the icon lights up, and Randomize will skip that hand (and exclude its cards from the draw pool). Click again to unlock.
Auto-unlock - Removing any card from a locked hand makes it incomplete, which automatically unlocks it (the padlock icon disappears). Re-fill the hand and you can lock it again.
Clear all (the Clear button next to Randomize; shortcut c) - Wipes all hands, the board, and dead cards, and unlocks everything. No confirmation prompt, but the change is undoable - press ⌘ Z / Ctrl+Z to restore the previous state.
Undo - Clear, Randomize, game or board-mode changes, and Deal both flops can each be undone once. ⌘ Z / Ctrl+Z restores it once; there's no redo and no deeper history. Touch devices skip the toast notifications since there's no keyboard to undo with.
Reading results
Per-hand readout - Each hand card shows:
- Equity % - The headline number: this hand's total share of the pot (outright wins plus its share of chops).
- Win / Tie split - Shown when chops are possible. Win is the probability of winning outright; Tie is the expected share of pot from chops (fractional wins when multiple hands tie).
- ±margin (Monte Carlo only) - The 95% confidence-interval half-width in percentage points, shown on hover over the equity number. Shrinks as more runouts accumulate.
- ✓ exact (flop/turn/river) - Replaces the margin once the result is from exact enumeration.
- P chip - Each complete hand shows its starting-hand strength percentile (lower is stronger), from the same tables as Starting Hands. NLHE and the PLO high games only - Short Deck and the hi-lo games have no percentile tables.
The equity bar shows each hand's outright-win share in its color. Striped sections show ties, using the tied hands' colors. Read the hand cards for exact percentages. The bar clears while a new calculation runs.
Status strip - Below the bar. Idle: "Pick cards to see live equity". Exact: "✓ Computed exactly from N runouts · X.XXs". Monte Carlo running: a progress bar plus iteration counts plus current margin. Monte Carlo done: green check, total simulations, a converged badge if it stopped early (all hands inside ±0.3 pp), the final margin, and the elapsed time. Errors render in red.
Settings (gear)
The ⚙ gear button in the right-hand controls column opens a slide-in settings sheet. It contains two actions:
- Copy share link - see Share & PNG Export below.
- Save PNG - see Share & PNG Export below. Disabled until at least two hands have computed equity.
Press Esc or click the backdrop to close the sheet, which slides in from the right at every screen size.
Share & PNG export
Use Copy share link in Settings to share the game, hands, board, dead cards and hand locks. Opening the link restores that setup.
- The usual link is
solvepoker.app/odds/<8 chars>. It opens at Hand Equity with the chosen game and board mode, even when copied from a dedicated calculator page. Older?u=links still work. - If a short link cannot be created, the calculator copies a longer link with the setup after
#. It restores the same cards and settings.
Copy the link with the share button. The address bar returns to /odds after opening a shared setup and does not track later edits.
Save PNG exports the hands, board, equity bar and any dead cards in your current theme. Hi-lo results include scoop and quartering rates. Double-board results include both boards and each hand's share on each one. The image also records whether the calculation was exact or sampled, with the runout or trial count and any sampling margin.
Keyboard shortcuts
Press ? at any time inside the calculator to pop up the full cheat sheet. The floating ? button in the bottom-right does the same thing for mouse users.
| Key | Action |
|---|---|
? | Toggle the keyboard-shortcut overlay |
Esc | Re-select the first empty slot (or close the help overlay / settings sheet) |
← → ↑ ↓ | Move the selected slot across hands / board / dead cards |
Del / Backspace | Clear the currently selected slot |
r | Randomize unlocked hands |
c | Clear everything |
[ / ] | Cycle games within the active scoring family (high-only or hi-lo) |
2 / 4 / 5 / 6 / s | Jump to the game with that hole-card count in the active family (2 is always NLHE); s = Short Deck from any mode, dropping to a single board |
L | Toggle high-only ↔ hi-lo scoring |
B | Toggle single ↔ double board (bomb pot) |
F | Deal both flops from one shuffle (double board only) |
⌘ Z / Ctrl+Z | Undo the last destructive action (one-deep) |
Press Tab to enter or leave the card bank. Within it, use the arrow keys to move between cards and Home/End to jump to either end of a suit row.
Study examples
- Lock your PLO5 hand and randomize three opponents. Repeat with R to compare its equity against different holdings.
- Enter two hands and a flop, then add turn and river cards to see how their equities change.
- Add a known folded king to dead cards and check how removing it changes the result.
- Enter six PLO6 hands preflop for an exact comparison. With 36 hole cards known, only 4,368 boards remain.
- Compare an A2xx hand against two calling hands in O8 and read Quartered in the split breakdown.
- Choose Double board, deal both flops and compare up to eight hands. The correlation line shows how often one hand wins both boards.
- Use Save PNG to include the spot and its results in a coaching note or study discussion.
Exact results, sampling and browser support
The result says exact when the calculator checks every remaining runout. Otherwise it samples boards and shows a confidence interval. More trials narrow that interval. A converged badge means the run stopped early because the estimates were already within its accuracy threshold.
Heads-up preflop often needs sampling because so many boards remain. Adding board or dead cards can make exact calculation practical. Hi-lo, Short Deck and double-board modes require a current browser. If a mode is disabled, read its note and try the dedicated Hand Equity, Hi-Lo or Bomb Pot page.
No account is needed to calculate. Computation runs on your device. Usage records include the hands and board you entered. Copy share link separately stores the shared setup.
A free, browser-based range-vs-range equity tool for seven variants: NLHE, PLO4, PLO5, PLO6, the hi-lo games O8 and Big O, and Short Deck. Type a range per player using PPT range syntax, optionally fix a board, and run the simulation. Up to six players, full PPT macros and percentile selectors, no account required. Open it at solvepoker.app/range-calc. For specific hands (not ranges), see Hand Equity.
Overview
Enter a range for each player, add a board if needed, then press Run or Cmd/Ctrl+Enter. Each result shows all-in equity through the river, a 95% confidence interval and the trial count.
Calculations run on your device. Usage records include your ranges and board, and are tied to your account when signed in. Copy share link separately saves the setup so someone else can open it.
Game variants
The variant pills (top right) switch between seven games:
| Variant | Hole cards | Split | Engine |
|---|---|---|---|
| NLHE | 2 | Hi | game='holdem' |
| PLO4 | 4 | Hi | game='omahahi' |
| PLO5 | 5 | Hi | game='omahahi5' |
| PLO6 | 6 | Hi | game='omahahi6' |
| O8 | 4 | Hi/Lo | game='omaha8' |
| Big O | 5 | Hi/Lo | game='omaha85' |
| Short Deck | 2 | Hi | game='shortdeck' |
Switching variants swaps the per-variant default ranges if you haven't
edited them. The placeholder also updates: ** for NLHE and
Short Deck, **** / ***** / ****** for
PLO4/5/6. The board input format doesn't change with variant.
Players
Minimum 2, maximum 6. + Add player appears below the
last row when fewer than six are filled; click to add one with a
variant-appropriate default range. Each row past the first has a × remove button on the right.
Per-variant default ranges (used as the starting point on first load):
| Variant | Player 1 default | Player 2 default |
|---|---|---|
| NLHE | JJ+,AKs,AKo | AA |
| Short Deck | AKs,KQs,QJs | QQ+ |
| PLO4 | 4x5x6y7y,6789,RR$B$B | AA** |
| PLO5 | 4x5x6y7y8z,6789T,RR$B$B$B | AA*** |
| PLO6 | 4x5x6y7y8z9w,6789TJ,RR$B$B$B$B | AA**** |
| O8 | A2$B$B | 25% |
| Big O | A23$B$B | AA*** |
Range input
Each player input accepts the full PPT Generic range syntax -
pairs (AA), suited shapes (AKs in classic, or AK:$s in generic), rank/suit variables
(RROO, AxKx), spans (TT-77),
percentile selectors (15%, 15%-30%),
modifier macros ($ds, $ss, $ts, $np, $op, $tp, $0g, $1g, $2g, $B, $M, $Z, $L, $N, $F, $R, $W), bracket sets
([A-J], [2s,Jc]), and the operators , (or), : (and), ! (not), (...) grouping. See the PPT Filter Syntax section for the full
reference.
Validation runs at Run time - if a range fails to parse, an
error banner at the top of the pane shows the message and (when known)
the column position. Empty ranges are
invalid: every player slot needs at least something, even if it's just ****.
Optional board
The collapsible Add board (optional) details element
takes a board as concatenated card codes - e.g. 9s5s2c (flop), AsKhQh2c (turn), or AsKhQh2c5d (river). 3, 4, or 5 cards. Whitespace is
stripped; duplicates are rejected; invalid tokens are flagged.
Comma-separate several boards (9s5s2c,Ks7d2h) and the run
averages over the set - each segment must be a valid 3-5 card board on
its own. Handy for "this range across three flop textures" questions.
When the board input has a parse error the box turns red and the hint text below it explains what went wrong. Leave the field empty to compute preflop equity.
No dead-card support here. If you need to remove specific known-folded cards from the deck, use Hand Equity instead.
Running a query
Run (the primary button, lower right) starts the
simulation. Keyboard shortcut: ⌘ Enter / Ctrl+Enter. While running, the button switches to Cancel (red) and the status badge in the players
header shows "Running… Nms" - click to stop the
in-flight run.
When done, the badge turns green and shows total elapsed time. Trial count and filter count appear below the run row: "50,000 trials in 234ms".
PLO5, PLO6 and Big O queries can take about 5-60 seconds. The first percentile query for a game is usually slower while its hand rankings are prepared. Later queries reuse them. A yellow hint appears after five seconds without progress.
Reading results
Each player card shows two pieces of information:
- Equity - The big number, in that player's own series color (e.g. 42.31%). For Monte Carlo runs this is the trial average; for tractable enumerations it can be the exact value.
- Confidence & sample - The muted line below: "±0.25% · n=50,000". The first number is the 95% confidence half-width; the second is how many trials contributed.
On the hi-lo variants (O8, Big O) each card adds three chips - hi X% · lo Y% · scoops Z% - with an explainer under the results: hi and lo include ties, so the columns overlap and one player's hi plus lo can pass 100%.
The bar below the player cards compares their equities. A board preview shows the cards entered.
While running, the equity cell shows ...;
idle slots show -.
Settings (gear)
The ⚙ gear button opens a slide-in sheet with three Run params and three Actions:
- Trials - Default 50,000; the input offers 1,000 to 5,000,000. More trials = tighter CI at the cost of compute time.
- Max seconds - 1 to 600. Default 60. The engine stops at this wall-clock budget if it hasn't already converged.
- Seed - Default 42. Same query + trials + seed = identical results.
Settings also contains Copy share link, Copy results and Save PNG. Copy results becomes available during a run. Save PNG becomes available when it finishes.
Share & PNG export
Copy share link preserves your ranges and calculation settings:
- Short URL -
solvepoker.app/range-calc/<8 chars>. Keeps the ranges and calculation settings for whoever opens it. The older?u=<8 chars>form still resolves. - Hash fallback -
#v=<game>&p1=...&p2=...&b=...if the API is unavailable.
Copy results - Plain-text dump suitable for pasting into chat:
Player 1 = 42.31% (95% CI ±0.25%, n=50000)
Player 2 = 57.69% (95% CI ±0.25%, n=50000)
50000 trials in 234ms On the hi-lo variants the dump adds the hi / lo / scoop lines per player.
Save PNG exports the ranges, equities, confidence intervals, board and equity bar in your current theme. The image includes trial count, elapsed time and a non-default seed. It downloads as range-calc.png.
Keyboard shortcuts
| Key | Action |
|---|---|
⌘ Enter / Ctrl+Enter | Run the query |
Esc | Close the settings sheet |
Study examples
- Choose PLO5 and run the default range
4x5x6y7y8z,6789T,RR$B$B$BagainstAA***to compare their preflop equities. - Double-suited rundown vs aces on the flop - Player 1
4x5x6y7y, Player 2AA**, board9s5s2c, run. - Compare a tight PLO opener,
$B$B$B$B$ds, against10%and****. Widen the opener and run again. - Compare two opening ranges - Run with range A, copy results, swap range A for range B, run again, paste both into a doc/Slack.
Limits & tips
- Up to six players per calculation.
- No dead cards - Use Hand Equity if you need to remove known-folded cards.
- Each run uses the ranges currently entered. Changing a range changes the next calculation.
- Full PLO6 wildcard ranges such as
******are supported. Some compound expressions are too large to calculate and return "too large to materialize". Simplify or narrow the expression if this occurs. - Determinism - Same ranges + board + trials + seed = identical numbers on the same device and browser, unless the run stops early. Useful for sharing exact results.
Use Hand Distribution to compare how often ranges make each hand category. It supports 1-6 ranges in NLHE, Short Deck, PLO4, PLO5 and PLO6. Choose a street and compare the chart with the random-hand baseline. No account is required.
Overview
Choose the result you want:
- Hand Category shows how often each range makes each hand type on the selected street.
- Winning Hand shows which hand types win at showdown across two or more ranges.
Calculations run on your device. Usage records include the ranges and board entered.
Game variants
Choose NLHE, PLO4, PLO5, PLO6 or 6+ (Short Deck). Unedited default ranges update when you change games, and wildcard ranges adjust to the hole-card count. Short Deck ranks flushes above full houses.
Player ranges
Enter up to six ranges. Player 1 starts with a game-specific example. For a comparison, enter Player 2's range or press + Add Player 2 to load a preset. Additional players start with a random range such as **** in PLO4.
Each row has a colored label and a monospace text input that accepts PPT range syntax. Player 2's × clears its row, rows from Player 3 on have a × that
removes them, and Player 1 has none. Up to six ranges total; rows are
colored to match the chart series colors.
Optional board
The Add board (optional, hides the random-hand baseline) collapsible accepts the same concatenated card-code format as Range
Equity (9s5s2c, AsKhQh2c, AsKhQh2c5d), including comma-separated multi-boards
(9s5s2c,Ks7d2h) to average over several textures. When a
board is set, the dashed random-hand baseline lines disappear from the
chart - the runout is no longer random, so the baseline doesn't
apply.
Street & hand type
Two pill rows under the ranges:
- Street - Choose Flop, Turn or River for Hand Category.
- Hand: Hand Category or Winning Hand.
- Hand Category - A separate series for each range's hand types on the selected street.
- Winning Hand - One distribution of winning hand types at river showdown. It requires at least two ranges and fills an empty Player 2 when selected. Other streets are disabled.
Running a query
Press Run or Cmd/Ctrl+Enter. Press Cancel to stop. Changing an input also stops the run and clears old results. The badge above the chart shows the status and elapsed time. First PLO5/PLO6 runs can take longer; a yellow hint appears after five seconds.
Reading the chart
The chart is a horizontal bar histogram - one row per hand category, up to six colored series stacked within each row. A legend above the chart maps each color to its player and labels the dashed baseline tick. Default order is best hand at top (straight flush → quads → full house → flush → straight → trips → two pair → pair → high card; in 6+ mode flush sorts above full house). The sort toggle above the chart flips between ↑ best hand top and ↓ worst hand top.
When no board is fixed, dashed vertical lines mark the random-hand baseline probability for each bucket
(in Winning Hand mode the baseline assumes a heads-up pot, so it
hides for 3+ players). Hover or tap any row for a tooltip showing
per-series percentages with their ± Monte Carlo sampling
error and a cumulative that hand or better column; with
exactly two series the tooltip adds the delta in
percentage points. Click or tap to pin the tooltip
(accent border); click again or press Esc to unpin.
Mobile screens (≤768 px) shorten labels for legibility - "straightflush" → "st flush", "twopair" → "2pair", etc.
Trial count and elapsed time appear below the chart: "50,000 trials in 234ms". A note also appears when the baseline is hidden (because a board is set).
Settings (gear)
Same as Range Equity: Trials (1k-5M, default 50k), Max seconds (1-600, default 60), Seed (default 42). Actions: Copy share link, Copy results, Save PNG (the latter two disabled until you have results).
Share & PNG export
Copy share link keeps the game, ranges, board, result mode, street and sort order. It usually copies a short solvepoker.app/hand-dist/<8 chars> link. If that cannot be created, it copies a longer link with the setup after #.
Copy results - Plain-text dump:
# handType / river
Player 1:
straightflush 0.10% (50)
quads 0.05% (25)
fullhouse 2.10% (1050)
...
Player 2:
... Save PNG exports the inputs beside the chart in your current theme. It includes the game, ranges, board, mode, street and trial count, and downloads as hand-dist.png.
Mobile layout
On mobile, switch between Inputs and Results above the calculator. A pulsing dot on Results indicates a running calculation. Settings opens from the bottom of the screen.
Study examples
- Compare your PLO6 range with a wider opener on the river. In Hand Category, read the flush bar for each range.
- Enter only
****in PLO4, leave the board empty and select Turn. The result estimates the random-hand baseline shown by the dashed lines. - Compare
AAKK$dswith a double-suited broadway range onAsKhQh. Select Flop and inspect the set, two-pair and trips bars. - Enter two ranges and choose Winning Hand to compare how often flushes, trips and other hand types win at showdown.
Limits & tips
- Max 6 ranges; min 1 (single-range mode just plots the one distribution).
- Winning Hand mode needs at least 2 ranges and is river-only (other streets are disabled).
- No dead cards.
- First PLO5/PLO6 percentile query can take 30-60 seconds to prepare hand rankings. Later queries for that game reuse them.
- Determinism - Same ranges + board + trials + seed = identical histogram on the same device and browser.
The Poker Variance Calculator simulates cash-game and tournament results under assumptions you can change. It runs locally in your browser and needs no account. Its outputs describe the selected model; they do not establish your real winrate or calibrate a game from its name alone.
Overview
The main chart shows expected cumulative profit, estimated outcome bands, sample paths, and the runs with the highest and lowest final profits. Analysis cards cover bankroll, drawdowns, percentiles, observed results, a random year, backing, and an independently configured stake-progression example; tournament mode keeps four of them (outcome distribution, bankroll and risk of ruin, downswings in dollars, and Am I a Winner?), since the year, backing and stake-progression cards model cash. The chevron on each card hides its contents without resetting its controls.
When to use it
- Compare plausible outcomes at different winrates, volatility levels, and volumes.
- Estimate funding requirements over a specified sample and test lower-winrate scenarios.
- Explore a backing agreement or one career with explicit stake-change rules.
- Estimate uncertainty in an observed rate, conditional on the stated statistical assumptions.
Cash vs tournament
Cash uses independent 100-hand profit blocks drawn from a Student-t distribution, scaled to the entered mean and standard deviation. Tournament uses independent discrete payouts less the entry cost. Entry cost is prize-pool contribution plus fee, and ROI is profit divided by that full cost. Payout structures are synthetic examples, not a room's official tables.
The main model holds skill, stakes and volatility constant, with no withdrawals, reloads, changing opponents or session dependence. Real results can differ in either direction. Block observations can miss cash-game bankroll crossings within 100 hands.
Inputs & presets
Click an underlined number to edit it. Cash volume accepts shorthand such as 100k and 2M, and is normalized to the nearest 100 hands.
The displayed accepted count is the count simulated. Tournament volume is an integer.
The main calculator supports up to 10 million hands or 100,000 tournaments and
5,000 simulation trials.
Cash presets set both SD and tail shape (df); these are illustrative assumptions, not fitted population estimates. The default PLO 6-max scenario uses 3 bb/100, SD 140 and df 5 over 100,000 hands. Use measured actual-result volatility for bankroll questions; all-in-adjusted results describe a different outcome variable. For mixed games or Short Deck, check the blind/ante and tracker-unit conventions.
Tournament presets set contribution, fee, field, payout structure and target ROI. Settings allow custom values. Payout-weighted finishes are an alternative model assumption. If the chosen model cannot attain the requested ROI, a notice gives the actual modeled ROI; all calculated results use that achievable distribution.
Reading the chart
- EV line: exact expected profit under the model, independent of the random seed.
- 70% and 95% outcome bands: estimated cross-sectional quantiles at checkpoints, interpolated between checkpoints. They are not confidence intervals on skill or corridors containing that fraction of entire paths.
- Sample runs: illustrative simulated paths. The highlighted highest/lowest ending runs are selected by final profit; another run can be higher or lower earlier.
- Zero line: cumulative breakeven. Hover or tap to inspect the selected position.
After changing an input, wait for the updated chart. More hands increase the spread of total profit roughly with the square root of volume, while narrowing uncertainty in the average winrate.
Headline stats
Expected profit is model mean times volume, not a fluctuating average of the sampled runs. Probability of profit is the observed fraction ending strictly above zero. The 95% outcome range, labeled 95% of runs land between, uses the sampled 2.5th and 97.5th percentiles. In dollar mode, cash hourly EV uses the assumed hands per hour and dollars per big blind.
Downswings
Depth is the largest loss from a previous peak. Duration runs from a peak to recovery, or to the simulation end if still underwater. Returning exactly to the peak ends a slump; a flat path is not itself a slump. Unfinished slumps are cut off at the selected horizon. Cash observations are spaced 100 hands apart.
The window figures ask whether a qualifying peak-to-trough loss occurred at least once anywhere in the full sample, with peak and trough no more than the stated number of hands apart. They do not describe the risk in a single randomly chosen month.
Monte Carlo percentages are estimates. Zero observed events are shown as 0 / N, and unanimous events as N / N. Neither proves impossibility or certainty. With zero events in 1,000 independent trials, the one-sided 95% binomial upper bound is about 0.30%, not 0.1%.
Bankroll & risk of ruin
Cash risk counts paths whose starting bankroll plus cumulative profit reaches zero at a simulated checkpoint. Tournament funding risk counts paths unable to pay a scheduled entry before playing it. Exactly one entry cost can fund one tournament; a smaller balance cannot. No extra entry is required after the last scheduled tournament.
Required bankroll tables invert these same observed path events, accounting for ties and rounding funding amounts upward. They cover the specified horizon, not a career, and meeting an empirical target is not a guarantee of the true risk. Changing your bankroll reuses the sampled paths without rerunning them.
The cash sensitivity table recomputes path minima at alternative winrates, using the same random shocks. Halving winrate does not generally double a finite-horizon requirement. Breakeven and losing players can have finite funding requirements over a finite horizon. The exponential infinite-horizon Brownian ruination formula is a different approximation, not an exact result for these blocks.
Outcome distribution
The seven rows show the 99th, 95th, 75th, 50th, 25th, 5th and 1st percentiles of final profit. The median describes a middle outcome, not necessarily the mean. Profit color follows the amount's sign; even a low percentile can be profitable.
Am I a winner?
Enter actual observed results separately from a projected scenario. These cards use a Normal likelihood approximation with assumed known SD and a Gaussian prior: mean zero and SD 10 bb/100 for cash, or SD 30 ROI percentage points for tournaments. The tournament SD comes from the modeled payout distribution's exact moments.
Credible intervals and the probability of positive skill are conditional on those assumptions. The approximation can be poor for small samples, heavy tails or strongly skewed tournament returns. The Normal ROI approximation also extends below the physical −100% limit. Zero observations return the prior, not evidence of skill. No fixed hand count makes a prior or model universally reliable.
The precision planner estimates the total observations needed for a data-only interval of the chosen half-width, using the assumed SD. It is not an additional-hands count or a guarantee that you will establish a positive rate.
Backing deal
The backer carries losses as makeup. At the chosen session cadence, positive profit after makeup clears is split, and one final settlement is attempted at the horizon. A shortened final session prevents extra simulated hands. Funding breaches and deepest makeup are checked every block, not just at session ends.
Player and backer EV are simulation averages; their sum equals the generated profit. Average ending makeup is conditional on ending in makeup; average worst makeup includes every trial. Deal outcomes continue through the full horizon even when a funding breach is recorded, so those runs would require extra funding. Settlement timing changes the split of outcomes; player EV is not generally a fixed fraction of solo EV.
Your year, month by month
The period picker interprets the main hands input as monthly volume (12 times that amount per year) or yearly volume (blocks distributed across 12 months). Month totals sum to the displayed annual volume; very short years can include months with no play.
Green means profit above zero; red means loss below zero; zero is neutral. Intensity increases with magnitude on a symmetric scale. The separate z-score measures luck relative to expected profit in monthly SD units. A profitable month can be below expectation while remaining green. Roll year draws another illustration; one year is not a statistical estimate of the range of possible years.
Stake progression
This separately configured career has its own starting stake, bankroll, volume, winrate and deterioration assumptions. Moving up requires the threshold in next-stake buy-ins; moving down uses current-stake buy-ins. The move-down threshold must be below the move-up threshold.
The preview shows each stake's assumed rate. The career stops at bankroll exhaustion; it cannot borrow or recover after bankruptcy. Its plot includes the actual endpoint and stake transitions, and the time breakdown counts only hands played. This is one sampled career, not a probability forecast or a claim that higher stakes follow a measured volatility curve.
Advanced options
Settings contains the main scenario's SD, tail shape, trials (1,000 by default), display units, optional projected multi-tabling penalty, hourly volume and seed (12345 by default), or tournament contribution, fee, field, structure, finish model and starting capital. Student-t df must exceed 2 for finite variance; the UI supports 3 through 30. Presets are editable assumptions. A multi-tabling penalty is optional, not a universal law.
Share & save
Copy main simulation link preserves the main inputs, seed, bankroll and expanded-card state using a short link or a self-contained hash fallback. It does not save independently edited career, backing, calendar or observed-result controls. The legacy calculator path preserves old hash links.
Save image exports a completed chart with its matching scenario, axes and legend. The career card has a separate image export. Pending results cannot be exported with newer scenario labels.
Units: bb, BI, $
bb means big blinds, not fixed-limit big bets. Cash 1 BI = 100 bb. Dollar display multiplies by dollars per big blind. Tournament BI means the full contribution-plus-fee entry cost instead. All winrates and SD inputs must use the same underlying unit.
Reusing and sharing a scenario
Wait for the updated chart before reading or exporting it after an input change. Results belong to the inputs that produced them. Use the displayed outcome bands and probabilities across many runs rather than treating one simulated path as a forecast.
Simulation runs on your device. Usage records include the mode, volume and trial count. Your winrate, standard deviation and bankroll stay on your device unless you copy a short share link, which stores the main scenario so another person can open it.
Use PQL (Poker Query Language) to calculate equity, draws, hand distributions and conditional results for a poker spot. Enter a query or load an example, then run it in your browser. No account is required.
Query basics
PQL is a SQL-like query language for poker. You describe a spot (game, players, ranges, optional board and dead cards), then select any combination of aggregators over trial-level expressions. The engine either enumerates every possible runout exactly (when the state space is small) or runs a seeded Monte Carlo simulation, reporting the answer with a confidence interval.
Example: "how often does AA win against a random hand?" becomes select avg(riverEquity(hero)) from game='holdem', hero='AA', villain='**' which returns ~85.2%. The same shape works for 10 games and
all four of PPT's Classic range syntaxes alongside the modern
Generic syntax.
Quickstart
- Open solvepoker.app/pql.
- Pick an example from the ≡ Examples drawer (the editor opens on the 3-way AA vs KK vs AKs comparison).
- Press
⌘ Enter/Ctrl+Enterto run. - Open Settings to change trials, seed or maximum run time. More trials give a narrower sampling interval and take longer. A fixed seed lets you repeat the sample.
Examples set their own trial counts: about 25,000 for heavier games such as PLO6 and 50,000 for faster ones. Change these in Settings when you need a larger sample. The default time limit is 60 seconds. Repeat a query with the same trials and seed on the same device and browser.
Games supported
| Game key | Meaning | Hole cards | Split |
|---|---|---|---|
holdem | Texas Hold'em | 2 | Hi |
omahahi | Pot-Limit Omaha | 4 | Hi |
omaha8 | Omaha Hi/Lo 8-or-better | 4 | Hi/Lo |
omahahi5 | 5-card Omaha (PLO5) | 5 | Hi |
omaha85 | 5-card Omaha Hi/Lo (Big O) | 5 | Hi/Lo |
omahahi6 | 6-card Omaha (PLO6) | 6 | Hi |
shortdeck | Triton-rule 6+ Hold'em (36-card deck, no 2-5). Aliases: 6plus, 6+, sd, short-deck. Generic parser by default (syntax='classic' routes through the Hold'em dialect); flushes beat full houses in the evaluator. | 2 | Hi |
studhi | 7-card Stud | 7 private | Hi |
stud8 | 7-card Stud Hi/Lo | 7 private | Hi/Lo |
razz | Razz (A-5 lowball) | 7 private | Lo only |
Query structure
Every PQL query is a SQL-like statement with three clauses:
select <aggregator>(<expr>) [as <alias>], ...
from game='<game>', <player1>='<range>', <player2>='<range>', ...
[where <boolean_expr>] Keywords are case-insensitive. String literals use single quotes;
doubled '' is an escape. Multiple queries in one input
are separated by ;. Line comments start with --; block comments /* … */.
The FROM clause takes game= (required), board= and dead= (optional, both accept
range-DSL strings), syntax= ('generic' default
or 'classic' for legacy dialects), macros= (your own range macros, e.g. macros='$tops = AA-JJ'), plus
any number of player-name assignments. Player names are free identifiers
(hero, villain, p1, v2, …)
- they become the first-argument value for per-player
functions like riverEquity(hero).
Aggregators
| Aggregator | Input | Output |
|---|---|---|
avg(expr) | numeric (equity, rating) | arithmetic mean |
count(expr) | boolean | fraction true + raw count |
histogram(expr) | enum, number, category | frequency table, sorted by poker rank when known |
min(expr) | numeric | smallest value seen |
max(expr) | numeric | largest value seen |
A query can have any number of aggregators, comma-separated, each
with an optional AS alias. Results appear as separate
cards. Same-shape histograms (e.g. histogram(handType(p1, river)) and histogram(handType(p2, river))) are merged into a single
multi-column table sorted by poker strength so you can compare ranges
side by side.
Built-in functions
The Function reference drawer lists all 88 callable names, including 11 aliases. Player arguments are unquoted names such as hero. Street arguments are preflop, flop, turn or river, or third through seventh in stud games.
Equity / pot share:
| Function | Description |
|---|---|
riverEquity(p) | All-in equity after full runout (0-1) |
equity(p) | Alias for riverEquity |
HvHequity(p, street) | Hand-vs-hand equity on the given street |
HvRequity(p, street) | Hand-vs-range equity on the given street |
minEquity(p, street) | Minimum equity over all remaining-card completions |
minHvREquity(p, street, threshold) | True if HvR equity exceeds threshold |
fractionalRiverEquity(p) | Equity as an exact rational fraction |
bestHiRating(p?, street?) | Best achievable hi rating; 0/1-arg = max across players, 2-arg = best for player |
bestLoRating(p?, street?) | Best achievable lo rating (split-pot games) |
Wins / ties / scoops:
| Function | Description |
|---|---|
wins(p) | True if p wins the whole pot outright |
winsHi(p) | True if p wins/shares the hi pot |
winsLo(p) | True if p wins/shares the lo pot |
tiesHi(p) | True if p chops the hi pot (>= 2 ties) |
tiesLo(p) | True if p chops the lo pot |
scoops(p) | True if p wins BOTH halves outright |
Hand types and categories:
| Function | Description |
|---|---|
handType(p, street) | Coarse category (pair, twopair, flush, …) |
minHandType(p, street, t) | True if p has at least hand type t |
exactHandType(p, street, t) | True if p has exactly hand type t |
winningHandType() | Hand type that won the pot |
flopHandCategory(p) / turnHandCategory(p) / riverHandCategory(p) | PPT category (toppair, overpair, set, …) at street |
min{Flop,Turn,River}HandCategory(p, c) | At-least check on category |
exact{Flop,Turn,River}HandCategory(p, c) | Exact check on category |
hiRating(p) / loRating(p) | Opaque hi/lo strength (higher hi / lower lo = better) |
minHiRating([street]) | Lowest hi rating across all players at the street |
Hand value predicates and draws:
| Function | Description |
|---|---|
nutHi(p) | True if p has the nuts on the river |
nutHiForHandType(p, t) | True if p has the nuts of a specific hand type |
nutHiOuts(p, street) | Outs to nut hi on the next street |
outsToHandType(p, street, t) | Cards that upgrade p's hand to type t or better |
fourFlush(p, street) / threeFlush(p, street) | True if p has a 4-flush / 3-flush at street |
hasFlushDraw(p, street) / hasStraightDraw(p, street) | True if a flush/straight draw exists |
hasGutshot(p, street) / hasOpenEnder(p, street) | True if a gutshot or OESD exists |
pocketPair(p) / overpair(p) | True if p has a pocket pair / overpair to the board |
hasTopBoardRank(p) / hasSecondBoardRank(p) | True if p's hole shares the highest / second-highest board rank |
Lo predicates (Omaha-8, Stud-8, Razz):
| Function | Description |
|---|---|
madeLo(p) | True if p has a qualifying low |
nutLo(p, street) | True if p has the nut low |
hasLo(p) | True if a qualifying low exists in p's holding (split-pot games) |
nutLoOuts(p, street) | Outs to the nut lo on the next street |
Board texture:
| Function | Description |
|---|---|
pairedBoard(street) | True if any rank appears twice on the board |
rainbowBoard(street) / twotoneBoard(street) / monotoneBoard(street) | No two board cards share a suit (so never true on a river) / 2-suit / 1-suit board predicates |
flushingBoard(street) | True if any suit has 3+ on the board |
straightBoard(street) | True if a 5-card straight exists on the board |
boardsuitcount(street) | Distinct suits on the board at street |
boardLoCardCount() | Count of low cards (A-8) on the river board |
boardHasOneDistinctLoCard() / boardHasTwoDistinctLoCards() | True if board has exactly 1 / 2 distinct low ranks |
boardAllowsMadeLo() | True if the board allows a made low |
handBoardIntersections(p, street) | Count of hole cards whose rank is on the board (AA on an ace-high board counts 2) |
Range / pattern matching:
| Function | Description |
|---|---|
inRange(p, 'range-string') | True if p's actual hand is inside the given range |
boardInRange('range-string') | True if the current board matches the pattern (constant-time matcher, not enumeration) |
handsHaving(fn, args…) | Inner-function enumeration; counts hands that satisfy the inner predicate |
Rank introspection:
| Function | Description |
|---|---|
maxRank([street]) / minRank([street]) | Highest / lowest rank on the board |
nthRank(n[, street]) | n-th highest distinct rank on the board |
rankCount([street]) | Number of distinct ranks on the board |
handRanks(p) / boardRanks() | The ranks in the hole / on the board, as a 13-bit mask |
intersectingHandRanks(p) / nonintersectingHandRanks(p) | Hole ranks shared with / disjoint from the board, as a mask |
duplicatedBoardRanks() / duplicatedHandRanks(p) | Paired ranks on the board / in the hole, as a mask |
turnCard() / riverCard() | Specific street card (flop games) |
upCard(p, n) | n-th up-card for player p (stud games, 1-indexed) |
Plus the SQL building blocks: AND, OR, NOT, comparison = <> != < <= > >=,
arithmetic + - * /, IN (…), CASE WHEN … THEN … ELSE … END (both
searched and simple forms).
Range syntax (generic)
Every quoted range string uses the Generic DSL by default. This is the same syntax as the PPT Filter Syntax used elsewhere in the tool - see that section for a detailed reference. Key points:
- Ranks:
A K Q J T 9 8 7 6 5 4 3 2. - Literal suits:
s h d c. - Suit variables:
w x y z(same var → same suit; different var → different suit). - Rank variables: any other letter (conventionally
R,O,N). - Wildcard rank:
*; the whole wordrandomis an alias for the full universe. - Operators:
,(OR),:(AND),!(NOT),()grouping. Precedence:!>:>,. - Spans:
AA-TT,KK+,AA-,[A-Q]. Ascending spans normalize (22-AA≡AA-22). - Percent:
15%(top 15%),15%-30%,15%6h(6-handed ordering). - Shape macros:
$ssuited,$ooffsuit,$dsdouble-suited,$sssingle-suited,$tstriple-suited (PLO6),$npno pair,$opexactly one pair,$tptwo pairs (4+ hole cards only),$ntno trips (the complement of trips - paired hands still match, unlike$np). - Rundown macros:
$0gconnected runs,$1g/$2gruns with exactly 1 / 2 missing internal ranks, distributed any way -$2gin PLO matchesAKQ9,KQT8andQJ97alike. - Category macros:
$Bbig (A-J),$Mmiddle (T-7),$Zsmall (2-6),$Llow (A-8),$Nno-low (K-9),$Fface,$Rbroadway,$Wwheel. - Solver ranges:
#6m/rfi/btndrops a frequency-weighted GTO preflop range in (PLO4 only) - see Solver Ranges. - Card-count top-off: hand patterns are padded to the game's hole count.
AAin Omaha becomesAA**.
Weighted ranges. @N after an atom sets
its weight as a percentage of full weight: unweighted atoms are
implicitly @100, AA@50 is half-frequency
AA, values above 100 oversample relative to the rest
(AA@10000,KK@100 samples AA 100× as often as KK),
and @0 excludes the atom outright. Negative or
non-numeric weights are rejected at parse time. Weights survive
composition: union sums weights when the same hand appears twice,
intersection and difference carry them through (so #6m/rfi/btn:$ds keeps the solver frequencies, which
live on the same internal 0-1 scale), and exact enumeration weighs
each configuration instead of ignoring weights.
Classic syntaxes (syntax='classic')
Pass syntax='classic' in the FROM clause to switch the
range parser into a legacy dialect. The parser is selected
automatically by game:
- holdem → Classic Holdem:
AKs= suited AK (all 4 combos),AKo= offsuit AK,AA-TT,AK+,*h*h(both hearts). - omahahi / omaha8 / omahahi5 / omaha85 / omahahi6 → Classic Omaha: literal hands
AsKsTdTh, rank-onlyAAKK, rank classesB M Z L N W, operators&(intersect),!(difference),,(union). PLO6 (omahahi6) also supports the new$ts(triple-suited,xxyyzz) macro. - studhi / stud8 → Classic Stud:
|-delimited per-street segments. - razz → Classic Razz:
A35,JJ4,9-(low-open),3+(high-open),(T- 7- 4)(all-different with parens).
Note that Generic is the default and is what most online PQL examples use. The Classic parsers exist for parity with legacy PPT scripts.
Example queries
All of these run in the PQL engine; pick one from the Examples drawer or paste them in:
Preflop all-in equity (Holdem):
select avg(riverEquity(hero))
from game='holdem', hero='AA', villain='**' Flop-pair conditional win rate:
select count(winsHi(hero))
from game='holdem', hero='AK:$s', villain='**'
where handType(hero, flop) = pair Omaha-8 nut low frequency:
select count(nutLo(hero, river)) as nutLoRate
from game='omaha8', hero='A2**', villain='****' Quartered with nut low:
select count(tiesLo(hero)) as quartered
from game='omaha8', hero='A2**', villain1='15%', villain2='15%'
where nutLo(hero, river) and not (winsHi(hero) or tiesHi(hero)) River hand-type distribution:
select histogram(handType(hero, river))
from game='holdem', hero='AA', villain='**' Multi-query batch:
select count(winsHi(hero)) as AK_wins
from game='holdem', villain='10%', hero='AK';
select count(winsHi(hero)) as J2_wins
from game='holdem', villain='10%', hero='J2' Examples drawer
Open Examples above the editor to choose from eight queries. Search by name or filter with All, Basics, Omaha and Split pot:
- Three hands, three columns (Holdem) - AA vs KK vs AKs preflop, one SELECT column per player.
- Filtering trials with WHERE -
minFlopHandCategory+outsToHandTyperestricted to two-tone, unpaired flops. - A custom EV payoff with CASE - a nut flush draw on a paired turn scored at 3:1 pot odds with
CASE WHEN … THEN … ELSE … END; small enough to enumerate exactly. - Weighted ranges: what @ actually means - the same 22 combos run weighted and unweighted, so the
@Npercentage scale shows up as a ~12-point equity gap. - Shape macros, histograms and handsHaving (PLO) -
AAKK$dsagainst three solver opening ranges (#…), with a per-hand histogram andhandsHaving. - A multi-query batch across opponent strengths -
$B$B$B$Bagainst random, the top 15%, and the BTN solver opening range: three statements separated by semicolons. - Split-pot accounting (Omaha Hi-Lo) - scoops, quartered lows and an exact-fraction test (
= 1/4) in one query. - Stud-8: nut low locked on seventh - split-pot stud counting scoops and quarterings only in the trials where hero ends with the nut low.
Click an example to load it into the editor (replacing whatever was there). Each example shows a one-line description before you commit.
Beyond the drawer, solvepoker.app/pql/recipes collects ready-to-run queries as web pages. Three worked guides lead: PQL by example (a dozen one-line recipes spanning equity, draws, histograms, exact mode, split pots, weights and solver refs) plus two deep studies, Draw density decides the call and Nuttiness beats raw equity. Below them sit fifteen single-question recipes grouped by topic - preflop equity, hand vs hand, flop draws, made hands, board textures, PLO, 6-card PLO and Omaha Hi-Lo. Every query has a link that loads it straight into the PQL engine.
Function reference
Open Function reference from Settings or press Cmd+?. Search for a function to see its arguments, supported games and description. Many entries include a runnable example and Load into editor.
Estimated run time
The line below the editor estimates run time from the game, player count and trial count. A slow query badge appears when the estimate exceeds 30 seconds. Reduce trials or narrow the ranges if you want a shorter run.
Share links & seeds
A fixed seed lets you repeat a query with the same trials on the same device and browser. Results can differ slightly on another device. A query with a count that stops early, or one cut off by max seconds,
can land on a slightly different trial count.
Copy share link (in the gear sheet) is two-tier:
- Short URL -
solvepoker.app/pql/<8 chars>. Keeps the query, trial count and seed for whoever opens it. The older?u=<8 chars>form still resolves. - Hash fallback -
#q=…&n=…&s=…when the API is unavailable. Works offline; capped around 1800 characters.
Opening either form loads the query, trials and seed into the
editor - press Run to execute. The URL is cleaned back to /pql on load, so the address bar doesn't drift while
you edit.
PNG export
After a run finishes, choose Save PNG in Settings to export the query and results in your current theme. Sampled scalar results include their 95% confidence intervals; exact results have no sampling margin. Histograms appear as tables.
The export includes up to 60 query lines and 10 histogram buckets, with a count of any omitted rows. It records the seed and downloads as pql-result.png.
Syntax rules for PPT queries
Check these syntax rules when adapting a query from ProPokerTools:
- In Omaha's Generic syntax,
AKsmeans an ace and the king of spades. WriteAK:$sfor suited ace-king. Hold'em and Short Deck accept shorthand such asAKs,AQoandTT+withoutsyntax='classic'. [2c-6c]and[2c,3c,4c,5c,6c]describe the same five-card set.- Classic Omaha's
&and Generic's:are the same intersection operator and use the same precedence. - Razz auto-routes to classic syntax. Razz queries
use the classic-stud-style hole+up format
(
'A 3 5 | * | * | * | *') and all-different parens ('(T- 7- 4)'); we route to the classic parser by default forgame='razz', and stud games try the classic parser first before falling back to generic. Flop games default to generic. fractionalRiverEquity(p) = 1/4compares exact fractions. You can also use other integer fractions such as13/914.
Known limits
- Full PLO6 wildcard ranges such as
******are supported. Some compound ranges exceed the calculation limit and return "too large to materialize". Narrow or simplify them. Results are never silently truncated. - First percentile query on PLO5/6. The first time
you use a
%selector in PLO5 or PLO6, allow about 30-60 seconds on a fast laptop. A yellow hint appears after 5 s explaining what's happening. Later percentile queries in the same game start faster. - PLO6 has no draw, nut, category or outs functions. Those functions refuse
game='omahahi6'with an error naming the game. - No percentile table for shortdeck. Hold'em, PLO,
PLO5/6, Omaha-8, and 5-card Omaha-8 ship prebuilt percentile tables
(with 3h and 6h variants where they make sense). Shortdeck does not,
so a percent selector like
'15%'ingame='shortdeck'stops the query with an error that says so. Use specific hand patterns instead. nutHiOutscan be slow on Omaha flops. Start with fewer trials or a narrower opponent range before increasing the sample.
Run limits and privacy
A query stops when it reaches its trial or time limit. Some count queries stop early once their estimates are sufficiently precise. Read the completed trial count and confidence intervals when comparing runs. Increase the trial budget for a rare event, and keep a fixed seed when you want to repeat a query on the same device.
PQL runs on your device. Usage records include the query text. Copy share link separately saves the query and run parameters for the recipient.
Study and quiz starting-hand strength at Starting Hands. Choose PLO4, PLO5 or PLO6, then open Categories, Rankings or Quiz. The rankings cover 16,432 PLO4 hand classes, 134,459 PLO5 classes and 962,988 PLO6 classes, ranked by sampled equity against random opponents.
On Quiz, open Settings and choose Copy share link to preserve the tab, game and quiz settings.
Categories
Categories opens by default. It groups hands into nine meta-groups using the same preflop categories as the solver and Hand Tracker. PLO4 uses 40 of the 52 categories, PLO5 uses 42 and PLO6 uses all 52. On the strength axis, each bar spans the middle 80% of combos in its category, the bright section spans the middle 50%, and a tick marks the median.
Expand a category for example hands and suit-specific medians. PLO4 also shows opening frequencies by seat at 100bb 6-max. Switch the opponent count to compare heads-up, 3-max or 6-max rankings; PLO5 and PLO6 offer heads-up and 6-max. See every hand in this category opens its filtered Rankings list.
Use the PPT box or tag pills to recalculate the bars for matching hands. Category drawers close while a filter is active. The box shows progress during filtering and explains invalid syntax. Percentile filters are unavailable here. Click PPT for the syntax reference.
Categories keep the same names across games, with "+ D" marking a rundown's dangler. Ten categories need six cards, including KK + Low Pair, QQ/JJ + Three Broadway and Low Five-Card Rundown.
At the bottom of the tab, a Hand types chart plots one line per hand type (Double pair, Pair + connectors, Single pair (typical), Rundown, Rundown + dangler; PLO6 swaps in Three pair) against the key rank, so you can read what each type is worth as its main card climbs from 5 to A. Two toggles: Suits (ds / ss / rainbow in PLO4, ds / ss in PLO5, ts / ds / ss in PLO6, opening on the least-suited option) and Strength vs (heads-up or 6-max, opening on 6-max). The chart follows the page's variant pill.
Rankings
The full ladder, in three screens:
- Browse - Hands ranked from strongest to weakest. Move with the percentile rail, jump arrows on narrow screens, or ↑/↓. Change opponent count or narrow the list with PPT and tags. Selecting a hand shows its cards, category, suit pattern, equity, rank and percentile. PLO4 also shows opening frequencies by seat at 100bb 6-max. The image button saves this detail as a PNG in your current theme.
- Movers - One list over every class, ordered by the percentile shift from heads-up to 6-max: biggest climbers first, biggest fallers last. Click a hand to open it in Browse.
- Opens (PLO4 only) - Every class sorted by its raise-first-in frequency for the seat picked in the "Open from" tabs (UTG through SB, BTN by default) at 100bb 6-max, with heads-up equity breaking ties, under a line giving that seat's overall open ("raises first-in with 47.4% of unblocked deals" for the BTN). The percentages are the solver's raise frequencies, rounded for display. A zero means no raise from that seat; SB may still limp.
A "Compare variants" button overlays the equity-vs-percentile curves on one chart. NLHE spreads from about 85% (AA) down to 32%; PLO equities cluster closer to 50% - PLO4's best hands sit near 71%, and the 5- and 6-card curves top out near 65%. Paste a PPT range to plot where it sits on the curve, and read the combo-volume histogram under the main chart.
Quiz
Three drills: "Higher or lower" (pick the stronger of two hands), "Order five" (drag five hands into strength order), and "Place the band" (drag a band onto the hand's percentile). Three difficulties tighten the gaps - on Hard, higher-or-lower pairs target 1-5 percentile points apart; the drill widens the gap when equity estimates are too close to order reliably. Best streaks persist in your browser. After a "Place the band" reveal, two panels show the neighbors - "Same suits · ranks ±1" and "Same ranks · different suits" - and Save PNG exports the card.
Ranking method
Rankings are seeded Monte Carlo equity vs random opponents, run per canonical hand class: heads-up, 400k trials per PLO4 class, 200k per PLO5, and 50k per PLO6 (PLO5 publishes as 959 percentile bins, PLO6 as 974); the 6-max tables run their own counts, which the page lists. Fifteen marquee AA hands were re-run at 100 million trials each (95% CI ±0.009pp) to pin the close orderings - AATT double-suited ranks above AAKK, 71.53% to 70.67% vs a random hand. The PLO4 solver overlays (the Opens screen and per-seat open frequencies) come from the same 6-max 100bb MonkerSolver solve as the main tool. The page's methodology accordion carries the rest of the detail.
A probability reference at solvepoker.app/poker-probabilities, in four parts: flop textures at a glance, how often random hands hold specific cards, what a random hand holds on one flop you pick, and how board textures come and run out.
Flop textures at a glance
A small table of how often flops come unpaired (82.8%), paired (16.9%) or trips (0.24%), and rainbow (39.8%), two-tone (55.1%) or monotone (5.2%), plus three runout rows.
Hands panel
The Hands table compares nine holdings across NLHE, PLO4 through 8-card PLO, and Short Deck. Rows describe the required cards and give an example, such as "J and T on Kd9s6h". Choose values rounded to 0.1% or to the nearest 0.5% for memorizing. For example, a random PLO4 hand has two cards of the flush suit on a two-tone flop 21.4% of the time.
Hands on one flop
Choose a game and enter a flop in Hands on one flop by clicking the card slots, typing card codes such as Ts9s8h, or pressing Random. The page starts on T♥9♥6♠. Value groups random hands by made strength; Draw groups them by draw type. Each bar totals 100%.
On that default flop, a random PLO4 hand makes a straight 7.2% of the time and a set 4.4%. Results are exact through PLO6 and Short Deck. Seven- and eight-card Omaha use 25 million sampled hands per row, with about 0.02 percentage points of sampling uncertainty.
Board panel
The Board panel groups flops by pairing, suits and straight texture. Change the order of the dimensions or hide a level to combine groups. Frequency rows show each texture's share of all flops, such as 39.8% rainbow and 5.2% monotone.
The second row color marks runout events: the board pairing, a flush completing, or a straight becoming possible. Turn and river rows sum to the row above them; completion rows are conditional on that event. Expand to a final texture to see what random PLO4 hands hold there, averaged across the flops it represents.
Everything in the texture tree is exact enumeration of all 22,100 flops and every turn and river behind them - about 52 million states, nothing simulated.
Range Frequencies compares each holding's share of dealt hands, BTN opens and BB 3-bets, in NLHE or PLO. Multipliers show how much more or less common it becomes in the selected range.
In PLO, BTN opens 47.4% of deals and BB 3-bets 10.3%. Aces rise from 2.9% of dealt hands to 25.2% of the 3-bet range. Ace-king straight cards rise from 7.2% to 21.9%; 2-4 wheel cards fall from 7.2% to 0.39%.
In NLHE, BTN opens 45% and BB 3-bets 12.5%. Aces, kings and queens are pure raises and each makes up 3.9% of the 3-bet range.
The centerpiece contrasts two boards with identical dealt flush-draw odds - one with high flush cards on board (A-Q of the suit), one with low ones (7-5). In PLO's 3-bet range the low-flush-cards board's flush-draw frequency is 32.1% against the other's 22.7%, because the ace and queen of the suit on board block the big suited combos the range is built around.
The numbers are exact weighted counts over every starting-hand combo of the game - 1,326 in NLHE, 270,725 in PLO - against that game's own 6-max 100bb solve and its actual preflop frequencies, so a hand the solver opens 40% of the time counts at weight 0.4; board cards come out of the deck first. Nothing is simulated.
The Bet sizing and MDF reference has two tables for comparing sizes:
- What every bet size requires - Seven sizes from 1/6 pot to pot, three columns each: the equity a caller needs right now, before rake or later bets (
b/(1+2b)); the bluff share of a balanced, polarized river betting range (same formula); and the MDF against a bet made with zero-equity bluffs (1/(1+b)). Pot-size bet: caller needs 33.3%, bluffs are a third of the betting range, defend half. - The call-down ladder - MDF, MDF², and MDF³ for five sizes: an illustration of how much of a flop range is still in after one, two, or three streets of calling exactly the minimum, with no raises. Called down that way, three pot-size bets leave 12.5% of the starting range.
At Range Advantage, choose RFI, 3-bet or 4-bet and a seat pairing. The page covers all 45 matchups, each across 12 flop textures. Two bars compare the aggressor's and caller's equity and flopped-nuts share.
Expand a flop to compare both ranges by hand class, including made hands, wraps and nut flush draws. "Flopped nuts" means no legal opponent holding can beat the hand on that flop; ties count. This label depends on the cards, without restricting the opponent to a particular range.
Ranges are the 6-max 100bb solve's own reach-weighted ranges at the flop, one clean heads-up entry per matchup, so a hand the opener never opens can't appear in its 3-bet-pot range. Equity runs 50,000 frequency-weighted combo pairs per flop through the same Omaha hand rankings as the equity calculator (the printed ± is the Monte Carlo error); class shares are exact. An "Add your own flop(s)" input runs any comma-separated flops through the same code in your browser, so custom numbers are directly comparable to the curated ones.
Blocker Effects compares a random opponent's holdings as key cards are removed. Choose PLO4, PLO5, PLO6, 7-card PLO or 8-card PLO, all high only.
The left table follows a single rank or suit: kings on K-9-6, K-K-9 and K-K-K, or a flush on K♠9♠6♠ as your held spades increase. The right table follows two-card holdings: J-T for the nut straight on 9-8-7, and both top ranks on Q-9-4, across six blocker configurations.
All exact closed-form combinatorics over the remaining deck, zero simulation. The King ladder varies how many copies the board buries, with nothing in your hand. The flush and two-card ladders take your whole hand into account: your other hole cards miss the key suit or ranks, and the opponent's cards come from what's left.
More free references:
- Preflop charts - PLO preflop charts (open, 3-bet, and calling ranges for every 6-max seat, across the depth ladder and heads-up) and the interactive NLHE preflop charts (any position, facing line, and depth, plus heads-up, on a 13x13 grid).
- Stack depth - how preflop play changes across the ladder, for PLO and NLHE (the NLHE one has a CSV download).
- Starting-hand rankings - full ranked lists for PLO4, PLO5/PLO6, Big O and O8, and NLHE.
- C-bet frequencies - C-bet, donk and check-raise frequencies for every flop in the BTN-vs-BB single-raised pot at 6-max 100bb.
- Variance - PLO downswing and bankroll numbers and the measured swing gap between NLHE and PLO.
- Glossaries - PLO terms and the tracker stat definitions, including stat formulas.
- Hand history files - where each of the ten supported formats is written, for feeding the Hand Tracker.
- Methodology - how every number on the site is produced, from the solves to the simulations.
Import hand histories at Hand Tracker to review winrates, opponents, replays and recorded decisions. It supports NLHE and the PLO family, cash and tournaments, across ten site formats. All features are free; Core raises the import and storage limits. Use it after a session. It has no HUD.
The six tabs are Stats, Players, Replayer, Spots, Leaks and Upload. Leaks contains the decision report. Without an account, try nine sample hands and the Stats, Leaks and Spots demos, or paste one hand to replay it. Sign in with a free account to import and keep your own library.
Library rows, stat drill-downs and player profiles open with Enter or Space.
Importing hands
Drop files or folders onto Upload, or use its file and folder pickers. Accepted formats are .txt, .xml, .log, .hh and .zip. ZIP entries can be up to 50 MB each, with up to 300 MB of unpacked files per drop.
Follow each file under Per-file results for its site, status, hands, skips and errors. A failed file does not stop the others. The Imports list records each batch's files, hands, duplicates, skips and date.
One drop can contain up to 10,000 files. Drops larger than 500 files run as consecutive batches; keep the tab open until they finish. The completed import links to your decision report, preflop references, stats and hand library.
Sites - Ten formats parse: PokerStars (including Zoom and Home Games), GGPoker, Full Tilt, Bovada/Ignition/Bodog, Winamax, iPoker, 888poker, partypoker, WPN (old and new formats), and CoinPoker. Run It Once and ClubGG hands parse through the PokerStars grammar, and DriveHUD's "Export all hands" XML reads as iPoker. The Upload tab's formats table lists each one with its file type, whether opponents can be tracked, and what to know. Straddled pots parse correctly, and GG's bumped straddles replay as a single post at the final total. OnGame, Microgaming, and Merge files are recognized and declined by name, and Winamax tournament summaries, translated PokerStars exports and PDFs each get a message saying why they were skipped. If your site is missing, send us a sample file.
Games - NLHE, Limit Hold'em, Short Deck, PLO4, PLO5, PLO6, O8, PLO5/PLO6 Hi/Lo, and non-PL Omaha Hi, cash and tournaments. Stud, razz and draw hands are skipped per hand with a clear reason. Hands whose chip totals don't balance stay out of the stats and comparisons, and the replayer marks them as unverified.
Reimporting the same file or overlapping archives skips duplicate hands. Duplicates never consume the hand allowance.
The tracker adjusts timestamps when the file specifies a timezone, so cross-site sessions and the heatmap line up. Some iPoker and GGPoker histories lack a reliable timezone. Those keep their recorded time and are marked "recorded time; zone unknown". Keep this in mind when reviewing those sessions or their heatmap.
Stats
The dashboard shows one game and one of cash or tournaments at a time. Your PLO winrate is never blended with your NLHE hands. Filter by position, stake, table size, and month range. Three panels use the whole library regardless of those filters: Sessions, Tournaments, and the day-by-hour heatmap - each says so on the panel.
The headline cards show winrate in bb/100 with a 95% confidence interval, standard deviation, net won, all-in-adjusted results, showdown and non-showdown winnings, and the main preflop and aggression stats.
Money & rake proxy appears in cash scope. Imported histories do not establish a reliable currency, so the card leaves money blank and reports the full pot rake on hands you won in bb and bb/100. The signed-out demo shows dollars. The all-in EV card shows EV bb/100 and the gap from actual results, excluding cash-out and insurance pots.
The bankroll chart has toggles for all-in EV, showdown/non-showdown winnings and a 95% variance envelope. Switch its x-axis between active days and cumulative hands, or export the chart as a PNG. Below it, review recent form, monthly trends, positional winrates with confidence intervals, 28 preflop and postflop stats, and stake and table-size breakdowns.
The starting-hand breakdown uses a 13x13 matrix for hold'em and the solver's preflop categories for PLO4. PLO5/PLO6 category breakdowns are unavailable. Sessions start after a 45-minute gap; hands with different clock sources stay in separate sessions. The day-by-hour heatmap uses your local time.
Tournament results include recorded cashes, buy-ins, ITM and a hypothetical one-entry return. Histories do not record re-entries, so the tracker cannot calculate true ROI.
Click a stat to open its hands. Filters from a session, exact stake or heatmap cell appear as removable chips above the library.
Stat definitions deviate from PokerTracker and Hold'em Manager in five documented places (3-bet excludes limp-reraises, walks are excluded from VPIP/PFR, and three more). The Poker Stat Glossary states every definition so your numbers reconcile.
Players
Players lists your opponents with sortable stats, search, a site filter and a minimum-hand setting. Large libraries show the 20,000 opponents you have played most. Summary cards name opponents with at least 30 hands. Net columns cover cash hands only.
Expand a row for the stat grid, hands, showdowns and notes. Notes and one of five color tags save automatically. Positional VPIP/PFR splits need 50 hands. Export the table as CSV.
Anonymous-pool sites cannot be tracked by name: GGPoker, Bovada/Ignition, Run It Once, ClubGG and CoinPoker. The tab explains this when those hands are selected.
After 30 recorded hands, a player's Action profile summarizes VPIP, PFR, AF and WTSD, with up to five supporting frequencies such as "Folded to three-bet: 12/18 (67%) in the recorded opportunities". Evidence is labeled tentative below 75 hands, likely from 75 and strong from 150. Heads-up and full-ring profiles have lower confidence. Opponents mostly played three- to five-handed show rates without a profile.
The river line summarizes holdings seen at river showdown. It needs 12 classified showdowns for a player or 36 for the pool. These are observed frequencies. They do not establish bluffing intent, reveal an entire betting range or prescribe an adjustment.
Replayer
Use play/pause at 1x, 2x or 4x, step buttons, street buttons, the slider or the action log to move through a hand. Left/Right step frames, Home/End jump to either end, and Space plays or pauses. Up/Down move between hands in the filtered library.
Toggle amounts into big blinds or reveal known opponent cards from the start. At showdown, the table shows made-hand labels and side pots. Run-it-twice or three-times hands show every board below the table; playback and the equity chart follow the first runout.
Equity overlay - Below the transport controls. When two or more hands are shown down, an "Equity among shown final hands" race runs per street: board-enumerated on the flop, turn and river, sampled (≈) preflop. It compares only the players who reached the end, which it says under the chart - players who folded earlier aren't in it. When only your own cards are known, "Your equity" shows your equity against uniformly random hands instead, labeled ≈. O8 hi/lo splits and Short Deck rankings are handled.
Decision math - For the bet faced at the current frame ("Facing 6 into 9 (67% pot)"): the immediate call price, the MDF reference, and the indifference reference for the bettor's bluffs. All three come from pot-odds arithmetic alone; no solver is consulted.
Below the replayer sits the library: 25 hands per page, sortable by pot, result, or date, with quick filters (site, game, cash/MTT) and advanced ones (position, farthest street, pot size, table size, VPIP, showdown, starred, dates, stakes). Star hands for review, attach notes, and step prev/next through the whole filtered set without leaving the replayer.
Spots
Use Spots to filter your whole library by position, pot type, betting line, street, result or showdown. Choose a street before selecting made-hand and draw filters. These combine, so top pair plus nut flush draw requires both. Draw filters are unavailable on the river.
Other filters include cash/tournaments, stakes, starred hands, dates, game and all-ins. All-ins-only includes hands with computable equity, excluding uncalled jams and unknown opponent hands. Sort by biggest win or loss.
The result shows net bb, bb/100 with a confidence interval, win rate and WTSD, plus EV bb/100 when all-in adjustment changes the result. A situation-only filter warns that folded hands are included. Click a row to replay it. CSV exports the loaded rows; the button shows the count.
Save a named filter combination to revisit it from your account. You can keep up to 50 saved views.
Decision report (Leaks)
Leaks compares recorded decisions with a named library solve or a pot-price reference. Each table shows its sample and assumptions. The report updates after an import. Start with Decisions analyzed, Win rate and How to use this report, then open Preflop reference, River betting composition, River defense, Stack-offs & all-ins, Winrate shape or Sessions.
Observations beside the tables include their sample counts. For example, a button winrate can have a 95% interval entirely below zero after more than 20,000 hands. Read that interval alongside the estimate.
Opening versus the solve compares cash PLO4 first-in decisions at 6-max 12/20/30/40/50/100/150/200bb or HU 100bb, and cash NLHE at 6-max 20/30/40/50/70/100/150/200bb. Each seat/depth needs at least 100 first-in opportunities. The table compares your play with the solve for the hands you were dealt. It also lists hands you raised that the solve plays at 10% or less, and hands you folded that it plays at 90% or more.
A reference requires six players dealt in, or two for HU, and a nearby stack depth. PLO covers 9-64bb and 80-320bb, with a gap between 64bb and 80bb. HU 100bb covers 70-150bb. NLHE covers 16-320bb continuously. Rake, every player's stack and action sizes are not matched to each hand, so read the comparison with those limits in mind.
Click a solve name to open that seat's range. A note below identifies the closest solve for most of your spots.
Your money by starting-hand category - Your real bb/100 per hand category, with VPIP and a 95% error bar, in the same taxonomy as Preflop Study. Four-card PLO hands only, and a category needs 30 played hands; a report built before the September taxonomy update shows it empty until you rebuild it.
River bets and sizing - The share of your river bets at each size made with holdings the classifier labels weak or air, beside the arithmetic indifference ratio for that size; how strong your betting holdings were at each size, street by street; and how often you kept going facing each bet size, beside the minimum defense frequency. All three are pot-price references for a simplified opponent, and the note under each table says what it can't measure: bluff intent, how opponents read your sizing, and the right defense against the actual ranges.
All-ins and stack-offs - All-in equity by street, with your EV-adjusted result beside your actual result, and your stack-offs by flop SPR split into strong hands and nut draws, medium, and weak or air.
What each game gets - PLO5, PLO6, non-pot-limit Omaha, tournaments and heads-up NLHE get the pot-price tables; the first-in reference covers cash PLO4 dealt six-handed or heads-up, and cash NLHE dealt six-handed. Hi/lo (O8, PLO5/PLO6 Hi/Lo), Short Deck and fixed-limit hands sit outside the analysis, because split pots and inverted rankings change the pot math and forced sizings break the sizing model. Those hands still get full stats, Players, Spots and the replayer.
For hands graded against the solve, use Game mode in the solver's Practice: those hands are played inside the solver's own tree, so every decision the solver reaches has an exact answer.
Sharing & export
Below a replay, use Copy for forum for PokerStars-format text or Copy markdown for a short summary. Copy for forum falls back to Markdown if the hand cannot be written in that format. Sign in and press Create share link to share an interactive replay.
A shared replay at solvepoker.app/h/<slug> is a fixed copy of that hand. It keeps working after you delete the original, expires after a year and can be revoked from your links list. It does not give access to your library. Anonymize is on by default and removes player names, table, hand number and exact time.
CSV: export the current library filter (up to 10,000 rows, in your current sort order), the Spots rows loaded so far, or the Players table.
Free tier & limits
No feature is gated. Free and Core differ only in caps:
| Free | Core | |
|---|---|---|
| Hands processed (lifetime) | 100,000 | 5,000,000 |
| Storage | 2 GB | 50 GB |
Per-file limit is 50 MB, up to 500 files per import (a bigger drop splits into several, up to 10,000 files), 30 imports an hour - every 500-file slice counts toward that - and 50 imports open at once. Duplicates never count against the meter. Deleting an import frees its storage but doesn't refund processed hands, and canceling Core keeps your library readable.
Free and Core access
One account covers NLHE, PLO and PLO5. Every preflop range is free, and the calculators and public study references need no account. A free account adds your chosen daily flop, saved work and a larger practice meter.
| Activity | Signed out | Free account | Core |
|---|---|---|---|
| Preflop Study | All ranges | All ranges | All ranges |
| Postflop library | 3 rotating flops | 3 rotating flops + 1 chosen flop a day | Every flop and runout |
| Practice and Game mode | 15 hands a day | 50 hands a day | No daily hand meter |
| Hand Tracker storage | Sign in to import | 100,000 hands | 5,000,000 hands |
The practice meter is shared across games and practice sections. A spot quiz answer costs one hand. A completed Game mode hand or full preflop hand costs one, however many decisions it contains. A spent meter leaves Study open. Custom solve allowances are separate.
Manage Core from Account. The same plan applies on desktop and mobile after signing in. After a checkout or payment change, let the account status finish refreshing before starting another purchase. If a paid feature remains locked, check that you are using the account that holds the subscription.
Notifications and replies
Open Notifications while signed in to read account messages and product updates. Mark read clears one unread notice and Mark all read clears the inbox's unread status. Messages that invite a response show Reply or Answer.
Open a conversation to read its history, write a reply and press Send reply. Replies are private between your account and the SolvePoker team. Load earlier messages retrieves earlier replies. Close conversation folds the panel away; it does not delete the exchange. An email about a reply links back to its conversation on the site. You can also open the same inbox from Account's Notifications tab.
Email preferences
Open Account > Email to change Product updates, Notification messages, and Tips and notes from Adam. Turning off Tips and notes switches off those non-billing emails together. Messages still appear under Notifications. Billing receipts, renewal dates and cancellation confirmations continue to send.
When a spot will not open
- A locked flop or runout needs today's available choice or Core access. Opening a link does not automatically spend a daily card. Return to the picker and choose it explicitly if you want to use a remaining slot.
- A practice filter with no valid hands offers Deal every hand. Clear the restrictive Starting hands or Boards selections, or choose a line those hands can reach.
- A line that disappears after a stack change has no matching action in the new solve. Start from the last decision the app could follow and choose an action that exists there.
- A custom-solve refusal before starting costs nothing. Reduce the sizing menu if the spot is too large. For a lost connection, wait for Reconnecting or use the active-solve banner's Open it.
- A browsing-limit message gives the reset time. Study an already loaded result or return after the window resets. The practice meter, custom solve allowances and browsing allowance are separate limits.
For a specific study question, include the Copy link for the library spot or the Share link for the saved experiment when you contact support. Include the game, stack and action you expected if you cannot create a link.
Card colors
SolvePoker uses a 4-color deck throughout the tool:
| Suit | Color |
|---|---|
| Spades ♠ | White |
| Hearts ♥ | Red |
| Diamonds ♦ | Blue |
| Clubs ♣ | Green |
Those are the values on the dark themes. The six light themes keep the same 4-color mapping but darken it for a light ground: spades go near-black, and hearts, diamonds, and clubs deepen. The calculators' PNG exports, and the Hand Tracker's bankroll chart export, render in whatever theme you're on, so a light-theme export carries the darkened deck; the Hand Tracker's share-card image is the one export that stays frozen on the dark-ground colors. How the card faces look is separate: the solver's 12 deck styles (see Settings) restyle the faces while keeping this same suit mapping.
Action colors
Actions are color-coded consistently. Two action palettes exist; pick between them on your Account page under Appearance:
| Action | Classic (default) | Colorblind-safe |
|---|---|---|
| Check / Call | Green | Sky blue |
| Fold | Blue | Gray |
| Bet / Raise / All-In (small → large) | Four reds, light → dark | Four ambers, light → dark |
Aggressive actions use darker shades for larger sizes. One bet size uses the darkest shade; two use the two darkest, and so on. All-in counts as the largest size. These action colors stay the same across themes.
The colorblind-safe palette uses blue and orange for red-green color blindness. It also changes the Hand Tracker's profit/loss colors from green/red to blue/orange.
Chip denominations
| Chip | Color |
|---|---|
| $100 | Black |
| $25 | Green |
| $5 | Red |
| $1 | White |
| $0.25 | Pink |
Chip stacks use the largest denominations that fit the amount, keeping the stack readable. The Hand Tracker's replayer adds five bigger chips for big pots - $500 purple, $1,000 yellow, $5,000 orange, $25,000 light blue and $100,000 magenta - and draws at most five chips per stack, keeping the largest.