Skip to Bot Arena
Flawless Poker
VIRTUAL-CHIP TABLES · FLAWLESS-BOT-1

Bring your bot. Sit it down.

A table for poker programs, on this site’s chips.

Your program stays on your computer. Register it here, start the client so the bot is connected, then seat it at a Galaxy Arena table. It asks diamondbrightai.com for its turn and answers with fold, check, call, bet, raise, or all-in. The Galaxy engine keeps the deck, the pot, and the rules. Anyone can watch. Humans do not play these hands. The chips are virtual.

VIRTUAL CHIPSYOUR PROGRAM STAYS WITH YOUONE LEGAL ACTIONHOLD’EM
01 · MESSAGESee your seat

Cards, stacks, board, pot, and the actions that are legal.

02 · REPLYName one action

Send it back on a single line before the turn expires.

03 · SEASONWatch the week

Open tables stay public. Ten hands puts a bot in the running for Gold, Silver, and Bronze.

ON THIS SITE

Register a bot. Open a table.

Anyone can watch a Galaxy Arena table. An account can register up to three bots. The token is shown once. The client must be running before the bot can sit; a name alone is not a connection. Rotate the token when you want a new secret, or revoke it to cut the old one off. Your program posts the token to /api/bot-arena/turn and receives the decision for its own seat. Open empty seats for other builders, fill the rest with Orion, or name one other account’s connected bot for heads-up. A match is 5, 10, or 20 hands of no-limit Hold’em at 2, 4, 6, or 8 seats. Each seat sits down with 100,000 virtual chips. The season board adds the chip result of finished Galaxy Arena matches to a bankroll that also starts at 100,000, and records the place. Private Galaxy games stay off this board. A new season opens every Monday at 00:00 UTC. Lifetime results stay on the same board. The owner of a bot can open that bot’s page and read its own hands. Passing chips between two of your own bots is outside the competition.

Create an account to register a bot

No tables are open yet. The first match shows up here for anyone to watch.

Season leaderboard

Every bot starts the week with 100,000 virtual chips. A finished match adds that seat’s chip difference to the week the table opened. Place points are the season score: first at a full table scores one point per seat, and last scores one. Rank still follows the virtual-chip bankroll. The next week starts again at 100,000.

No bots are on this season’s board yet.

Lifetime

Lifetime rank follows total chip net across every finished match. Best finish is the highest place that bot has recorded.

No finished matches are on the lifetime board yet.

FLAWLESS-BOT-1

One message in. One action out.

Send Authorization: Bearer and your token. GET /api/bot-arena/matches lists open seats, live tables, finished results, the season, and lifetime standings. POST /api/bot-arena/join with {"seats":2,"hands":5} opens a table, or with {"matchId":"..."} takes an open seat. POST /api/bot-arena/turn with {} reconnects. When status is action, answer before deadline, about 30 seconds. The observation includes that seat’s hole cards, the board, stacks, legal actions, and the actions already taken. Other hole cards and the deck stay with the table. to on a bet or raise is the total this seat’s bet should reach, from minTo to maxTo. Repeat hand and actions so a retry cannot act twice. A missing, late, or illegal reply checks when a check is free, and folds when it is not. status: complete returns the match result. A later poll is idle and includes lastResult.

The table sends

{
  "protocol": "flawless-bot-1",
  "matchId": "table-id",
  "seat": 0,
  "variant": "holdem",
  "gameType": "cash",
  "status": "active",
  "hand": {
    "number": 1,
    "street": "preflop",
    "button": 1,
    "smallBlind": 10,
    "bigBlind": 20,
    "board": [],
    "pot": 30,
    "currentBet": 20,
    "actor": 0,
    "toAct": true
  },
  "you": { "hole": ["As", "Kd"], "stack": 99990, "bet": 10 },
  "players": [
    { "seat": 0, "name": "Your bot", "stack": 99990, "bet": 10 },
    { "seat": 1, "name": "Orion", "stack": 99980, "bet": 20 }
  ],
  "actions": [],
  "legal": {
    "fold": true,
    "check": false,
    "call": true,
    "callAmount": 10,
    "bet": false,
    "raise": true,
    "allIn": true,
    "minTo": 40,
    "maxTo": 100000,
    "toCall": 10
  }
}

Your bot answers

{ "protocol": "flawless-bot-1", "kind": "raise", "to": 60, "hand": 1, "actions": 0 }

Stdout is reserved for these action lines. Logs belong on stderr. A missing, late, or illegal reply checks when a check is free, and folds when it is not.

ON YOUR COMPUTER

Connect with the Python example.

Download call-station.py. It uses the public API above and does not need this site’s source. One bot opens a table. The other joins the same size and hand count. Both then poll for turns. The Node example still speaks the local referee on stdin.

Local referee

npx tsx scripts/bot-match.ts --hands 10 \
  --bot "Call Station|node public/bot-arena/call-station.mjs" \
  --house

Two bots on this site

FLAWLESS_BOT_TOKEN='paste-token' FLAWLESS_OPEN=1 \
FLAWLESS_SEATS=2 FLAWLESS_HANDS=5 python3 call-station.py

FLAWLESS_BOT_TOKEN='other-token' FLAWLESS_JOIN=1 \
FLAWLESS_SEATS=2 FLAWLESS_HANDS=5 python3 call-station.py

The local referee is no-limit Hold’em with 1,000 virtual chips, 1 to 50 hands, and 2 to 8 seats. Tables on this website use 100,000 virtual chips, 5, 10, or 20 hands, and 2, 4, 6, or 8 seats. Blinds are 10 and 20. A busted stack in a cash match buys in again for the next hand, and that rebuy counts in the chip result.