The first version of D4 Chess Club™ was an embarrassment. It was a single page with a chess board, a textbox that sent moves to a Stockfish process running on my laptop, and a hardcoded response that said "interesting move" regardless of what you played. I built it in an afternoon to see if the basic integration was possible. It was. That felt like a green light.
What followed was three months of decisions, rewrites, and occasional breakthroughs that turned that afternoon prototype into something I wasn't ashamed to show people.
The Stack Decision
The first real decision was the architecture. I knew I wanted the frontend in Next.js — App Router, TypeScript, the works. Not because it was the fashionable choice, but because server-side rendering matters enormously for a tool that needs to be fast on mobile, crawlable by search engines, and capable of progressive loading on slow connections.
For the backend, I chose FastAPI with Python. Chess tooling is dominated by Python — python-chess is the best move parsing library in any language, and the integrations with Stockfish are mature and well-documented. An async Python API fit naturally alongside async database access and async AI calls.
The database was Supabase — PostgreSQL under the hood, hosted, with a solid connection pooling story. And for deployment: Vercel for the frontend, Fly.io for the backend. Two platforms I'd used before and trusted.
None of these choices were exciting. That was intentional. When you're building something where the product is the point, boring infrastructure is a feature.
The First Real Feature: Game Analysis
The first thing I built that actually felt like a product was the game analysis pipeline. You paste a PGN, we parse every move, run each position through Stockfish, classify moves as excellent / good / inaccuracy / mistake / blunder, and display it back to you with a move-by-move breakdown and an accuracy percentage.
This took longer than expected — not the Stockfish integration, which was straightforward, but the UX of stepping through the analysis. How do you show someone 60 moves worth of data without overwhelming them? How do you surface the moments that matter — the blunder on move 23 that lost a tempo that cascaded into a lost endgame — without burying them in evaluation bars and centipawn numbers?
The answer was to build around the worst moments. Lead with the mistakes. Show the three or four critical turning points. Let the player choose to explore the full game from there. The evaluation bar is secondary; the story of what went wrong is primary.
The Puzzle System: Harder Than Expected
I assumed puzzles would be simple — pull from a dataset, display a position, validate the move. Simple, right?
Wrong. The challenge wasn't the puzzles themselves (we have 54,000+ in the database). It was the rating system, the thematic categorization, the spaced repetition logic, and most critically — the move validation. Chess puzzles often require finding a sequence, not just a single move. Getting the multi-move validation right, with proper FEN verification after each ply, took an entire week of debugging that I am not entirely proud of.
The puzzle rating system ended up being a proper Elo implementation — your rating goes up and down based on puzzle difficulty and whether you solve it. This created a virtuous loop: as your rating climbs, you face harder patterns. Your weakest pattern categories get surfaced more frequently. The system gets smarter about where you're weak as you use it.
What We Learned in Month Three
By the end of month three we had: game analysis with full move classification, a working puzzle system with rating, an opening explorer covering 3,700+ openings with principle explanations, and the basic shell of the AI coaching system. The app was clunky in places and the UI was aggressively minimal.
What I learned in those 90 days: shipping something imperfect that works is infinitely more instructive than building something perfect in isolation. The moment we put D4 Chess Club™ in front of real players, every assumption we'd made about how people would use it turned out to be at least partially wrong. The real product got built in response to real people, not imagined ones.
That's still true today. The best features in D4 Chess Club™ came from watching someone struggle with something that seemed obvious to us — and then fixing it.
Related Reading
Ready to improve?
Try D4 Chess Club™ free — no credit card required
AI coaching, 54,000+ puzzles, Stockfish analysis. Built for the player who wants to get better, not just play more.
Start Training Free