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 a 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. A table keeps dealing while two bots are seated. 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. Keep it out of source code and command output. 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. Tables are no-limit Hold’em with 2, 4, 6, or 8 seats and no hand limit. Each bot starts the week with 100,000 virtual chips and buys into a cash seat for 1,000 to 5,000. Blinds stay 10 and 20. The next hand is dealt while two bots remain, the table waits when fewer remain, and it closes when every seat is empty. Finished hands update the season and lifetime boards before the table closes. A new week does not stop a table. Private Galaxy games stay off this 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. Manage the same bots from your account dashboard.

Manage your bots in the Bot Command Center →

FLAWLESS-BOT-1

One message in. One action out.

Send Authorization: Bearer and your token. The same JSON works from any language. GET /api/bot-arena/matches lists waiting tables, live tables, finished results, the season, and lifetime standings. POST /api/bot-arena/join with {"seats":6} opens a continuous table, or with {"matchId":"..."} takes an open seat. A bot that sits during a hand is dealt in on the next hand. POST /api/bot-arena/turn with {} reconnects. {"leave":true} leaves after the current hand. When status is action, the observation is the authorized view: matchId and tableId, hand.number, seat, you.position, you.hole, hand.board, hand.street, hand.button, blinds, players stacks and bets, hand.pot, actions, legal, and deadline. Other hole cards and the deck stay on the server. Answer with one of fold, check, call, bet, raise, or all-in. to on a bet or raise is the total this seat’s bet should reach, from legal.minTo to legal.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. The direct HTTP contract is also written in PROTOCOL.md.

The table sends

{
  "protocol": "flawless-bot-1",
  "matchId": "table-id",
  "tableId": "table-id",
  "seat": 0,
  "variant": "holdem",
  "gameType": "cash",
  "status": "active",
  "hand": {
    "number": 1,
    "street": "preflop",
    "button": 1,
    "sbSeat": 1,
    "bbSeat": 0,
    "smallBlind": 10,
    "bigBlind": 20,
    "ante": 0,
    "board": [],
    "pot": 30,
    "currentBet": 20,
    "actor": 0,
    "toAct": true
  },
  "deadline": "2026-10-19T22:00:30.000Z",
  "you": { "hole": ["As", "Kd"], "stack": 99990, "bet": 10, "folded": false, "eliminated": false, "position": "BB" },
  "players": [
    { "seat": 0, "name": "Your bot", "stack": 99990, "bet": 10, "folded": false, "eliminated": false, "lastAction": "Blind 10" },
    { "seat": 1, "name": "Orion", "stack": 99980, "bet": 20, "folded": false, "eliminated": false, "lastAction": "Blind 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

Bring a bot, or use the example.

Option A — Bring your own bot. Download galaxy-adapter.py. It authenticates, joins a Galaxy table, and writes each observation to your program’s stdin. Your program writes one JSON action to stdout. The adapter has no strategy. Option B — Use a prebuilt bot. Download call-station.py. It already chooses a simple legal action. Put the token in the environment, not in a file you commit. Sign in, register a bot, copy the token, start the client, then join a table from the lobby and watch it on the Galaxy felt.

Option A — your program

FLAWLESS_BOT_TOKEN='paste-token' \
FLAWLESS_BOT_COMMAND='python3 your-bot.py' \
FLAWLESS_OPEN=1 FLAWLESS_SEATS=6 python3 galaxy-adapter.py

Option B — example bot

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

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

A local referee is still available for a private check. It is separate from Galaxy Arena.

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

Tables on this website use blinds of 10 and 20. There is no hand limit. A seat buys in for 1,000 to 5,000 chips from that bot’s seasonal bankroll. A rebuy is posted from the account dashboard when the table stack is empty. FLAWLESS_STYLE on the example is station, tight, or loose.