- TypeScript 67.4%
- HTML 18.5%
- CSS 14.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
New users found it confusing and distracting. It's still available as an opt-in toggle via the Quiz chip for advanced users. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
| public | ||
| src | ||
| .gitignore | ||
| index.html | ||
| mockup.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
| wrangler.jsonc | ||
SansBoard
A single-user blindfold chess trainer. You play against a built-in engine, but the board only shows you the current position at configurable checkpoints ("blind windows") — for the moves in between, you're playing from memory.
Live at sansboard.com.
How it works
- Choose a blind window length (in half-moves) — an odd number so the window alternates between opening on your move and the engine's.
- While a window is open, the board stays frozen at the last synced position. If the window opened on the engine's move, you get that move in notation only (never reflected on the board) before you reply.
- When the window closes, you're asked to reconstruct the current position from memory (drag/click pieces into place, or replay the moves by typing or speaking them) before the real position is revealed.
- Moves can be entered by keyboard (lenient SAN — case-insensitive,
0-0works for castling) or by voice, hands-free.
Everything else — Elo, flash duration, hard mode (strip extra info from
notation), text-to-speech, the reconstruction quiz, move-list visibility — is
configurable from the sidebar and persisted to localStorage.
Enjoying it? There's a quiet Ko-fi link at the top of the page.
Stack
Vanilla TypeScript + Vite. No UI framework — the board is hand-rolled CSS grid + absolutely positioned piece elements, animated with CSS transforms.
- chess.js for rules/SAN/FEN
- Stockfish 18 (WASM, lite single-threaded build) running in Web Workers via UCI — one instance plays as the (strength-limited) opponent, a second runs at full strength in the background to score your moves by centipawn loss
- Web Speech API for text-to-speech and continuous, hands-free speech
recognition, with a natural-language parser (
src/voice.ts) that biases garbled transcripts toward chess sounds ("before" → b4, "tonight" → knight) — but never toward legal moves, so a clearly-uttered illegal move is rejected and logged rather than reinterpreted as something else
Development
npm install
npm run dev
Build and typecheck:
npm run build
Deploy
Deployed as a Cloudflare Worker (static assets), via Wrangler:
npm run build
npx wrangler deploy
See wrangler.jsonc for the custom domain / routes configuration.