GoDraughts
A complete platform for international draughts (10×10): a Flutter app, a .NET backend, realtime multiplayer and a self-built AI engine — designed, built and operated in production by one person.

Context
GoDraughts is a production platform for international draughts: official FMJD rules, AI opponents at four levels, online multiplayer, ratings, clubs, puzzles and a learning path — in one app, live on iOS, Android and web.
Constraint
One person, responsible for product, architecture, backend, mobile app, infrastructure and production operations. That forces decisions: no technology that adds operational load without a clear payoff.
Decisions
- A shared game engine in pure Dart (zero runtime dependencies), so the client and analysis tooling use the same rules implementation — no drift between client and server.
- .NET 10 Minimal API with clean architecture: a dependency-free domain layer, EF Core 10 on PostgreSQL 17, SignalR for realtime multiplayer and spectating.
- A self-built Expert AI: alpha-beta search with iterative deepening, Principal Variation Search, late move reductions, null-move pruning, quiescence search and Lazy SMP (parallel search), over a Zobrist-hashed transposition table, with an opening book and custom endgame tablebases (3- and 4-piece bitbases).
- A Glicko-2 rating system shared by client and server, with leaderboards and clubs.
- An offline coach with spaced repetition: every game (including offline games against the AI) is analysed, and mistakes return for review across five mastery levels.
What it costs to run
Self-hosted on a VPS via CapRover, with PostgreSQL, automated CI/CD, and quality guarded by over 4,800 automated tests across domain, application and API layers. AI strength is guarded by automated regression tests on tactical and endgame positions — not a guarantee of perfect play, but a measurable floor.
What I'd change
The admin tooling (React) grew organically alongside product functionality; knowing what I know now, I'd have set it up as a separate, contract-driven domain from the start rather than building reactively against the API.



A similar problem to solve?
A no-obligation introduction call about end-to-end product delivery.