The idea
A chess app that does more than serve puzzles: it learns from you and brings things back for review at the right moment. Two pieces make that possible: FSRS spaced repetition and a native Stockfish engine.
FSRS
The Move Trainer treats every opening move or tactical pattern as a "card" (modern Anki style): its next review date is recomputed from how easily you recalled it. The algorithm lives in a dedicated packages/chess package, decoupled from the UI, so it can be tested without launching the app.
Stockfish, natively
No WebView: the engine runs natively through an Expo Dev Client (expo prebuild). In development a mock engine takes over until the native module is built (the extra.useNativeEngine flag) — the UI can be written without reaching for Xcode every time.
Data
- chess.com PubAPI — stats and games, no OAuth
- Lichess API — OAuth2, with the Opening Explorer proxied through the API so tokens never reach the mobile client
- Lichess puzzle database (CC0 licence) — a subset imported server-side
Architecture
A hexagonal NestJS backend (Domain / Application / Infrastructure / Presentation), with the domain described once through shared Zod schemas (packages/types). Path-filtered GitHub Actions CI: one workflow per app.
Stack
React Native · Expo · NestJS · FSRS · Stockfish · Turborepo · TypeScript
Full write-up: FSRS spaced repetition + native Stockfish in React Native.