This is the safest way to demo the Pokemon Showdown copilot live. Use a private or unrated battle. Do not present it as ranked-ladder automation; the project is a human-in-the-loop AI systems demo.
From showdown-stack:
scripts/start-demo-stack.shThe launcher starts:
| Service | Port | Purpose |
|---|---|---|
metamon-sidecar |
7273 | Kakuna/Metamon neural policy prior |
Rust poke-engine server |
7270 | MCTS/PUCT search |
showdown_copilot.proxy |
7271 | belief tracking, PIMC, annotations, explanations |
| WXT extension dev server | 3000 | Chrome extension build/reload |
The engine flags are the important part:
--nn-eval --nn-url http://localhost:7273
--heuristic-prior-mix 0.25 --forced-playouts-c 2.0
--heuristic-prior-mix-side2 0.5 --forced-playouts-c-side2 2.0The proxy runs with:
POKE_PROXY_PIMC_K=4Logs are written to /tmp/showdown-copilot-demo/.
- Open
chrome://extensions. - Enable Developer Mode.
- Click Load unpacked.
- Select:
showdown-stack/extension/.output/chrome-mv3-dev
- Open
https://play.pokemonshowdown.com/.
The extension injects a floating Copilot panel into active battles. It talks
only to the local proxy at http://localhost:7271.
curl -s http://127.0.0.1:7273/healthz | jq
curl -s http://127.0.0.1:7270/status | jq
curl -s http://127.0.0.1:7271/healthz | jqOptional full-stack smoke test:
curl -sS -N \
-H 'Content-Type: application/json' \
--data-binary @<(jq '. + {
timeLimitMs: 1000,
updateIntervalMs: 250,
battleId: "demo-proxy-pimc",
turn: 5,
_planH: {battleId: "demo-proxy-pimc", turn: 5, format: "gen9nationaldex"}
}' engine/tests/fixtures/iron_crown_t5.json) \
http://127.0.0.1:7271/analyze/streamExpected: one streamed JSON response with bestMove, pv, alternatives,
and pimcBreakdown.
Keep the video short: 60-90 seconds.
- Show the architecture README or a diagram for 5 seconds.
- Show health checks for the three local services.
- Show Chrome with the extension loaded.
- Open a private/unrated Showdown battle.
- Pause on one decision turn and show:
- recommended move
- principal variation
- alternatives
- PIMC hypothesis breakdown
- threat/conflict panels if they appear
- Show a terminal tail of
/tmp/showdown-copilot-demo/engine.logwith[ENGINE-INSTRUMENT]fields likepolicy_entropy,s2_heuristic_pick_dmg, andforced_playouts_triggered_s2.
Do not show .env, API keys, browser passwords, or personal battle notes.
This is a live Pokemon Showdown copilot. The TypeScript extension reads the current battle state and streams it to a Python proxy. The proxy maintains hidden-information beliefs and fans out multiple opponent hypotheses. A Rust engine runs MCTS/PUCT, using a Metamon/Kakuna neural policy as a root prior, then blends in deterministic heuristics and forced playouts so the model cannot over-dominate the search. The important lesson was not that the model is always right; it was building the system around it: fallbacks, telemetry, postmortems, annotations, and human review.
Do not publish the whole pokemon-ai workspace as-is. It contains local
experiments, cloned servers, generated caches, postmortems, and private notes.
Public-safe material:
showdown-stack/src/showdown_copilot/showdown-stack/extension/- your modified
showdown-stack/engine/fork showdown-stack/sidecar/sidecar/- focused tests and fixtures that do not contain private usernames/notes
- this runbook and the README
Keep private or scrub first:
.env.venv/,node_modules/,target/,.output/, cache foldersworkspace/analysis/battle-postmortems/workspace/analysis/play-notes/workspace/analysis/engine-replay/- local Pokemon Showdown server clones
- any API keys, usernames, auth cookies, or personal notes
Good public repo shape:
pokemon-showdown-copilot/
README.md
docs/DEMO.md
extension/
proxy/
engine/
sidecar/
tests/
For the video, upload demo.mp4 to the GitHub release, a README asset, or a
LinkedIn/YouTube unlisted link. Keep the README focused on architecture,
tradeoffs, and what you learned.