ChessCake

Inspiration

Chess is one of the most studied games in the world, yet most analysis tools are built for advanced players. Engine output full of centipawn scores, depth numbers, and algebraic notation can be intimidating for beginners who just want to understand why a move is good or bad.

We wanted to build something different — a tool that meets players where they are. Whether you're studying a position from a book, reviewing a game you just played on Chess.com, or analyzing an over-the-board game with friends, ChessCake lets you point your camera at any chess board and instantly get beginner-friendly analysis powered by Stockfish.

The name says it all: chess analysis should be as approachable and enjoyable as a slice of cake.

What it does

ChessCake is a multi-platform chess analysis tool that accepts a photo of any chess board — physical or digital, 2D or 3D — and returns Stockfish-powered move suggestions explained in plain English.

  • Web app: Upload an image, paste a FEN string, or set up a custom position to analyze any chess position from any device, directly in the browser.
  • Mobile app (iOS & Android): Point your camera at any board, choose who moves next, and get the top 3 best moves with an evaluation bar and plain-language explanations. The interactive board lets you explore variations move by move. (Currently, the mobile app for iOS and Android is still under review by Apple and Google team, so it's not out for public yet. I'll put the link for the mobile app once it's published in the web app.)
  • Chrome extension: Select any area of your screen containing a chess board for instant analysis, displayed in a side panel alongside the page you're viewing. Includes a built-in anti-cheating measure: the extension is automatically disabled on all live game and tournament pages on Chess.com and Lichess. The extension icon grays out on these pages. It remains fully enabled on analysis boards, puzzles, study pages, and all other websites.

All three platforms share the same FastAPI backend, which handles AI-powered board recognition via Claude's vision API and deep analysis via Stockfish at depth 20.

How we built it

ChessCake is a monorepo with four modules: backend, mobile app, Chrome extension, and web app.

Backend is built with FastAPI and Python, running on a VPS with Docker. It exposes a /api/pipeline endpoint that takes a base64-encoded image, uses Claude's vision API to recognize the chess position and return a FEN string, then passes that FEN to Stockfish for analysis. Redis handles rate limiting, SQLite handles user data, and Nginx proxies everything behind HTTPS.

Mobile app is built with Expo and React Native, using expo-camera for board capture and react-native-chessboard for the interactive board. Authentication uses Google Sign-In via @react-native-google-signin/google-signin and email/password. Distributed via the App Store and Google Play.

Chrome extension is built with Manifest V3. A content script injects a screenshot selection overlay, the captured image is sent to the backend, and results are displayed in a side panel or popup with an interactive chessboard and evaluation bar.

Web app is built with React and Vite, sharing API client code and chess utilities with the mobile app via a /shared module. It supports image upload, FEN paste, and custom board setup.

Challenges we ran into

Board recognition across formats was the hardest problem. A 3D over-the-board photo with bad lighting looks nothing like a clean digital screenshot, which looks nothing like a black-and-white diagram from a PDF book. Crafting a Claude vision prompt that handles all three reliably — and returns a valid FEN with no mistakes — required significant iteration. One wrong piece placement invalidates the entire analysis.

Cross-platform authentication was more complex than expected. Google OAuth behaves differently across web, Android, iOS, and Chrome extensions — each requiring a separate client ID, different redirect URI configurations, and different native libraries. The expo-auth-session approach we started with turned out to use a deprecated Expo auth proxy that Google now blocks, requiring a migration to @react-native-google-signin/google-signin.

Monorepo code sharing between React Native and React web required careful separation — sharing TypeScript types, API clients, and chess utilities (FEN validation, eval bar calculations) while keeping all UI components and platform-specific storage completely separate.

Stockfish on a 1 GB VPS required implementing an asyncio.Semaphore to limit concurrent analyses to 6 at a time, preventing memory exhaustion under load while keeping the API responsive.

Accomplishments that we're proud of

  • Built and shipped a working multi-platform product — iOS app, Android app, Chrome extension, and web app in under one month, as a solo developer
  • The board recognition pipeline handles 2D screenshots, book scans, and 3D over-the-board photos in a single unified flow
  • The Chrome extension's anti-cheating measure — a deliberate design decision we're proud of. The extension automatically disables itself on all live game and tournament URLs on Chess.com and Lichess. Lichess was particularly tricky since game URLs are just short random IDs at the root path (e.g. lichess.org/PpwPOZMq) with no /game/ prefix — we solved this with a whitelist approach, enabling only known safe paths like /analysis, /study, /puzzle, and /broadcast, and treating everything else as a live game.

What we learned

  • Claude's vision API is capable at spatial reasoning tasks like chess board recognition, but prompt engineering for precision (exact piece placement, correct FEN output) is a craft in itself
  • The Google OAuth ecosystem is significantly more fragmented across platforms than it appears — plan for separate client IDs and configurations per platform from day one
  • EAS Build dramatically simplifies React Native deployment — certificate management, provisioning profiles, and store submission that used to take days now take minutes
  • Shipping a v1 with intentional constraints (depth capped at 20, rate limiting, fair play restrictions) is better than trying to build a perfect product before launch

What's next for ChessCake

  • Premium plan — higher daily analysis limits, deeper Stockfish analysis, and saved game history
  • Game import — connect Chess.com and Lichess accounts to import and analyze your recent games directly
  • Offline analysis — integrate Stockfish WASM for on-device analysis without needing the backend
Share this project:

Updates

posted an update

Since the repository I connected with Novus for this project is a monorepo, it contains several modules for the interfaces of chess cake: mobile-app, web-app, chrome-extension, and also a backend module. When I first installed Novus for this project, I noticed later that it only added integration with the mobile-app. Since the mobile-app is not released yet, Novus hasn't got any signals.

I then integrated Novus manually with the web-app module, and now when I inspected ChessCake website, it has successfully integrated with Novus (I saw some several calls to pendo in the Inspect -> Network section, image attached above). But after waiting for several minutes, my Novus dashboard still doesn't get any signals.

I hope I just need to wait for several minutes/hours before Novus starts showing signals from my apps.

Log in or sign up for Devpost to join the conversation.

posted an update

ChessCake development is done. The web app and Chrome extension have been published to the public (link in the description above). But the mobile app (iOS and Android) is still undergoing review from Apple and Google team, so it's not out for public yet.

Log in or sign up for Devpost to join the conversation.