Play the engine
Every move below comes from legalActions() in src/engine/actions.ts. Nothing here re-implements a rule. Cards the engine cannot fully execute are badged, and every skipped ability is written to the log.
Never played before?
Two ways in, and they are the same game either way. Nothing below changes a rule, hides an option or plays a card for you — the coach only explains what the board is already offering, and names the Comprehensive Rules clause it comes from.
The guided game walks eight goals — keep a hand, reach your DON!!, play a Character, push power, attack, end a turn, then defend an attack and take a hit — each ticked off when the game can be seen to have reached it, whatever cards you drew. The last two need your opponent to attack you, so they are skipped rather than waited on. No step can ever stop you doing something else first.
Play a friend
Host a table and send the code. Your friend needs to be able to reach this server — it listens on 127.0.0.1 and stays there, so put a proxy in front rather than widening it: tailscale serve --bg --https 10004 http://127.0.0.1:8787. That is tailnet-only. Never funnel.
Benchmark — can it actually beat you?
A fixed, seeded sequence of mirror games: one decklist on both seats, so deck strength is not a variable and only play is. You take seat 0 and seat 1 alternately, because the first player skips a draw and a DON!! (CR 6-3-1 / 6-4-1). Each result is recorded as it finishes — closing this tab cannot lose one. Undos are recorded too, and games with an undo are excluded from the record.
Waiting for your friend
Send them this code. They open this page and put it in "Join a code".
A watch link shows the PUBLIC table — both boards, both trashes, hand and life as counts. No hand contents, for either seat. Anyone who can reach this server can use it, so close the doors from the board if you would rather play unobserved.