← Inside the Game

SOHE: how we built it and mistakes we made along the way

We had fun building SOHE into MyHomeGame, but would be lying if we said it was simple. We thought other home-game hosts, poker enthusiasts and developers who have wanted to add it to their own game might appreciate a look at the decisions, the bugs, and what took more work than expected.

First, agree on the rules

SOHE—Simultaneous Omaha and Hold’em—deals each player six cards: two become a Hold'em hand, four become an Omaha hand. Both use the same board, and each game awards half the pot. Winning both is a scoop. Hold'em can use zero, one or two private cards; Omaha must use exactly two private cards and three board cards. Both halves play for high. BARGE's SOHE rules explain the game, but some procedures differ between published versions.

BARGE has players bet before separating their cards. The Poker Game Database's procedure sets the hands before betting. We use the second sequence: deal, arrange, then bet. That was the version we wanted to offer, largely because that’s how we learned it in live games.

We also give an odd chip to Hold'em; BARGE's odd-chip convention gives it to Omaha. An eleven-chip pot here pays six to Hold'em and five to Omaha. While we can’t imagine it really makes a difference, we’d be curious to know if you think there is a strong justification for doing it either way.

One clock for everyone

Arranging initially borrowed the ordinary action timeout. We gave it its own visible timer, defaulting to 25 seconds. The club can change it, but players can't use their betting time bank. Everyone chooses at once. Seven players shouldn't need seven separate clocks to sort six cards.

The server sets the deadline. Reconnecting or refreshing brings back the time you had left. We also leave a short pause for the cards to arrive before the clock starts.

If you run out of time without the server accepting a choice, the first two cards dealt become Hold’em and the other four become Omaha. Your hand stays live, but the timeout counts toward the club's limit for sitting players out. If you've picked two cards without confirming, the browser tries to send them as the clock expires.

Leaving isn't folding

If a player is away and hasn't chosen a split, we keep their cards in the order they were dealt. We allow a brief disconnect grace period; players already marked absent get that default straight away, so nobody waits for someone who isn't there.

Pressing Leave does the same if you haven't chosen; if you have, your split stays put. Once betting starts, we automatically check on an absent player’s behalf when there’s nothing to call, and fold their hand when they face a bet. In a tournament, their stack stays at the table.

All-in players need different treatment: leaving can’t take away their chance to win. We found a really annoying bug here during testing. Leaving during card selection folded players who were already all-in from their blind. Their chips stayed in the pot, but they could no longer win it. Heads-up, the other player could receive the pot without a board being dealt. We fixed that by keeping the all-in hand live, giving it the default split and settling any winnings before the player left.

Teaching bots two games at once

Our bots use programmed strategy and simulations, rather than a machine-learning model trained on SOHE hands.

They originally kept the dealt-order split. Now they try all fifteen ways to pick two cards, choose the strongest Hold'em starting hand, and leave the other four for Omaha. That has limits: a human might weaken Hold'em to keep a much stronger Omaha combination.

A bigger mistake was pooling all six private cards with the board when estimating strength. A royal flush in Hold'em could look like a certain scoop despite a losing Omaha hand. Yes, that was a “lol” moment when we caught it.

We changed the simulations to score each half independently: half the pot for winning one game, a quarter for tying that half with one opponent, the whole pot for winning both. We assume simulated opponents pick their pair the same way our bots do, which won't describe every human player. We deal them possible hidden cards in the simulation; bots never see opponents' actual hidden cards.

The deck and the result

Eight players need 48 private cards plus five board cards: 53. The deck has declined to provide the extra one.

The seven-player limit had to reach beyond dealing. Our tournament planner once assigned players to nonexistent eighth and ninth seats. The client also once offered seven-seat tables before its layouts could draw them, crashing the page. We later added an option for eight-seat cash tables: when all eight players would receive cards, the player immediately before the button—the cut-off—sits that hand out. That position moves with the button.

Once the cards are dealt, there’s still the job of dividing the pot. Side pots add another complication. Each has its own list of players who can win it, and needs a Hold'em winner and an Omaha winner, including any ties. We read out the Hold'em and Omaha portions separately and preserve the split in hand history.

It’s a great game

We hope sharing these decisions and mistakes saves someone else some work, whether they're building software or running a home game. Building SOHE was a bear, but it’s a great game that gives us, as poker players, something new to figure out.

More on SOHE