Pokurr is a local-first poker toolkit with three product pillars:
It is built on:
If you only remember one thing: this repo should be useful before you ever touch the research roadmap.
There are two supported ways to use the project:
Use this while developing inside the repo:
luca poker ...
Examples:
luca poker analyze equity AhKd QsQc
luca poker serve --port 3000 --seedLobby true
luca poker new-agent my-bot tag
Use this for the standalone CLI experience:
pokurr ...
Examples:
pokurr analyze equity AhKd QsQc
pokurr serve --port 3000 --seedLobby true
pokurr new-agent my-bot tag
The command surface is intended to be the same in both modes.
luca poker analyze equity AhKd QsQc --iterations 20000
luca poker analyze range "ATs+,AJo+" --vs "QQ+,AKs"
luca poker analyze hand AhQh --board Kh7d2h5h --potSize 42 --toCall 14
What this gives you:
For a fuller study workflow, see docs/offline-analysis.md.
luca poker serve --host 127.0.0.1 --port 3000 --seedLobby true
luca poker register http://127.0.0.1:3000 --name my-bot
luca poker join ws://127.0.0.1:3001 --token <token> --agent ./my-bot
luca poker watch ws://127.0.0.1:3002
What this gives you:
strategy.tsFor the canonical local walkthrough, see DEMO.md.
luca poker new-agent my-bot tag
cd my-bot
Edit:
strategy.tsEverything else is there to make that single file easier to reason about.
For the onboarding path, see docs/writing-a-bot.md.
Core commands:
luca poker analyze equity AhKd QsQc
luca poker analyze range "ATs+,AJo+" --vs "QQ+,AKs"
luca poker analyze hand AhQh --board Kh7d2h5h --potSize 42 --toCall 14
luca poker sim --situation docs/situations/turned-flush-draw.md --iterations 5000 --seed 42
This is for:
Core commands:
luca poker serve --host 127.0.0.1 --port 3000 --seedLobby true
luca poker register http://127.0.0.1:3000 --name my-bot
luca poker join ws://127.0.0.1:3001 --token <token> --agent ./my-bot
luca poker watch ws://127.0.0.1:3002
luca poker house status --server http://127.0.0.1:3000
This is for:
This is the long-term differentiator:
strategy.ts in readable codeThe research docs live here:
docs/regret-minimizer-plan.mddocs/planning/2026-03-28-regret-minimizer-roadmap.mdImportant: this pillar should sit on top of a polished offline-analysis and local-arena product, not replace them.
bunrustup, cargo)wasm-pack on your PATH@soederpop/luca CLI for source mode (npm i -g @soederpop/luca)curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup target add wasm32-unknown-unknown
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
sudo apt-get update && sudo apt-get install -y build-essential pkg-config libssl-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup target add wasm32-unknown-unknown
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
Verify:
rustc --version
wasm-pack --version
From the repo root:
bun install
bun run build:wasm
bun run test
bun run compile
./dist/pokurr analyze equity AhKd QsQc --iterations 5000
The compiled binary embeds the WASM path needed for standalone use.
Start here depending on your goal:
docs/offline-analysis.md — study workflows and reusable situationsdocs/writing-a-bot.md — scaffold, edit, run, debugDEMO.md — the canonical local demo/operator flowdocs/hosting-a-server.md — operator-focused persistent server notesdocs/strategy-globals-api.md — exhaustive VM global referencedocs/planning/ — roadmap and planning materialscommands/poker.ts — main CLI command surfacesrc/cli.ts — standalone binary entrypointservers/poker-server.ts — local server runtimehouse/actors/ — showcase house bot profilespackages/pokurr-core — TypeScript API and range/equity boundarypackages/pokurr-equity — Rust/WASM evaluatordocs/situations/ — reusable study spotstest/ — runtime and rules coverageBuild WASM artifacts:
bun run build:wasm
Run full tests:
bun run test
Run the Luca markdown demo:
bun run demo:js-api
Compile the binary:
bun run compile
Single benchmark:
bun run --cwd packages/pokurr-core benchmark
Full performance suite:
bun run --cwd packages/pokurr-core benchmark:suite
The suite reports:
Current baseline in this workspace after the table-driven evaluator work:
217x39x to 67x1900x+One constrained flop-board scenario can be faster in JS because of poker-tools short-circuit behavior. That is expected.
Consumer code should prefer @pokurr/core APIs such as equityEngine and Range.
Rust internals should remain behind @pokurr/equity.
When the local server is running, the main surfaces are:
//leaderboard/tournaments/spectator?tableId=<tableId>/spectator-debug?tableId=<tableId>/spectator-fixturesAlready solid:
Actively being hardened:
Next capstone: