Skip to content
Back to the equity calculator

Range syntax cheat-sheet

Use these forms in any equity-calculator range box. Kairo flags unsupported combinations as you type and links back to the relevant topic here.

Every range expression either computes or tells you exactly why not — with a fix.

No-Limit Hold’em — basics

Use two ranks for Hold’em hands, add s or o for suitedness, and separate alternatives with commas. A trailing + extends upward through the matching hand family.

AAPocket aces: all 6 concrete combinations.
22+Every pocket pair from 22 through AA.
22-99Pocket pairs 22 through 99, inclusive.
AKs / AKo / AKAce-king suited; use AKo for offsuit or AK for either.
ATs+Suited aces from ATs through AKs.
AhKsExactly the ace of hearts and king of spades.

Hold’em wildcard families

Hold’em has two broad wildcard families. They are complete atoms, so adding a suited or offsuit suffix produces a typed family-suffix error.

A*Any two-card Hold’em hand containing an ace.
**Every two-card Hold’em starting hand.
A*s / **oTyped error: wildcard families do not take s or o suffixes.

Percentile bands

A % selects hands by the current seat’s ranking. Bounds accept at most two decimal places and always require the percent sign.

20%The top 20% under the selected ranking.
10-20%The slice from 10% through 20%.
2.5%A valid decimal percentile.
2.555%Typed error: round to at most two decimal places.
See the developer grammar for the variant ranking basis, opponent model, weighting, and why PPT 6h suffixes are not supported.

Percentile ranking modes

Equity versus Balanced is a per-seat toggle beside the range, not parenthesized grammar. Balanced composition is limited where structural predicates require the Equity ranking.

20%The syntax stays the same; the seat toggle selects its ranking.
Equity toggleDefault hot-and-cold equity ordering.
Balanced toggleEquity and structural playability blended into one ordering.
Seat ranking toggleUse this control to choose the ranking; mode names are never part of range syntax.

Omaha patterns

Omaha patterns name the ranks held together; suits remain unrestricted unless cards or qualifiers pin them. Short broad patterns may auto-pad to the selected PLO hole size.

AAKKAces and kings together, with any suits.
AKQJAce-king-queen-jack together, with any suits.
AsKsQsJsExactly these four spades.
AAOn PLO4, a short pair pattern auto-pads to AA**.

Wildcards

An asterisk occupies one unknown rank slot. The old x wildcard is retired because lowercase x, y, z, and w now bind per-card suits.

AA**PLO4 aces plus two wildcard ranks.
AA***PLO5 aces plus three wildcard ranks.
AA****PLO6 aces plus four wildcard ranks.
AAxxTyped error: replace legacy x wildcards with *.

Variant hand shapes

The selected variant fixes the hole size at 2, 4, 5, or 6 cards. Too-short guidance distinguishes Hold’em notation from explicit Omaha slots; too-long guidance tells you how many slots to remove.

NLHEExactly 2 hole-card slots.
PLO4Exactly 4 slots; AK** is not the same meaning as Hold’em AKs.
PLO5Exactly 5 hole-card slots.
PLO6Exactly 6 hole-card slots.

PLO suit qualifiers

Append a colon qualifier to an Omaha atom to constrain its sorted suit-count shape. These modifiers are PLO-only and must follow a hand atom.

:dsStrict double-suited: an exact 2+2 top shape.
:dtsExactly two flush threats, including 3+2 and 3+3 shapes.
:1sExactly one flush threat of at least two cards.
:tsTriple-suited 2+2+2; available only in PLO6.
:mMonotone: every hole card has the same suit.

Suit classes and shape vectors

Numeric vectors state exact sorted suit counts. PPT-style letter predicates read the sorted counts below; each row says when trailing singleton suits are allowed.

:2-2-1-1PLO6 exact 2+2+1+1 suit shape.
:xxyyExact 2+2 shape; equivalent to :ds at PLO4.
:xxyzThe three largest suit counts are exactly 2, 1, and 1: PLO4 is 2+1+1; PLO5 permits a fourth singleton (2+1+1+1).
:xxxyThe two largest suit counts are exactly 3 and 1: PLO4 is 3+1; PLO5 and PLO6 permit one or two trailing singletons.
:xxxyyThe two largest suit counts are exactly 3 and 2: PLO5 is 3+2; PLO6 permits one trailing singleton (3+2+1).

Rundowns and gap classes

Rundown + and span sugar preserve a gap structure while moving through ranks. Gap qualifiers constrain rank-variable skeletons; on fully named ranks they are redundant.

