I always wanted to implement an AI-based chess tutor because I like playing chess, although to be honest, I actually suck at it. I didn't find the existing tutors or big apps useful enough for my needs, so I decided to build my own approach.
This application was built using Antigravity by Google. I like to work with it, though sometimes it just runs away. Still, I found the end result to be quite fun to play, which is why I'm sharing it here.
AI Chess Tutor is an interactive chess learning application where you play against an AI opponent powered by Stockfish while receiving real-time coaching feedback from a Large Language Model (LLM).
Opening Training Mode - Learn chess openings systematically:
- Browse Openings: Explore 12,379 openings organized by ECO code and family
- Select an Opening: Choose from openings like French Defense, Sicilian, Ruy Lopez, etc.
- Read Background: View Wikipedia context about the opening's history and strategic ideas
- Practice Moves: Make moves while the AI tutor guides you through the repertoire
- Real-Time Feedback: Get instant feedback on whether you're in theory or deviating
- Handle Deviations: When you leave theory, choose to:
- Undo and return to the repertoire
- Continue Playing in full game mode with opening context
- Explore the variation further
- Resume Sessions: Your progress is saved - pick up where you left off
Tactical Practice Mode - Master tactical patterns:
- Choose a Pattern: Select from 8 tactical themes (Pin, Fork, Skewer, etc.)
- Solve Puzzles: Find the winning tactical move in realistic positions
- Get Feedback: Receive immediate feedback and explanations
- Track Progress: Monitor your streak and success rate
- Learn Patterns: Build pattern recognition through repetition
Game Mode - Play full games with AI coaching:
- Start or Resume: From the homepage, either start a new game or continue an unfinished game
- Choose Your Personality: Select from 9 unique AI coaching personalities
- Select Your Color: Play as White, Black, or let the app choose randomly
- Play Chess: Make your moves on the board while the Stockfish engine plays against you
- Get Real-Time Feedback: After each move exchange, your AI tutor analyzes the position:
- Move quality and alternatives
- Position evaluation changes
- Missed tactical opportunities (pins, forks, skewers, checks, hanging pieces, material captures)
- Opening theory (when applicable)
- Strategic and positional considerations
- Chat with Your Tutor: Ask questions anytime - your tutor answers in character
- Export Your Game: Download your game as PGN or export the current position as FEN
- Resign When Needed: End the game early with in-character tutor feedback
- Post-Game Analysis: Review comprehensive analysis showing:
- All your mistakes and inaccuracies
- Missed tactical opportunities throughout the game
- Learning opportunities and improvement suggestions
Screenshot placeholder: Main game interface with board, evaluation bar, and chat
- Stockfish Engine: Powerful chess engine for move analysis and opponent play
- Opening Training Mode: Interactive opening trainer with AI tutor guidance
- Practice 12,379 chess openings from comprehensive ECO database
- Real-time feedback on theory adherence vs. deviations
- Wikipedia integration for opening history and strategic context
- Session persistence with resume capability
- Deviation dialog with options to undo, continue, or transition to game mode
- Automatic opponent moves following repertoire lines
- Tactical Practice Mode: Pattern-based puzzle training with 8 tactical themes
- 20+ puzzles per pattern from Lichess database
- Patterns: Pin, Fork, Skewer, Discovered Check, Double Attack, Overloading, Back Rank Weakness, Trapped Piece
- Streak tracking and performance statistics
- Tactical Recognition: Automatically detects missed tactical opportunities (pins, forks, skewers, checks, hanging pieces, material captures)
- Opening Database: Comprehensive ECO database with 12,379 openings, metadata, and theory
- Real-Time Evaluation: Live position evaluation with visual evaluation bar
- Move Analysis: Detailed feedback on every move you make with tactical insights
- Interactive Chat: Ask your AI tutor questions and get personalized answers
- Post-Game Analysis: Review all your mistakes and missed opportunities after each game
- Resign Option: End games early with a resign button - your AI tutor responds in character
- Direct Analysis Access: Jump straight to the analysis page from the game over modal
- Multi-Language Support: Available in English, German, French, Italian, and Polish
- FEN/PGN Import: Import positions or games with automatic format detection
- Game Export: Download your games as PGN or export current position as FEN
- Move History: Visual move history table with evaluation changes and tactical annotations
- Saved Games: Continue unfinished games from where you left off
- Settings Management: Customize your experience with language preferences, API key management, and data controls
- Mobile Apps: iOS and Android apps with Capacitor (proprietary licensing for App Store compliance)
Choose from 9 distinct coaching personalities, each offering a unique learning experience:
"This is a very instructive structure..."
A calm, deeply knowledgeable educator who loves turning openings into understandable stories with history, plans, and model structures. Perfect for learning opening theory and understanding positional concepts.
"Let's analyze the structure of this position"
A strict, analytical, and straightforward chess coach focused on your improvement. Expect objective analysis, clear explanations based on chess principles, and professional teaching methods.
"Ach... life is pain, my boy"
A bitter, fatalistic, but brilliant Grandmaster who has seen it all. Expect brutally honest feedback delivered with dark humor and existential commentary. This personality combines deep chess knowledge with a Dostoevsky-like atmosphere.
"BRO! THAT MOVE WAS INSANE!"
An energetic, loud, and entertaining chess streamer who makes every game exciting. Expect dramatic reactions, Gen-Z slang, and over-the-top commentary that keeps you engaged and motivated.
"A move is never late, nor is it early..."
A wise and mystical chess wizard who speaks in riddles and metaphors. Combines chess wisdom with magical references and philosophical insights.
"Evaluation: +0.7. Best continuation: Nf3, d5, c4..."
The engine itself, speaking in pure chess notation and evaluations. No personality, just raw analysis and computer-like precision.
"Are you even trying? That's the worst move I've seen all day!"
An abrasive, confrontational personality that roasts your mistakes mercilessly. Not for the faint of heart, but some players find the challenge motivating.
"To castle or not to castle, that is the question..."
A theatrical personality that delivers chess analysis in Shakespearean verse and dramatic monologues. Makes every game feel like a stage performance.
"The board is empty, yet full of possibilities..."
A calm, meditative personality that approaches chess as a spiritual practice. Focuses on mindfulness, patience, and finding harmony in the position.
One of the standout features is the automatic tactical pattern detection that runs after every move:
What it detects:
- Material Captures: Safe captures of pieces and pawns (with recapture analysis)
- Pins: Pieces pinned to the king or more valuable pieces
- Forks: Pieces attacking multiple valuable targets simultaneously
- Skewers: Attacks forcing a valuable piece to move, exposing another
- Checks: Moves that give check to the opponent's king
- Hanging Pieces: Undefended pieces that could be captured
How it works:
- After each move, the system compares your move to the engine's best move
- If there's a significant evaluation difference, it analyzes what tactical opportunities were missed
- The AI tutor receives this information and explains it in real-time in their characteristic style
- All missed tactics are also shown in the post-game analysis
Conservative approach:
- The system uses multiple filters to avoid false positives
- Only reports tactics when there's a clear advantage
- Checks for piece safety (e.g., won't report a "capture" if the piece can be immediately recaptured)
This feature helps you learn tactical patterns naturally during gameplay, rather than just through puzzle training.
Game Management:
- Save & Resume: Your games are automatically saved to browser storage - continue playing anytime
- Game Export: Download your completed or in-progress games as PGN files for analysis in other tools
- Position Export: Export the current board position as FEN for sharing or further study
- Game History: Visual table showing all moves with evaluation changes and missed tactics
- Clear All Data: Reset your local storage from the settings page when needed
Customization:
- 5 Languages: Full interface translation in English, German, French, Italian, and Polish
- 9 AI Personalities: Choose the coaching style that motivates you best
- Flexible Setup: Play as White, Black, or random color selection
- Import Games: Start from any position using FEN or continue from a PGN game
Analysis Tools:
- Real-Time Evaluation Bar: Visual representation of position evaluation during play
- Opening Explorer: Automatic opening detection with theory and explanations
- Position Analysis: Deep-dive into any position with the analysis modal
- Post-Game Review: Comprehensive analysis of all mistakes and missed opportunities
Modern Interface:
- Responsive Design: Works on desktop, tablet, and mobile devices
- Dark Mode Support: Automatic dark/light theme based on system preferences
- Intuitive Controls: Drag-and-drop piece movement with visual feedback
- Clean Layout: Focused design that keeps the board and feedback front and center
The fastest way to get started is using our pre-built Docker image from GitHub Container Registry:
# Clone the repository
git clone https://github.com/stefan-kp/chess_tutor.git
cd chess_tutor
# (Optional) Create .env file with your API key
echo "NEXT_PUBLIC_GEMINI_API_KEY=your_api_key_here" > .env
# Start the application
docker-compose up -d
# View logs
docker-compose logs -fThe application will be available at http://localhost:3050
What happens:
- Docker Compose automatically pulls the latest pre-built image from
ghcr.io/stefan-kp/chess-tutor:latest - No build step required - the image is built automatically on every push to main via GitHub Actions
- The container starts with health checks and auto-restart enabled
If you want to run the application locally for development:
- Node.js 18+ installed
- A free Google Gemini API key
# Clone the repository
git clone https://github.com/stefan-kp/chess_tutor.git
cd chess_tutor
# Install dependencies
npm install
# Create .env file (optional)
echo "NEXT_PUBLIC_GEMINI_API_KEY=your_api_key_here" > .env
# Run development server
npm run dev
# Or build and run production
npm run build
npm startThe application will be available at http://localhost:3050
- Visit Google AI Studio
- Sign in with your Google account
- Click "Create API Key"
- Copy your API key
You have two options for providing your Gemini API key:
- Create a
.envfile in the project root - Add your API key:
NEXT_PUBLIC_GEMINI_API_KEY=your_api_key_here - The application will automatically use this key
- Run the application without an API key
- When prompted, enter your API key in the modal dialog
- The key will be stored in your browser's localStorage
Note
You can update your API key anytime by clicking the key icon in the bottom-right corner of the application.
This project uses GitHub Actions to automatically build and publish Docker images to GitHub Container Registry (GHCR) on every push to the main branch.
What this means:
- Every commit to
maintriggers an automatic Docker build - The latest image is always available at
ghcr.io/stefan-kp/chess-tutor:latest - Each build is also tagged with the commit SHA for version tracking
- No need to build locally - just pull and run!
The docker-compose.yml file is already configured to use the pre-built image:
services:
chess-tutor:
image: ghcr.io/stefan-kp/chess-tutor:latest
# ... rest of configurationThis means you can deploy anywhere with just:
docker-compose up -dIf you prefer to build the image yourself:
# Build the image
docker build -t chess-tutor:latest .
# Run the container
docker run -d \
--name chess-tutor \
-p 3050:3050 \
-e NEXT_PUBLIC_GEMINI_API_KEY=your_api_key_here \
--restart unless-stopped \
chess-tutor:latestFor production deployment behind nginx, use the provided nginx.conf.example:
# Copy the example configuration
sudo cp nginx.conf.example /etc/nginx/sites-available/chess-tutor
# Edit the configuration
sudo nano /etc/nginx/sites-available/chess-tutor
# Update: server_name, SSL certificates (if using HTTPS)
# Enable the site
sudo ln -s /etc/nginx/sites-available/chess-tutor /etc/nginx/sites-enabled/
# Test nginx configuration
sudo nginx -t
# Reload nginx
sudo systemctl reload nginxThe application provides HTTP API endpoints that allow external applications to access chess engine evaluation and AI tutor functionality. This enables integration with other tools, mobile apps, or custom interfaces.
Endpoint: POST /api/v1/stockfish
Evaluates a chess position using the Stockfish engine running server-side.
Request Body:
{
"fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
"depth": 15,
"multiPV": 1
}Response:
{
"evaluation": {
"bestMove": "e2e4",
"ponder": "e7e5",
"score": 20,
"mate": null,
"depth": 15
}
}Parameters:
fen(required): FEN string of the position to evaluatedepth(optional): Search depth (default: 15)multiPV(optional): Number of principal variations (default: 1)
Notes:
- Scores are normalized from White's perspective (positive = White advantage)
- Mate values indicate moves to mate (positive = White mates, negative = Black mates)
Endpoint: POST /api/v1/llm/chat
Generates AI tutor responses with enforced personality and chess context.
Request Body:
{
"apiKey": "your-gemini-api-key",
"personalityId": "bobby_fischer",
"language": "en",
"playerColor": "white",
"message": "How should I continue?",
"context": {
"currentFen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
"evaluation": {
"score": 20,
"mate": null,
"bestMove": "e7e5"
}
},
"history": [
{ "role": "user", "text": "Previous question" },
{ "role": "model", "text": "Previous answer" }
]
}Response:
{
"reply": "Ah, the classic e4 opening! You're following in the footsteps of champions..."
}Parameters:
apiKey(required): Your Google Gemini API keypersonalityId(required): ID of the tutor personality (see/api/v1/personalities)language(required): Language code (en,de,fr,it,pl)playerColor(required): Player's color (whiteorblack)message(required): User's message/questioncontext(optional): Chess position context (FEN, evaluation, openings, tactics)history(optional): Previous conversation historymodelName(optional): Gemini model name (default:gemini-2.5-flash)
Notes:
- The API key is provided by the client (bring your own key)
- Server-side prompt generation ensures consistent tutor behavior
- System prompts enforce the dual role (opponent + tutor)
Endpoint: GET /api/v1/personalities
Returns the list of available AI tutor personalities.
Response:
{
"personalities": [
{
"id": "bobby_fischer",
"name": "Bobby Fischer",
"description": "Aggressive, confident, and brutally honest...",
"image": "/personalities/bobby_fischer.png"
}
]
}Notes:
- System prompts are excluded from the response for security
- Use the
idfield when calling the chat API
# Evaluate a position
curl -X POST http://localhost:3050/api/v1/stockfish \
-H "Content-Type: application/json" \
-d '{
"fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1",
"depth": 15
}'
# Get available personalities
curl http://localhost:3050/api/v1/personalities
# Chat with AI tutor
curl -X POST http://localhost:3050/api/v1/llm/chat \
-H "Content-Type: application/json" \
-d '{
"apiKey": "your-gemini-api-key",
"personalityId": "bobby_fischer",
"language": "en",
"playerColor": "white",
"message": "What should I play here?",
"context": {
"currentFen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
}
}'For detailed API documentation, see:
You can configure the application using environment variables in your .env file or Docker Compose configuration:
| Variable | Description | Default |
|---|---|---|
NEXT_PUBLIC_GEMINI_API_KEY |
Google Gemini API Key for AI features | (Required for AI) |
NEXT_PUBLIC_DEBUG |
Enable debug mode to see all LLM prompts and responses | false |
IMPRINT_URL |
External URL for the Imprint link in the footer. If not set, an internal page is used. | Internal Page |
DATA_PRIVACY_RESPONSIBLE_PERSON |
Name of the person responsible for data privacy (shown on /privacy page). | Placeholder |
Debug mode is a powerful feature that helps you understand and troubleshoot how the AI tutor works by showing you all the prompts sent to the LLM and the responses received.
To enable debug mode:
-
Add to your
.envfile:NEXT_PUBLIC_DEBUG=true -
Restart the application (or rebuild if using Docker)
What debug mode shows:
- All LLM Prompts: See exactly what context, instructions, and data are sent to the AI
- All LLM Responses: View the raw responses before they're displayed in the chat
- Timestamps: Track when each interaction occurred
- Interaction Types: Distinguish between move analysis, user questions, and other triggers
How to use it:
- Floating Panel: A debug panel appears in the bottom-right corner showing all interactions
- Copy to Clipboard: Click the copy button to save prompts/responses for analysis
- Clear History: Clear the debug log when needed
- Expandable Details: Click on any entry to see the full prompt and response
Why it's useful:
- Troubleshooting: Identify issues with AI responses or unexpected behavior
- Learning: Understand how the system constructs prompts and provides context
- Bug Reports: Include debug output when reporting issues
- Customization: See what data is available if you want to modify the prompts
Example use cases:
- Verify Position Context: Check that the correct FEN positions are being sent
- Check Evaluation Data: Ensure mate scores and centipawn values are correct
- Opening Detection: See which openings are being identified and sent to the AI
- Tactical Analysis: View the tactical opportunities detected by the system
Warning
Debug mode is intended for development and troubleshooting. It may impact performance and should not be used in production environments.
Copyright (c) 2024 KaProblem (https://www.kaproblem.com). All rights reserved.
This project uses dual licensing (required for App Store compliance):
- Source Code: GPL-3.0 (see LICENSE)
- Mobile Apps: Proprietary (copyright holder only)
Why Dual Licensing? App Store and Google Play terms are incompatible with GPL-3.0. Mobile builds exclude GPL code (Stockfish.js) and use API calls instead, allowing proprietary licensing for app store distribution.
Important for Third Parties:
- You may use this code under GPL-3.0 terms
- You CANNOT distribute GPL apps on App Store/Google Play (platform restrictions)
- You CANNOT create proprietary mobile apps from this code
- Only the copyright holder can distribute proprietary versions
- See COPYRIGHT and LICENSING.md for details
This application uses Stockfish, which is licensed under GPL-3.0 (web builds only; mobile builds use API calls).
- Opening collection originally by ragizaki/ChessOpeningsRecommender
- Chess engine: Stockfish (GPLv3)
- LLM: Google Gemini