ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Explore 12,000+ chess openings with videos, studies, win rates, and practice tools. Find the perfect opening for your style.
EducationJavaScript · TypeScriptGitHub @FreddiekinnsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A chess learning platform for exploring and practising openings: 12,377 opening
positions in 31 families, with AI-written strategic content, win rates from
Lichess, curated YouTube videos and Lichess studies, and a move trainer.Read the full README ↗Live at openingbook.xyz
A chess learning platform for exploring and practising openings: 12,377 opening positions in 31 families, with AI-written strategic content, win rates from Lichess, curated YouTube videos and Lichess studies, and a move trainer.
Discover (the landing page)
Opening pages
Analyse (your own games)
npm install # all workspace dependencies, and the git hooks
npm run dev # API on 3010 + frontend on 3000
Requires Node.js 22 or newer (CI runs Node 24). The opening data is committed in
api/data/, so no download step is needed, and no environment variables are
needed to run the app locally. They are only required for the data pipelines and
live Lichess stats.
Create a .env in the repo root. Every variable is optional; each unlocks a
specific feature.
| Variable | Needed for |
|---|---|
LICHESS_EXPLORER_TOKEN | Live win rates via the /api/explorer proxy |
YOUTUBE_API_KEY | Video pipeline (full mode and metadata enrichment) |
JEV_API_KEY | Video pipeline's relevance filter (see below) |
GOOGLE_AI_API_KEY | LLM enrichment via Gemini |
GOOGLE_APPLICATION_CREDENTIALS_JSON | Vertex AI service-account credentials |
VERTEX_AI_PROJECT_ID | Vertex AI project |
VERTEX_AI_LOCATION | Vertex AI region |
LICHESS_EXPLORER_TOKEN is a zero-scope Lichess personal access token. Lichess
has required authentication on the opening explorer since March 2026; without
the token the proxy returns 503 and the win-rate panel falls back to snapshot
statistics. It must also be set in the Vercel project environment for
production.
JEV_API_KEY comes from console.typesafe.ai. Without it the video pipeline
still applies cached answers but leaves new videos unfiltered.
chess-opening-explorer/
├── packages/
│ ├── api/ # Express API: business logic, source of truth
│ ├── web/ # React 19 + TypeScript frontend (Vite)
│ └── shared/ # Shared utilities and types
├── api/ # Vercel serverless wrappers (thin, import packages/api)
├── api/data/ # Canonical generated data consumed by the API
├── middleware.ts # Vercel edge middleware: pre-renders opening pages
├── config/ # Pipeline configuration (channels, matcher, pins)
├── data/ # Source data, including the opening families
├── design-system/ # Warm Editorial Dark reference bundle
├── docs/ # Proposals, reviews, backlog
├── scripts/ # Build, SEO, audit and data-maintenance scripts
├── tools/
│ ├── analysis/ # Python: Lichess popularity pipeline
│ ├── course-discovery/ # Node: Lichess study import pipeline
│ ├── family-taxonomy/ # Node: assigns every position to a family
│ ├── llm-enrichment/ # Node: AI content generation
│ ├── sample-reports/ # Node: the Analyse page's sample reports
│ └── video-pipeline/ # Node: YouTube video discovery and matching
├── tests/ # Backend tests (Jest) + Playwright e2e
└── .github/memory-bank/ # Project context and current state
npm run test:all # backend + frontend: the check that matters
npm run test:backend # Jest
npm run test:frontend # Vitest
npm run test:e2e # Playwright end-to-end
npm run test:coverage # backend coverage
npm run build # type errors surface here, not in the test suites
Jest collects from tests/** and tools/**/tests/**. packages/*/tests/ is in
testPathIgnorePatterns, so a Jest test placed inside a package silently never
runs. Put backend tests in the root tests/ directory. Frontend tests live
beside their components in packages/web/src/**/__tests__/.
Coverage reports: coverage/lcov-report/index.html (backend),
packages/web/coverage/index.html (frontend).
Husky installs these on npm install:
packages/ and blocks the commit on errorsEach pipeline has a detailed README in its directory.
npm run pipeline # incremental: RSS discovery, free, the default
npm run pipeline:full # full catalogue rebuild via the YouTube API
npm run pipeline:rematch # re-score existing videos, zero API cost
Every mode ends with two steps. First it drops videos that the Jev model
confidently says are not about the page they matched. Then it adds the
hand-verified videos in config/video_pins.json. Run
node tools/video-pipeline/scripts/backfill-views.js before a rematch, or view
counts and thumbnails go stale. Verify any scorer change with
node scripts/audit-video-matches.js.
npm run course:discover # find popular Lichess studies (500+ likes)
npm run course:import # fetch studies into the cache, rebuild courses.json
npm run course:rematch # rebuild from the cache only: offline, seconds
courses.json is a full rebuild each run; never hand-edit it. Verify with
node scripts/audit-study-matches.js.
npm run enrich
Generates strategic descriptions with Gemini 2.5 Pro on Vertex AI. Supports batch processing, dry runs, and resumable runs.
python tools/analysis/run_pipeline.py --incremental
Downloads monthly Lichess rated-game dumps and aggregates opening statistics. Needs substantial free disk: a busy month can approach 50 GB.
node tools/family-taxonomy/build-family-index.js
Re-resolves every position's family from data/family-overrides.json and
rewrites the ECO files. Run it after changing a family or a rule, and read
tools/family-taxonomy/README.md first: a family also decides which videos a
page shows when it has none of its own.
Unified codebase. Development and production run identical business logic.
The Vercel functions in api/ are thin wrappers that import from
packages/api.
Pre-processed data. Pipelines generate JSON into api/data/, which is the
canonical data location in every environment. Search is served from the API, not
by shipping the dataset to the client.
Opening pages are pre-rendered at the edge. middleware.ts puts each
opening's title, description, win rates and internal links into the HTML before
React loads, so crawlers see the content without running JavaScript. Sitemaps
and the lookup shards it reads are generated at build time
(npm run build:vercel).
Edge caching is load-bearing. Crawlers index 12,000+ pages, so every route
declares a Cache-Control policy. Most are in vercel.json; /api/explorer
sets per-band TTLs in the route itself.
Analytics. Page views come from Vercel Web Analytics; product events go to PostHog (EU), from the production host only.
Warm Editorial Dark design system. CSS Modules for component styles, with
design tokens for surfaces, typography, data-viz and accents. Production imports
the tokens from packages/web/src/styles/simplified.css; design-system/ is
the reference bundle, and the two are kept in sync.
CLAUDE.md; scoped rules live in packages/*/AGENTS.md, and the deeper
subsystems have skills in .claude/skills/.Data: 12,377 openings in 31 families; 1,452 videos across 68% of positions; 17,079 study chapters from 444 studies across 4,500 positions.
See LICENSE.