a disguise for your Switch
Autonomous Pokemon Champions play (Reg M-A VGC).
Computer vision + ML inference + Switch automation, all running on a real console behind a capture card.
Active runs
loading…
Spectator pulse
loading…
Recent evals
loading…
Champions Spectator
Live Pokemon Showdown battle collection for VGC model training
Battle Coverage
Checking...
Collection Rate
Replays per Hour (last 48h)
Cumulative Collection
Full Dataset
VGC Ratings — Downloaded vs Spectated
BSS Ratings — Downloaded vs Spectated
Spectated Ratings (last 7 days)
VGC 2026
BSS
Sync to ColePC
Replay Sync
Checking...
Recent Saves
Loading...
OCR Test Gallery
Browse test images and ground-truth labels by reader
Select a reader from the sidebar
Frame Labeler
Label screenshots for the C++ test suite
100%
Box Coordinates
Click and drag to select. Right-click to clear.
Retest (local Mac)
Requires
python3 tools/mac_dev_runner.py running locally.
Detector Overlays
A toggle overlays · R reset zoom · ←→ prev/next image
Models
Live training + run comparison · runs from
data/checkpoints/*.jsonl on unraid + live sessionsMetric vs. epoch
/
cat:A
cat:W
cat:L
age<7d
running
starred
sort:
recent ▼
best
name
11 ≫ 8 shown · 2 ✓
| C | RUN ▼ | EP | VAL_LOSS | FULL_A | TREND | ETA | HOST | ||
|---|---|---|---|---|---|---|---|---|---|
| ✓ | A | combo_full_d384_l12_v9_metaon_masked | 14/24 | 0.4231 | 0.7044 | 1h42 | colepc | ||
| ✓ | W | winrate_d256_l8_v4_teamemb | 07/18 | 0.5891 | — | 3h11 | unraid | ||
| · | A | combo_full_d384_l12_v8_baseline ★ | 24/24 | 0.4502 | 0.6611 | done | colepc | ||
| · | A | combo_full_d384_l12_v7_nomask | 24/24 | 0.4677 | 0.6498 | done | unraid | ||
| · | A | combo_full_d512_l16_v1_widescale | 09/30 | 0.7104 ▲ | 0.4811 | diverging | vast-rtx4090 | ||
| · | L | lead_advisor_d192_l6_v3_oppfeats | 20/20 | 0.3120 | — | done | unraid | ||
| · | W | winrate_d256_l8_v3_legacy | 12/12 | 0.6021 | — | stale 12d | unraid | ||
| · | A | combo_full_d256_l8_v6_smallproto | 18/18 | 0.5108 | 0.5934 | done | colepc | ||
| · | L | lead_advisor_d192_l6_v2_baseline | 20/20 | 0.3344 | — | done | unraid | ||
| · | A | combo_full_d384_l12_v5_oldfeatures | 24/24 | 0.4912 | 0.6212 | done | unraid | ||
| · | W | winrate_d128_l4_v1_proto | 10/10 | 0.6812 | — | done | colepc |
A
combo_full_d384_l12_v9_metaon_masked
14/24 epoch · started 5h12m ago · colepc:8422
● running
loss[1]
accuracy[2]
calibration[3]
full_a[4]
x: epoch·samples·wall y-log off
v9_metaon_masked 0.4231
v8_baseline 0.4502
v7_nomask 0.4677
v1_widescale 0.7104▲
0.40
0.55
0.70
epoch →
focus · stats
- val_loss
- 0.4231 (best so far)
- full_a
- 0.7044
- switch_a
- 0.681
- move_a
- 0.722
- tera_a
- 0.554
- throughput
- 1.42M tok/s
- vram
- 9.8 / 10.0 GB
- next epoch
- ~7m18s
- finish ETA
- today 21:44
- delta vs v8
- −0.0271 loss · +0.043 full_a
diff · v9_metaon_masked vs v8_baseline
+ feature_table_meta_on: true (v8: false)
+ action_mask_legality: true (v8: false — see feedback_action_mask_no_op)
+ batch_size: 384 (v8: 256)
- dropout_attn: 0.05 (v8: 0.10)
d_model: 384 · n_layers: 12 · lr: 3e-4 · warmup: 2k (unchanged)
tail · trainer.log
17:42:08 epoch 14 done · val_loss 0.4231 (-0.0089) · full_a 0.7044 (+0.0061)
17:42:09 ckpt → r2://champ-model-shards/v9_metaon_masked/ep14.pt
17:42:09 ★ new best on val_loss
17:35:51 step 38400 · loss 0.418 · lr 2.93e-4 · gpu 96%
17:28:33 step 36800 · loss 0.422 · lr 2.94e-4 · gpu 96%
17:21:14 step 35200 · loss 0.430 · lr 2.95e-4 · gpu 95%
j/k nav
x select
d diff (2)
g graph
t tail log
e eval
r refresh
★ star
K kill run
/ filter
: command
? help
: _
combo_full_d384_l12_v9_metaon_masked
colepc · 3080
0.7041
▲ +0.0042
full_a · ep 28
val_loss
1.382
▼ -0.011 vs ep27
best @
ep 28
new low this run
val_loss · last 28 eptrending ▼
epoch 28 / 6046.7%
next epoch 2:14
ckpt 12:48
ETA done 3h 22m
winrate_d256_l8_seed7
unraid · 4060
0.6932
▬ +0.0001
val_acc · ep 41
val_loss
0.6418
flat 4 ep
grad norm
0.018
▼ collapsing
val_loss · last 41 epPLATEAU
epoch 41 / 8051.3%
next epoch 3:52
ckpt 9:11
ETA done 5h 04m
lead_advisor_d192_l6_aug2
colepc · 3080 (shared)
1.084
▼ +0.031
val_loss · ep 14
train_loss
0.412
▼ still falling
overfit gap
+0.672
▲ widening
val_loss · last 14 epDIVERGING ▲
epoch 14 / 5028.0%
next epoch 1:48
ckpt 8:24
ETA done 7h 48m
Rig Telemetry LIVE
Waiting for first heartbeat…
Historical Compare ARCHIVE
- ■ v9_metaon_masked (LIVE)0.7041now
- ■ combo_full_v80.66123d
- ■ combo_full_v8_seed110.65895d
- ■ combo_full_v70.643111d
- combo_full_v6_pretrain0.620119d
- combo_full_v5_legacy_mask0.604327d
- combo_full_v4_d2560.582142d
Alerts & Anomalies 2
14:31
⚠
winrate_d256_l8_seed7: val_loss flat (Δ<0.001) for 4 epochs. Consider LR drop or early stop.
14:28
⚠
lead_advisor_d192_l6_aug2: overfit gap +0.672, val_loss rising 6 ep straight. DIVERGENCE.
14:14
⚠
colepc GPU sustained 97% · VRAM 88%. Headroom thin for queued lead_v3.
13:59
●
v9_metaon_masked ep 27 ckpt uploaded to R2 (champ-model-shards) · 412 MB.
13:42
●
Heartbeat ok: hub 9875 · unraid 8422 · colepc 8422.
13:11
●
Queue: combo_full_d384_l12_v10_aug, lead_advisor_d192_l6_v3 · awaiting slot.
★ Hall of Champions
The reigning best of
combo_full_d384_l12_* — and the challengers nipping at their heels. Updated live from data/checkpoints.
Action
Move-and-switch accuracy
primary · val_full_a_acc ↑combo_full_d384_l12_v9_metaon_masked
Trained May 12 on colepc · peaked at epoch 38 / 80 · still cooking. First run to clear 0.70;
meta-on conditioning was the unlock.
v6 .612
→
v7 +.021
→
v8 +.027
→
v9 +.040
val_full_a_acc
.704↑
+.044 vs v8 · still training
2
combo_full_d384_l12_v8
prod model · trained Apr 28 · peaked ep54
16d ago
.660
−.044
3
combo_full_d384_l12_v7
first crack at 0.65 · trained Apr 09
35d ago
.633
−.071
4
combo_full_d384_l12_v8_legacymask
ablation: re-enabled mask_actions, regressed
11d ago
.621
−.083
5
combo_full_d384_l12_v6
d384 baseline · trained Mar 22
53d ago
.612
−.092
6
combo_d256_l8_v3
smaller backbone · pre-d384 era
81d ago
.589
−.115
▾ 14 also-rans below .58 · click to expand
Winrate
Outcome predictor (AUC)
primary · val_auc ↑winrate_d256_l6_v4_metaon
Trained May 5 on unraid · 60 epochs, peaked at ep51. The meta-on conditioning that helped Action carried over —
+0.018 AUC over v3, the biggest jump in the lineage.
v1 .812
→
v2 +.009
→
v3 +.011
→
v4 +.018
val_auc
.850
+.018 vs v3 · finished
2
winrate_d256_l6_v3
previous prod · sat for ~6 weeks
42d ago
.832
−.018
3
winrate_d384_l8_v1_wide
went wider not deeper · marginal gain, 2× cost
19d ago
.828
−.022
4
winrate_d256_l6_v2
trained Mar 18
57d ago
.821
−.029
5
winrate_d256_l6_v1
first checkpoint of the family
88d ago
.812
−.038
▾ 8 also-rans below .80 · click to expand
Lead
Lead-pick top-1
primary · lead_top1 ↑lead_d192_l4_v5_teamembed
Trained May 9 on colepc · 40 epochs, peaked at ep28. Team-embedding rewrite was the unlock — every prior
run plateaued at ~0.46.
v2 .421
→
v3 +.018
→
v4 +.022
→
v5 +.029
→
v6 running
lead_top1
.490
+.029 vs v4 · finished
2
lead_d192_l4_v4
last run before team-embed rewrite
22d ago
.461
−.029
3
lead_d192_l4_v3
added move-pool features
38d ago
.439
−.051
4
lead_d192_l4_v2
trained Mar 30
45d ago
.421
−.069
5
lead_d128_l4_v1
smaller, original baseline
71d ago
.397
−.093
▾ 6 also-rans below .39 · click to expand
Challenger compare
2
combo_full_d384_l12_v8_legacymask
×
lead_d192_l4_v3
×
Recognition Results
Species, moves, and HP reading results from the last regression run
Team Preview Examples
Labeled team-preview frames with the cropped opp sprites + matched atlas references. Selecting screen also shows My-side text-OCR crops.
Loading...
Digit Templates
HP% digit templates (0-9) used for template-matching OCR
Sprite Recognition
Opponent species in Team Preview are matched against the 272-sprite reference atlas via cropped RMSD.
BattleHUD own-species icons (action_menu)
Boxes
own_specoes_icon_0/1 from tools/box_definitions.json. Each row shows the cropped icon, the ground-truth species, and the top-5 atlas matches with their alpha. Lower alpha = closer match.Loading...
Pokeball Alive Detector
Per-frame run of
PokeballAliveDetector across action_menu, move_select, battle_log. Each row shows the frame and 12 state indicators (own 0..5, opp 0..5). Green = alive, grey = fainted, dot = empty.
Loading...
PP Crops Gallery
4 PP crops + the BattleHUDReader's
move_pp_current read for every move_select test image.
Use this to spot crop-box drift. Red = -1 (no read); cyan = a read happened.
Open any image in the Inspector via the link below the row to nudge the boxes.
Loading...
HP Crops Gallery
Opponent HP% (slot 0/1) + own HP "current/max" (slot 0/1) crops + BattleHUDReader reads,
across action_menu and move_select frames. Red = -1 (no read); cyan = read happened.
If a frame should clearly show HP but reads -1, the box is mis-tuned. Open in inspector to nudge.
Loading...
Target Select Crops Gallery
Per frame: 2 own move-name cells + 4 target cells (opp 0/1, own 0/1).
Each target cell shows the is_targeted color strip + the effectiveness crop +
raw OCR text + the classified enum. Mismatches between raw and classified
usually mean the classifier needs another keyword or a fuzzy fallback.
Loading...
HUD Pill Atlas
Species → averaged HUD-pill render, bootstrapped from manifest-labeled BattleHUDReader frames.
Used as the in-domain reference for sprite-matching on the small HUD pills (where the canonical
Bulbapedia atlas hits ~22% top-1; this approach is ~95% with one ref/species).
Re-run the build to grow the atlas after labeling new frames.
Loading...
Team Scan Verify
Runs
TeamSummaryReader on the latest Moves & More screenshot
and TeamStatsReader on the latest Stats screenshot, merges per-slot,
and renders the assembled team as a Pokemon Showdown paste.
Swap-pair via the file pickers if needed.
Moves & More
Stats
Assembled team (Showdown paste)
Saved Team Library
Each entry is one unique team composition (the same 6 species in any order maps to one file).
Loaded automatically by LiveDetectorTrace when the team-preview-selecting screen reveals all 6 species.
Team Preview Locked-In: own slot investigation
6 own-side icon slots (top-to-bottom
own_slot_0...own_slot_5).
Each crop sprite-matched against the HUD pill atlas. Use this to validate the boxes
and decide the lead-order mapping before promoting to a real reader.
Screenshot
Team Preview Selecting: cursor reader
6 highlight strips on the left edge of each own card. Per-slot
(R+G)/2 - B "yellowness" score; floor 30. Highest-scoring slot wins.
The selected slot pill shows what TeamPreviewCursorReader::read returns.
Screenshot
Team Preview Selecting: lead-mark digits
6 digit-badge crops (top-to-bottom
digit_0...digit_5).
Same OCR pipeline as TP Locked-In:
raw → binarize → yellow_paint → yellow_filled → yellow_inner → Tesseract.
The "→ lead" column is the final '1'..'4' (or empty for unmarked) used by the auto-press lead-pick state machine.
Screenshot
Lead Test
Pick 6 mons per side. The hybrid Lead Advisor (lookup → model fallback)
recommends which 4 each side should bring + their top lead pairs.
Blue Team
vs
Red Team
Lead Fixtures
Per-champion fixture-eval rollups against the top-N popular
team-preview states. Two scalars are inlined into each
<stem>.card.md; the full per-fixture detail lives
in <stem>.fixtures.md next to the .pt.
Rule summary
Fixtures
Per-Mon Competence
Per-species action-model accuracy from
scripts/per_mon_competence.py. Slot-A piloting only.
High full_acc = the bot reliably nails this mon's actions on the
eval slice — safer to let it pilot.
Loading…
Meta Stats OCR Smoke Test
Phase-1a Python pipeline against
champions_meta_stats/.
Run all frames or click one for per-cell detail.
force:
Click a frame on the left to see OCR breakdown.
Meta Stats
Loading…
Meta Stats Header-OCR Failures
Per-mon detail pages where Tesseract returned empty/garbage for the species name after all retries.
Auto-dumped from
scrape_one_species when out.species.empty().
Meta Stats — EV Cell Debug
Per-cell crops of every
ROW_EV[] box (5 ranks × 6 stats)
— exactly what sanitize_ev → robust_read_int sees before
OCR. CSV scrape (2026-05-28): rank-2 90% bad · rank-5 17% bad ·
HP/Atk/SpA fail 3-8× more than Def/SpD. Top spread repeats 37× across
unrelated mons, so crops are likely sampling the wrong glyphs.
Full screenshot with crop-box overlay
Meta Stats — EV Digit Templates
Per-digit OCR templates emitted by
MetaStatsScraper
for values 0–32. Visually verify the image matches its filename —
a mislabeled template corrupts downstream OCR. normal/
= white/purple bg (non-cursor rows). highlighted/ =
yellow bg (cursor row, usually rank 1).
Loading…
normal/
highlighted/
Meta Stats — Ability Templates
Cursored + uncursored name-pill crops captured by
MetaStatsScraper when
CAPTURE_ABILITY_TEMPLATES is on. The slug folder is the
scraper's best guess at capture time — eyeball each bucket and
move any visually-wrong crop to the right slug. Atlas builders
read straight from {state}/{slug}/, so this UI is
the ground-truth gate.
Loading…
— pick a slug —
Comp Title OCR
Inspect the
comp_title_line1 + comp_title_line2 crops on
every screenshot in devtools/test_images/champions_comp_leaderboard/
and the OCR result through the C++ dev-runner (same Tesseract the scraper uses).
Crops update automatically whenever you re-draw the boxes in the Inspector.
EV Scroll-State Labels
Tag each frame as scrolled or unscrolled. The
labels feed an analysis endpoint that picks the R-channel
threshold for the in-game scroll detector. Keys:
S = scrolled · U = unscrolled ·
X = clear · ←/→ = prev/next ·
N = next unlabeled.
Loading…
EV Fail Triage
Every recent sum-mismatch dump in one view. Per cell: the source
color crop, the binarized version template-match actually compares,
the waterfill / template-match decision trace, and (when available)
the matched template alongside for direct visual diff. Toggle
EV-fail verbose trace on in the scraper to populate the
trace lines on new failures.
Loading…
2v2 Matchups
Common on-field 2v2s from the parsed replay corpus, scored by the
winrate model per (move_a, move_b) call. Pick a matchup on the left
to see the move grid. Source:
data/matchup_move_scores.json
loading…
Select a matchup on the left.
2v2 Pattern Wall
loading…
Meta Constellation
drag mons · click for ego-net · click edge for grid
Move Index
Click a move to drill in. Sort by clicking column headers.
| Move | Matchups | Cells | Avg Win% | Lift | σ | Histogram | Best Partner |
|---|---|---|---|---|---|---|---|
| loading… | |||||||
Select a move on the left for its full matchup record.