JT98+JT98 and every higher four-card zero-gap rundown.
T987-6543The matching rundown windows from T987 down through 6543.
RONP:0gAny four distinct ranks with no internal gap.
RRO9:1gA pair, another rank, and 9 with one internal gap.
RRON:2gA pair plus two distinct ranks with two internal gaps.

Rank variables

Uppercase R, O, N, and P stand for ranks; repeated letters share a value and different letters must differ. Rank variables are Omaha-only.

RRAny pocket pair, padded to the PLO hole size.
RROOAny two distinct pocket pairs.
RRONA pair plus two different unpaired ranks.
AARRAces plus any other pocket pair.
RR:20%Any pair intersected with the top 20%.

Rank structure (hole-card pairs)

These describe the shape of your hole cards' RANKS — how many pairs you hold — the way suit classes describe their suits. PLO4/PLO5/PLO6 only; they compose with a pattern, a suit class or a percentile.

**:unpairedEvery hole card a different rank
**:singlepairedExactly one pair among the hole cards
**:doublepairedExactly two pairs among the hole cards
**:triplepairedThree pairs (PLO6 only)
**:notripsNo rank appears three or more times
AA**:doublepairedAces plus one other pair
20%:unpairedThe top 20% of hands that hold no pair

Pasting from PPT / Odds Oracle: $np, $op and $nt map to :unpaired, :singlepaired and :notrips. $tp is asked about first, because Kairo has historically read it as top pair — pick the two-pair hand shape and it becomes :doublepaired.

Per-card suit variables

Lowercase x, y, z, and w after a rank bind card suits. Reusing a letter requires the same suit; a different letter requires a different suit.

AxKxAce and king share suit x; PLO adds the remaining slots.
AxAyKxKyAces and kings split across the same x/y suit pairing.
AxKx**Suited ace-king plus two unrestricted PLO4 slots.

Board-conditioned categories

Categories filter a concrete range against the current board and work for both NLHE and PLO. They require a flop, turn, or river board before Kairo can plan them.

:tp / :2ndpair / :bottompairTop, second, or bottom pair relative to the board.
:set / :setb / :setm / :settAny set, or bottom, middle, and top set refinements.
:2p / :trips / :straight / :flushTwo pair, trips, straight, or flush made classes.
:boat / :quads / :sfFull house, quads, or straight flush.
:fd / :nfd / :gs / :oesdFlush, nut-flush, gutshot, or open-ended draws.
:wrap / :combodrawNine-plus straight outs, or a combined straight-and-flush draw; supported in NLHE too.
:flush+The made class or any better class on the ladder.

Bracket rank sets

A bracket supplies several choices for one Omaha rank slot and expands into a small group. Brackets are PLO-only; NLHE returns a typed unsupported-syntax error.

[AKQ]JTOne slot is A, K, or Q, followed by J and T.
[A-T]QJOne slot is any rank from ace through ten.
[8+]765One slot is 8 or higher.
[2c-6c]KQOne club slot from 2c through 6c.

Broad ranges and the combo cap

Exact concrete lists are capped at 50,000 combos. Supported over-cap forms stay compact and stream or sample inside the engine; an unexpected over-cap expansion is reported instead of silently truncating.

20%A compact ranking-backed broad range.
AA****A compact PLO6 structural predicate rather than a giant browser list.
50,000 combosMaximum exact ComboList size.

Empty and residual range shapes

Valid but empty means the grammar was accepted but intersections, exclusions, or blockers left no playable hands. Kairo prefers a specific reason; materialization-empty is the residual prompt to broaden or remove a filter.

AAAA:KKKKFour aces and four kings need eight hole cards, so this impossible intersection refuses loudly in every PLO variant.
AA!AAA valid exclusion can remove the whole starting population.
Valid range, zero handsResidual valid-zero case: broaden the range or remove a filter or blocker.

Exclusions and weights

Use ! to subtract hands or cards from the term on its left, and @N for a 1–100 term weight. A weight changes composition only inside a weighted union.

22+!QQAll pairs except queens.
35%!AdTop 35% with every hand containing the ace of diamonds removed.
AA@75, KK@25Canonical use: a weighted union, with aces at 75 and kings at 25.
AA@50Anti-example: on one range the weight is inert, and the planner tells you.

Unions

Commas combine alternatives. Every member must share a routing shape that Kairo can represent without silently mixing incompatible plans.

AA, KK, QQPocket aces, kings, or queens.
20%:AA****, 20%:KK****Top-20% PLO6 aces or top-20% PLO6 kings.
AA**:fd:oesdTwo board-relative draw categories on the same atom.

