Gameplay (legal moves, move application, pressure maps, PGN parsing) now runs entirely in the browser via a chess.js port of engine.py (static/engine.js + vendored chess.min.js). The app no longer calls the server during play, so it stays instant and works even when the backend is scaled to zero or offline. - engine.js: line-for-line port of engine.py; parity-verified identical output (pressure, FEN, status, SAN/UCI) across all 10 built-in games / 829 frames. - app.js: replace all /api fetches with local engine calls; graceful PGN parse errors; asset paths moved to root for static serving. - Save games to localStorage + load from the game dropdown; export any game as a .pgn file. Minimal additive UI in the existing export row. - games.json generated from games.py (scripts/export_games.py). - Production Dockerfile -> static-web-server (~9MB image, was ~150MB python). - make dev -> bun static server; add make games / make parity targets. - app.py kept as optional fallback (serves static app + /api routes). - parity/: automated JS-vs-python engine parity test. git diff stat: 16 files changed, 722 insertions(+), 128 deletions(-)
14 lines
407 B
Docker
14 lines
407 B
Docker
# Fully client-side app — production is just static files served by a tiny,
|
|
# fast-booting static-web-server (Rust). No Python in the runtime image.
|
|
FROM ghcr.io/static-web-server/static-web-server:2
|
|
|
|
COPY src/chess_pressure/static/ /public/
|
|
|
|
ENV SERVER_HOST=0.0.0.0 \
|
|
SERVER_PORT=8888 \
|
|
SERVER_ROOT=/public \
|
|
SERVER_FALLBACK_PAGE=/public/index.html \
|
|
SERVER_COMPRESSION=true
|
|
|
|
EXPOSE 8888
|