BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
AI 모델을 개인 체스 파트너로 바꾸고, Stockfish 17.1 엔진과 연동된 실시간 훈련을 제공합니다
Transform any AI model into your personal chessbuddy. Get live training with OpenAI, Claude, or Gemini integrated with Stockfish 17.1 engine.
게임TypeScript · PythonGitHub @ChessterApp온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기AI-powered chess learning platform with multi-session analysis, Stockfish WASM engine, and intelligent coaching
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
♟️ Chesster — AI-Powered Chess Learning Platform An intelligent chess learning platform combining Stockfish engine analysis, multi-LLM AI coaching, a 4.35M-game database, opening repertoire builder, interactive puzzles, and structured courses — all in one place. Chesster is a full-stack chess learning platform live at chesster.io, deployed on a DigitalOcean droplet behind nginx with SSL. It combines:README 전문 보기 ↗
Chesster is a full-stack chess learning platform live at chesster.io, deployed on a DigitalOcean droplet behind nginx with SSL. It combines:
The platform supports English, Russian, and Kazakh with full i18n coverage across 27 translation namespaces.
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16 | App Router + Pages API routes |
| React | 19 | UI framework |
| TypeScript | 5.9 | Type safety |
| MUI | 7.1 | Component library |
| Tailwind CSS | 4 | Utility-first styling |
| chess.js | — | Chess logic & move validation |
| react-chessboard | — | Interactive board rendering |
| Chessground | — | Alternative board renderer |
| Stockfish WASM | — | Client-side engine evaluation |
| Clerk | — | Authentication (sign-in/sign-up, user management) |
| Mastra | — | AI agent framework (Gemini 2.5 Flash) |
| next-intl | — | i18n (en/ru/kk) |
| SWR | — | Data fetching & caching |
| Lottie | — | Animations |
| Technology | Version | Purpose |
|---|---|---|
| Flask | 3.1 | REST API + SSE streaming |
| Python | 3.11 | Runtime |
| python-chess | — | Chess logic, PGN parsing, board operations |
| Supabase | — | PostgreSQL database + auth |
| SQLite | — | TWIC game index (43 GB) |
| OpenRouter | — | Multi-LLM gateway (Claude, GPT, Gemini) |
| faster-whisper | tiny | Speech-to-text transcription |
| Docker | — | Backend containerization |
| Component | Details |
|---|---|
| Server | DigitalOcean droplet (104.248.190.155) |
| Domain | chesster.io |
| Reverse Proxy | nginx with SSL (certbot / Let's Encrypt) |
| Process Manager | PM2 (frontend) |
| Containers | Docker Compose (backend) |
Chesster uses a hybrid 3-way AI routing system. An intelligent router in the frontend decides which provider handles each request based on message content, keywords, and context:
┌─────────────────────────────────────────────────┐
│ User Message │
└─────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────┐
│ Intelligent Router │
│ (src/lib/router/index.ts) │
│ │
│ Analyzes: keywords, message type, context │
└──────┬──────────────┬───────────────┬───────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌───────────┐ ┌──────────────────┐
│ Mastra │ │ Clawdbot │ │ Python Backend │
│ (Gemini │ │ (Claude │ │ (OpenRouter │
│ 2.5 Flash) │ │ Sonnet 4) │ │ auto) │
│ │ │ │ │ │
│ Fast pos. │ │ Deep │ │ Fallback analysis │
│ analysis │ │ coaching, │ │ with SSE streaming │
│ │ │ memory, │ │ │
│ │ │ personal- │ │ │
│ │ │ ization │ │ │
└─────────────┘ └───────────┘ └──────────────────┘
Port 3000 Port 19789 Port 5001
(Next.js) (Gateway) (Flask/Docker)
| Provider | Model | Strengths | Route Triggers |
|---|---|---|---|
| Mastra | Gemini 2.5 Flash via OpenRouter | Fast, low-cost position analysis | Quick questions, eval requests |
| Clawdbot | Claude Sonnet 4.0 | Deep coaching, memory, personalization | Coaching, study plans, deep analysis |
| Python Backend | OpenRouter auto-select | Reliable fallback, SSE streaming | Fallback, analysis streams |
Browser MediaRecorder → WebM/Opus blob
→ POST /api/chat/transcribe
→ faster-whisper (tiny model)
→ Transcribed text → Chat input
chess-ultimate-app/
├── frontend/ # Next.js application
│ ├── src/
│ │ ├── app/ # App Router pages
│ │ │ ├── page.tsx # Landing page
│ │ │ ├── dashboard/ # User dashboard
│ │ │ ├── position/ # Analysis board
│ │ │ ├── game/ # Game viewer
│ │ │ ├── debut/ # Opening repertoire builder
│ │ │ ├── editor/ # Board editor
│ │ │ ├── learn/ # Course platform
│ │ │ │ └── [courseSlug]/ # Individual course view
│ │ │ ├── puzzle/ # Interactive puzzles
│ │ │ ├── opponent/ # Opponent analysis
│ │ │ ├── profile/ # User profile
│ │ │ ├── sign-in/ # Clerk sign-in
│ │ │ └── sign-up/ # Clerk sign-up
│ │ │
│ │ ├── components/ # React components
│ │ │ ├── analysis/ # AiChessboard, ChessterAnalysisView, EvalBar
│ │ │ ├── editor/ # BoardEditor, EditorControls, SparePieces
│ │ │ ├── openings/ # DebutBoard, OpeningTree, GameSearchPanel,
│ │ │ │ # NodeDetailsPanel, PgnImporter, RepertoireSelector
│ │ │ ├── chess/ # AnimatedChessBoard, ArrowOverlay, BoardControls,
│ │ │ │ # FeedbackDisplay, LottieCelebration, PuzzleSequence
│ │ │ ├── tabs/ # ChaptersTab, ChatTab, Chessdb, EvalGraph,
│ │ │ │ # GameInfoTab, GameReviewDialog, GameReviewTab,
│ │ │ │ # LegalMoveTab, ModelSetting, OpeningTab, PgnView,
│ │ │ │ # PlayerInfoTab, PositionRadarAnalysis, StockfishTab
│ │ │ ├── ui/ # Shared UI primitives
│ │ │ ├── ChatSidebar.tsx # Multi-session chat sidebar
│ │ │ ├── ClientShell.tsx # App shell wrapper
│ │ │ ├── LanguageSwitcher.tsx
│ │ │ ├── LoadingScreen.tsx
│ │ │ └── Navbar.tsx
│ │ │
│ │ ├── hooks/ # Custom React hooks
│ │ │ ├── useChesster.ts # Main analysis hook (56K)
│ │ │ ├── useOpeningRepertoire.ts # Repertoire management
│ │ │ ├── useGameReview.ts # Game review logic
│ │ │ ├── useChatSessions.ts # Multi-session chat
│ │ │ ├── useVoiceRecorder.ts # Voice recording
│ │ │ ├── useRepertoire.ts
│ │ │ ├── useReplayStockfish.ts
│ │ │ ├── useGameTheme.ts
│ │ │ └── useThemeScore.ts
│ │ │
│ │ ├── lib/
│ │ │ └── router/
│ │ │ └── index.ts # AI provider routing logic
│ │ │
│ │ └── i18n/ # Translation files (en/ru/kk)
│ │
│ ├── src/pages/api/ # Pages Router API routes
│ │ ├── chat/
│ │ │ ├── stream.ts # SSE chat orchestrator
│ │ │ └── transcribe.ts # Voice STT endpoint
│ │ ├── puzzle.ts # Puzzle generation
│ │ ├── agent.ts # Mastra agent endpoint
│ │ ├── convert-image.ts # Image processing
│ │ ├── gametheme.ts # Theme detection
│ │ └── themescore.ts # Theme scoring
│ │
│ ├── next.config.ts # COEP/COOP headers, i18n, cache busting
│ ├── ecosystem.config.js # PM2 configuration
│ ├── .env.local # Frontend environment variables
│ └── Dockerfile
│
├── backend/ # Flask API (Docker)
│ ├── app.py # Flask application entry point
│ ├── api/ # API blueprints
│ │ ├── chat.py # AI chat with conversation history
│ │ ├── lessons.py # Course/module/lesson CRUD
│ │ ├── openings.py # Opening repertoire (1928 lines)
│ │ ├── puzzles.py # Puzzle generation & tracking
│ │ ├── opponent_analysis.py # Chess.com/Lichess profiling
│ │ ├── photo_to_fen.py # Image → FEN conversion
│ │ └── repertoire.py # Repertoire service
│ │
│ ├── services/
│ │ ├── supabase_client.py
│ │ ├── conversation_manager.py
│ │ ├── llm_session_manager.py
│ │ ├── rate_limiter.py
│ │ └── repertoire_service.py
│ │
│ ├── llm/ # LLM provider implementations
│ │ ├── anthropic_llm.py
│ │ ├── openai_llm.py
│ │ └── openrouter_llm.py
│ │
│ ├── scripts/ # Database & maintenance scripts
│ │ ├── add_position_index.py
│ │ ├── index_pgn_database.py
│ │ ├── index_positions_chunked.py
│ │ ├── download_twic_updates.py
│ │ ├── import_games.py
│ │ ├── import_lessons.py
│ │ ├── import_openings.py
│ │ ├── import_lichess_study.py
│ │ └── healthcheck.py
│ │
│ ├── .env # Backend environment variables
│ └── Dockerfile # python:3.11-slim, non-root, port 5001
│
├── docker-compose.yml # Backend (Flask) + Frontend (Next.js)
├── .env # Docker Compose build args
└── README.md
npm install -g pm2)git clone https://github.com/YOUR_USERNAME/chess-ultimate-app.git
cd chess-ultimate-app
# Frontend
cp frontend/.env.local.example frontend/.env.local
# Edit with your Clerk, Supabase, OpenRouter, and Mastra keys
# Backend
cp backend/.env.example backend/.env
# Edit with your Supabase, OpenRouter, and LLM API keys
# Docker Compose
cp .env.example .env
# Edit build args if needed
See Environment Variables for the full list.
docker compose up -d backend
The Flask API starts on port 5002 (mapped to 5001 inside the container).
cd frontend
npm install
npm run build
pm2 start ecosystem.config.js
The Next.js app runs on port 3000.
Set up nginx as a reverse proxy with SSL:
server {
listen 443 ssl;
server_name chesster.io;
ssl_certificate /etc/letsencrypt/live/chesster.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chesster.io/privkey.pem;
# Default: Next.js frontend
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
}
# SSE chat stream (special buffering)
location /api/chat/stream {
proxy_pass http://127.0.0.1:3000;
proxy_buffering off;
proxy_cache off;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
}
# Voice transcription (25MB upload limit)
location /api/chat/transcribe {
proxy_pass http://127.0.0.1:3000;
client_max_body_size 25M;
}
# Flask backend API routes
location ~ ^/api/(courses|learn|chat|puzzles|opponent|openings|convert-image|health) {
proxy_pass http://127.0.0.1:5001;
proxy_set_header Host $host;
}
# Flask SSE analysis stream
location /api/chat/analysis/stream {
proxy_pass http://127.0.0.1:5001;
proxy_buffering off;
proxy_cache off;
}
# Health check
location /health {
return 200 'OK';
}
}
Install SSL with certbot:
sudo certbot --nginx -d chesster.io
frontend/.env.local)# Clerk Authentication
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_live_...
CLERK_SECRET_KEY=sk_live_...
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard
# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://YOUR_PROJECT.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
# Backend URLs
NEXT_PUBLIC_BACKEND_URL=https://chesster.io
NEXT_PUBLIC_API_URL=https://chesster.io/api
# Mastra AI Framework
MASTRA_OPENROUTER_API_KEY=sk-or-v1-...
MASTRA_MODEL=google/gemini-2.5-flash
# Clawdbot Gateway
CLAWDBOT_GATEWAY_URL=http://localhost:19789
CLAWDBOT_GATEWAY_TOKEN=your_gateway_token
# OpenRouter (for frontend API routes)
OPENROUTER_API_KEY=sk-or-v1-...
backend/.env)# Supabase
SUPABASE_URL=https://YOUR_PROJECT.supabase.co
SUPABASE_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
# LLM Providers
OPENROUTER_API_KEY=sk-or-v1-...
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
# Flask
FLASK_ENV=production
FLASK_PORT=5001
.env)BACKEND_PORT=5002
FRONTEND_PORT=3000
Internet → nginx (443/SSL) → ┬→ Next.js (PM2, port 3000) ← Frontend + API routes
├→ Flask (Docker, port 5001) ← Backend API
└→ Clawdbot (port 19789) ← AI coaching gateway
# Pull latest code
cd /root/chess-app
git pull origin main
# Rebuild & restart backend
docker compose up -d --build backend
# Rebuild & restart frontend
cd frontend
npm run build
pm2 restart all
# Nginx health
curl https://chesster.io/health
# Backend health
curl http://localhost:5001/api/health
# Frontend (Next.js)
pm2 status
# Backend (Docker)
docker compose ps
The frontend requires Cross-Origin headers for SharedArrayBuffer (Stockfish WASM):
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
These are configured in frontend/next.config.ts.
| Endpoint | Method | Description |
|---|---|---|
/api/chat/stream | POST | SSE chat orchestrator — routes to Mastra, Clawdbot, or Python backend |
/api/chat/transcribe | POST | Voice message STT via faster-whisper (accepts WebM/Opus, max 25MB) |
/api/puzzle | POST | AI puzzle generation from position |
/api/agent | POST | Direct Mastra agent endpoint |
/api/convert-image | POST | Image processing / photo-to-FEN |
/api/gametheme | POST | Detect positional themes from FEN |
/api/themescore | POST | Score a position across theme dimensions |
| Endpoint | Method | Description |
|---|---|---|
| Chat | ||
/api/chat | POST | AI chat with conversation history & cached responses |
/api/chat/analysis/stream | POST | SSE streaming position analysis |
| Courses & Learning | ||
/api/courses | GET | List all courses |
/api/courses/<id> | GET | Get course with modules & lessons |
/api/learn/progress | GET/POST | User learning progress |
| Opening Repertoire | ||
/api/openings/repertoires | GET/POST | List/create repertoires |
/api/openings/repertoires/<id> | GET/PUT/DELETE | Repertoire CRUD |
/api/openings/repertoires/<id>/nodes | GET/POST | Opening tree nodes |
/api/openings/repertoires/<id>/nodes/<nid> | PUT/DELETE | Node CRUD |
/api/openings/repertoires/<id>/nodes/<nid>/arrows | GET/POST/DELETE | Arrow annotations |
/api/openings/repertoires/<id>/game-links | GET/POST/DELETE | Game links |
/api/openings/repertoires/<id>/export | GET | Export repertoire as PGN |
/api/openings/repertoires/<id>/import | POST | Import PGN into repertoire |
/api/openings/repertoires/<id>/training | GET/POST | Spaced repetition training |
/api/openings/games/search | GET | Search TWIC games (player, ECO, Elo, position) |
/api/openings/games/<id> | GET | Get full game PGN |
/api/openings/positions/search | GET | Search by FEN position hash |
courses -- id, title, description, slug, image_url, order
modules -- id, course_id, title, description, order
lessons -- id, module_id, title, content, fen, pgn, order
lesson_puzzles -- id, lesson_id, fen, moves, theme
user_progress -- id, user_id, lesson_id, completed, score, updated_at
user_sessions -- id, user_id, session_data, created_at
chat_history -- id, user_id, session_id, role, content, created_at
opening_repertoires -- id, user_id, name, color, description, created_at
opening_nodes -- id, repertoire_id, parent_id, fen, move, comment, nag, sort_order
opening_game_links -- id, node_id, game_source, game_id, metadata
opening_arrows -- id, node_id, from_square, to_square, color, comment
All tables use Row Level Security (RLS) policies scoped to user_id.
games_index.db — 43 GB)A comprehensive master games index built from The Week in Chess (TWIC) archives.
| Table | Rows | Description |
|---|---|---|
games | 4,350,122 | White/Black names, Elo, titles, FIDE IDs, result, date, ECO, opening, variation, event, site |
players | 116,718 | Player directory with FTS (full-text search) |
game_positions | 290,731,871 | game_id, ply number, board_hash (position fingerprint) |
metadata | — | Database version, build info |
| Index | Column(s) | Purpose |
|---|---|---|
idx_positions_hash | board_hash | Instant FEN position search across 290M positions |
idx_games_white | white_name | Player name search |
idx_games_black | black_name | Player name search |
idx_games_eco | eco | ECO code filtering |
idx_games_elo | white_elo, black_elo | Elo range filtering |
idx_games_date | date | Date range queries |
idx_games_year | year | Year filtering |
idx_games_result | result | Result filtering |
idx_games_fide | white_fide_id, black_fide_id | FIDE ID lookup |
idx_positions_game | game_id | Game → positions join |
User FEN → python-chess board_hash → SELECT game_id FROM game_positions
WHERE board_hash = ? → JOIN games → Return matching master games
backend/scripts/)| Script | Description |
|---|---|
download_twic_updates.py | Download latest TWIC PGN archives |
import_games.py | Import PGN files into SQLite games table |
index_pgn_database.py | Build the PGN database index |
add_position_index.py | Add position hash index to games_index.db |
index_positions_chunked.py | Chunked position indexing (for large datasets) |
import_lessons.py | Import course/lesson content into Supabase |
import_openings.py | Import opening data |
import_lichess_study.py | Import Lichess studies as courses |
healthcheck.py | Backend health check script |
# Download latest TWIC games
python backend/scripts/download_twic_updates.py
# Index new positions (chunked for memory efficiency)
python backend/scripts/index_positions_chunked.py
# Import a Lichess study as a course
python backend/scripts/import_lichess_study.py --study-id STUDY_ID
# Check backend health
python backend/scripts/healthcheck.py
Chesster supports 3 languages with 27 translation namespaces:
| Language | Code | Coverage |
|---|---|---|
| English | en | Full |
| Russian | ru | Full |
| Kazakh | kk | Full |
common landing auth dashboard
gamification mascot navigation learn
profile lesson course navbar
puzzle opponent editor analysis
game database chat puzzles
lichess modelSettings review board
playerSearch errors debut
Translations are managed via next-intl with runtime language switching through the LanguageSwitcher component.
Chesster ships with 16 custom piece themes:
| Anime | Apollo | Artemis | Attack |
| Cburnett | Clash | Cyborg | Fritz |
| Fritz2 | Hades | Halloween | Hera |
| Juno | Jupiter | Mars | Minerva |
Themes are selectable per-user and persist across sessions.
| Decision | Rationale |
|---|---|
| Stockfish WASM (client-side) | Zero-latency evaluation, no server load for engine analysis |
| 3-way AI routing | Cost optimization: cheap model for quick queries, premium model for deep coaching |
| SQLite for TWIC | Single-file 43GB database with custom indexes outperforms PostgreSQL for read-heavy position search |
| SSE over WebSocket | Simpler infrastructure, works through nginx without upgrades, sufficient for streaming responses |
| Next.js Pages API + App Router | API routes in Pages for SSE compatibility, UI in App Router for RSC benefits |
| PM2 + Docker | PM2 for Node.js process management with auto-restart; Docker for Python isolation |
| Clerk for auth | Zero-config auth with social login, webhook support, and Supabase integration |
Private repository. All rights reserved.
/api/openings/players/search |
| GET |
| FTS player search |
| Puzzles |
/api/puzzles | GET/POST | List/generate puzzles |
/api/puzzles/<id>/solve | POST | Submit puzzle solution |
| Opponent Analysis |
/api/opponent/analyze | POST | Analyze Chess.com/Lichess profile |
| Utilities |
/api/convert-image | POST | Photo → FEN conversion |
/api/health | GET | Backend health check |