Intersections

A colon between two atoms means both sides must hold. Qualifier and category keywords still win when they appear after the colon.

20%:AAPocket aces that also fall inside the top 20%.
AA****:KK****PLO6 hands containing both an ace pair and a king pair.
AKs:flush+Suited ace-king that makes a flush or better on the board.

Groups

Parentheses bind a union before a following qualifier, exclusion, or weight. Grouped members must remain compatible after the modifier distributes.

(AA**, KK**):dsDouble-suited aces or kings in one grouped expression.
(AA, KK)!QQA grouped union with queens removed afterward.
((AA**, KK**), QQ**)Nested grouping is allowed when every group is balanced.

Saved ranges and built-in aliases

Reference a saved range as $name; its variant and percentile mode travel with it, and compatible qualifiers distribute through it. Built-in aliases below are rendered from the parser registry.

$premiumThe saved range named premium.
$premium:dsThe saved range restricted to double-suited hands.
Built-in range aliases
AliasKairo readingFresh input
$ds:dsActive
$ss:ssActive
$r:rActive
$M:mAsks on fresh input (PPT collision)
$0G:0gActive
$1G:1gActive
$2G:2gActive
$BP:bottompairAsks on fresh input (PPT collision)
$MP:2ndpairAsks on fresh input (PPT collision)
$TP:tpAsks on fresh input (PPT collision)
$SETB:setbActive
$SETM:setmActive
$SETT:settActive
$FD:fdActive
$NFD:nfdActive
$GS:gsActive
$WR:wrapActive
$SD:gs:oesd:wrapActive
$NP:unpairedActive
$OP:singlepairedActive
$NT:notripsActive

What computes where

This matrix shows REVIEWED catalog coverage, not every range the live compiler can compute. Each cell is checked against the same compiler used by the calculator. A feature may compute for some forms and return a named, typed error for others.

Range feature support by poker variant
FeatureNLHEPLO4PLO5PLO6
Basics✓ Computes✓ Computes✓ Computes✓ Computes
Wildcard familiesnlhe_family_too_many_slots✓ Computes✓ ComputesNot catalogued✓ Computes
Over-cap rangesNot cataloguedNot cataloguedNot catalogued✓ Computes
QualifiersNot catalogued✓ Computesqualifier_requires_atomNot cataloguedNot catalogued
Bracketsnlhe_brackets_unsupported✓ ComputesNot cataloguedNot catalogued
RundownsNot catalogued✓ ComputesNot catalogued✓ Computes
Percentiles⏳ Needs NLHE ranking tablepercentile_too_many_decimals✓ Computes✓ Computes✓ Computes
Intersections⏳ Needs NLHE ranking table✓ ComputesNot catalogued✓ Computesintersection_provably_empty
Rank variablesrank_vars_unsupported_for_nlherank_var_case_mismatch✓ Computesrank_var_case_mismatch✓ Computes✓ Computes
Suit variablessuit_vars_unsupported_for_nlhe✓ Computesrank_var_case_mismatchNot cataloguedNot catalogued
Board categories✓ Computes✓ ComputesNot cataloguedNot catalogued
Hole sizehole_size_mismatchhole_size_mismatchhole_size_mismatchhole_size_mismatchpattern_too_long
Saved-range macrosNot cataloguedmacro_undefinedNot cataloguedNot catalogued
Built-in aliasesNot cataloguedalias_dialect_collision✓ ComputesNot cataloguedNot catalogued
Percentile modesNot catalogued✓ Computesstructural_predicate_balanced_mode_unsupportedNot cataloguedNot catalogued
Gap classesNot catalogued✓ ComputesNot cataloguedNot catalogued
Shape vectorsNot cataloguedNot cataloguedNot catalogued✓ Computes
Weights✓ ComputesNot cataloguedNot cataloguedNot catalogued
Excludes✓ ComputesNot cataloguedNot cataloguedNot catalogued
Unions✓ ComputesNot cataloguedNot cataloguedNot catalogued
Empty range shapesmaterialization_emptyNot cataloguedNot cataloguedNot catalogued
GroupsNot catalogued✓ ComputesNot cataloguedNot catalogued
Rank structurerank_structure_unsupported_for_nlhe✓ Computesqualifier_requires_atomrank_structure_conflicts_with_patternrank_structure_impossible_for_variantduplicate_qualifierrank_structure_unsupported_composition✓ Computes✓ Computes

See the full capability catalog →