Skip to content

Redesign the landing page around the real training run - #3

Merged
DevomB merged 3 commits into
mainfrom
site-redesign-watch-it-learn
Oct 23, 2026
Merged

DevomB merged 3 commits into
mainfrom
site-redesign-watch-it-learn

Conversation

@DevomB

@DevomB DevomB commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

Summary

A full redesign of the landing page, built around the real training run instead of marketing copy. It also brings the play-in-the-browser work to main: #2 merged into the v3 branch after that branch had already been merged, so those two commits never reached main. They're the first two commits here, unchanged.

What's on the page now

  • New look. Warm paper, ink and a vermilion accent instead of the generic dark purple template. Bricolage Grotesque, Instrument Serif and JetBrains Mono are self-hosted (OFL, licenses in web/fonts/). The wooden board is drawn on canvas, with shaded stones that drop into place and captures that fade out.
  • Hero. Replays Gofer's win over GNU Go level 10 with Gofer's own analysis of every position: candidate moves with their share of the search, a live win estimate, and whether GNU Go played the move Gofer expected.
  • 01 How it learns. The self-play → train → evaluate loop, with a self-play game running live, the policy loss falling from 4.41 to 2.39, and generation 16's results as win/loss tallies.
  • 02 Watch it learn. Scrub through all 18 networks with a slider, the chart or thumbnails. For each one you see a self-play game it played, its raw opening policy before any search (uniform at gen 0, structured by gen 17), its Elo with GNU Go and rollout anchors, and its match results, including the dips at gens 9 and 14. The section sweeps from gen 0 to gen 17 the first time it scrolls into view.
  • 03 Play. The WebAssembly engine, with Gofer's candidate moves drawn live on the board while it thinks. You can start a game from the board itself on phones.
  • 04 Under the hood. A spec sheet with measured numbers, replayed terminal sessions, and a quick start with a copy button.

Every number comes from the run: cmd/sitedata writes web/data/*.json from a run directory (make site-data RUN=…). The hero game is committed as docs/results/games/gnugo-l10-vs-gofer.sgf.

Engine fix: the page froze while Gofer thought

The in-browser search ran on the page's only thread and never yielded, so the page froze for the whole search: about 1 s at 400 visits and 4.5 s at 1600. No progress or candidates showed, and scrolling stopped. The search now yields every 16 visits, so the page runs at 24–28 fps while Gofer thinks, at a cost of about 16% search time. Because of that yield, "New game" or "Undo" could arrive mid-search, so a reset now cancels the running search instead of letting it play into the next game.

Housekeeping

  • Tailwind is removed (web/src/, tailwind.config.js). The page is plain HTML, CSS and JS, and make site only rebuilds the WebAssembly engine and copies the model.
  • CI now vets with the onnx build tag (covers cmd/sitedata) and checks that the site scripts and data parse.
  • New icons and social image. README and CHANGELOG updated.

Test plan

  • go test -short ./...; go vet ./..., -tags onnx, and GOOS=js GOARCH=wasm; gofmt; node --check
  • Headless Chromium play flow against the real engine, with onnxruntime-web 1.26.0 served from the pinned npm package:
    • starts from the board overlay
    • page stays responsive mid-search (progress and candidates update)
    • an occupied point is rejected
    • "New game" during a search starts clean and gets exactly one reply
    • undo works
    • White with Gofer opening works
    • passes end the game with a result
    • no page errors
  • Frame rate during search: 0 fps before this change, 24–28 fps after
  • Full-page screenshots at 1440 px and 390 px; no horizontal scroll at 320, 390, 768, 1024 or 1440 px; 25 s of the animated hero with no errors; reduced motion shows final states
  • Look at the Vercel preview on a real phone and desktop

Generated by Claude Code

The network rarely proposes pass (self-play only allows it at the end), so
after an opponent's pass the engine filled its own territory before passing.
GTP, the arena, terminal play and the browser engine now pass immediately
when the area count after both passes is a win (Search.PassWins).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JyK2tUFLPsLyWjy2h2erVw
- cmd/gofer-wasm: rules and search compiled to WebAssembly; the network runs
  in onnxruntime-web (web/engine.js, loaded on first play)
- Hero: play Gofer (live candidate moves and win-rate estimate) or watch a
  real win over GNU Go level 10, replacing the 19x19 human-game replay and
  the engine-less free-play board
- Elo-by-generation chart, regenerated social image from a real position
- Tailwind compiled at build time (make site) instead of the runtime play
  CDN; scripts moved to site.js/engine.js; HTML 85 KB -> 54 KB
- CI builds the WebAssembly engine

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JyK2tUFLPsLyWjy2h2erVw
A new visual identity (paper, ink and a vermilion seal; Bricolage
Grotesque, Instrument Serif and JetBrains Mono, self-hosted) with
hand-written CSS and no CSS build step. Everything on the page is
drawn from the training run:

- Hero: Gofer's own analysis of every position of a win over GNU Go
  level 10 (candidate moves, win estimate, whether GNU Go played the
  move Gofer expected), on a canvas board with animated stones.
- How it learns: the self-play / train / evaluate loop with a live
  self-play game, the policy loss by generation and gen 16's results.
- Watch it learn: scrub through all 18 networks - one self-play game
  each, the raw opening policy before search, and the Elo ladder with
  GNU Go and rollout anchors.
- Play: the WebAssembly engine, with live candidates on the board.
- Under the hood: spec sheet, replayed terminal sessions, quick start.

cmd/sitedata writes web/data/*.json from a run directory
(make site-data), so every number is reproducible.

The in-browser search now yields to the page every 16 visits. Before,
a search blocked the only thread for its whole duration (about 1 s at
400 visits, 4.5 s at 1600) and the page froze; now it renders at
24-28 fps while Gofer thinks. A new game or undo cancels a running
search instead of letting it play into the next game.

Tailwind is gone (web/src, tailwind.config.js); CI vets the onnx build
tag and checks the site scripts and data parse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JyK2tUFLPsLyWjy2h2erVw
@vercel

vercel Bot commented Oct 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
gofer Ready Ready Preview Oct 23, 2026 5:53pm UTC

@DevomB
DevomB merged commit c58d3ec into main Oct 23, 2026
9 checks passed

This branch was successfully deployed

1 active deployment
Preview — b6d40cf3 Deployed Oct 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants