ChessViewer is a browser-based chess diagram editor. Set up any position, choose how the board looks, and export a sharp image at the resolution you need — for print, a blog post, or a video thumbnail. No installation, no account required.
chessvision.org · Report a bug · Request a feature
Requirements: Node.js 22 or later, pnpm 10 or later.
git clone https://github.com/chessviewer-org/chess-viewer.git
cd chess-viewer
pnpm install
pnpm devOpen http://localhost:3000.
pnpm build # production build → dist/
pnpm validate # typecheck, lint, format check, tests# Production
docker compose up --build -d web # http://localhost:3000
# Development with HMR
docker compose --profile dev up --build dev # http://localhost:5173- Board editor — drag pieces onto any square, flip the board, toggle coordinates and border frame
- FEN input — paste any FEN string with real-time validation; batch input supports up to 10 positions at once
- Export — PNG, JPEG, or SVG at four quality presets (300–1200 DPI); batch export downloads a ZIP; DPI metadata is embedded in the file
- Board customisation — 20 piece sets, 20 preset themes, custom colour picker, up to 48 saved presets
- Position history — saved locally with favourites, pinning, freshness indicators, and full-text search
- Database search — look up positions directly from Lichess, PDB, and YACPDB
- Optional account — sign in to sync your history and settings across devices via Supabase; data is encrypted at rest and owner-scoped by row-level security
See CONTRIBUTING.md for the full guide. The short version:
git checkout -b fix/your-fix
pnpm validate
git commit -m "fix: brief description"
git push origin fix/your-fix
# open a pull request against masterEvery PR must reference an open issue (Closes #N) and pass CI before it can be merged.
Board rendering and export run entirely client-side — positions never leave your device. There are no analytics or tracking cookies.
Optional cloud sync stores data in Supabase with row-level security: only the authenticated user can read or write their own rows.
To report a vulnerability, see SECURITY.md.
Preact 10, TypeScript 6, Vite 8, Tailwind CSS 4, wouter, fflate, vite-plugin-pwa.
Supabase is used for auth and cloud sync via a custom hand-written client (src/auth/Supabase.ts) — the @supabase/supabase-js SDK is not installed. Icons are Lucide SVG paths embedded directly in src/assets/icons/ (ISC License) — lucide-react is not installed. Page transition animations are CSS-based — framer-motion is not installed.
AGPL-3.0. © 2026 Khatai Huseynzada.
