Chess Analyzer Pro stores all data locally in platform-specific user data directories. No data is uploaded to any server.
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/ChessAnalyzerPro/ |
| Windows | %APPDATA%/ChessAnalyzerPro/ |
| Linux | ~/.local/share/chessanalyzerpro/ or $XDG_DATA_HOME/chessanalyzerpro/ |
| File | Purpose |
|---|---|
config.json | User settings and preferences |
analysis_cache.db | SQLite database with position cache and game history |
openings.db | SQLite opening book database (generated from TSV files) |
chess_analyzer.log | Application log file (created in working directory) |
Stores all user-configurable settings. Created on first launch with default values.
{
"engine_path": "stockfish",
"polyglot_book_path": "",
"theme": "dark",
"sound_enabled": true,
"analysis_depth": 18,
"multi_pv": 2,
"live_analysis_time": 0.5,
"engine_threads": 1,
"engine_hash": 128,
"api_games_limit": 20,
"board_theme": "Green",
"piece_theme": "Standard",
"accent_color": "#FF9500",
"lichess_token": "",
"chesscom_username": "",
"lichess_username": "",
"llm_profiles": [],
"llm_active_profile": "",
"window_state": {"x": null, "y": null, "width": null, "height": null},
"setup_completed": true,
"settings_mode": "basic",
"last_update_check": "2026-07-12"
}
Settings can be modified through the Settings UI or by editing the file directly while the app is closed.
SQLite database containing two tables.
analysis table (position cache)Caches engine evaluations to avoid redundant computation. Cache key is a SHA-256 hash of the FEN string and Multi-PV setting.
| Column | Type | Description |
|---|---|---|
| id | TEXT (PK) | SHA256(FEN + multi_pv) |
| fen | TEXT | FEN string |
| engine_params | TEXT | JSON of engine configuration |
| depth | INTEGER | Analysis depth |
| result | TEXT | JSON of analysis result |
Cache is depth-aware: returns cached result only if cached_depth >= requested_depth. Uses WAL journal mode for concurrent reads.
games table (game history)| Column | Type | Description |
|---|---|---|
| id | TEXT (PK) | MD5 hash of PGN content |
| white | TEXT | White player name |
| black | TEXT | Black player name |
| result | TEXT | Game result (1-0, 0-1, ½-½, *) |
| date | TEXT | Game date from PGN |
| event | TEXT | Event name |
| pgn | TEXT | Full PGN content |
| summary_json | TEXT | JSON of analysis summary (accuracies, classifications, etc.) |
| timestamp | REAL | Unix timestamp of when the game was analyzed |
| white_elo | TEXT | White player ELO rating |
| black_elo | TEXT | Black player ELO rating |
| time_control | TEXT | Time control (e.g. "600+0") |
| eco | TEXT | ECO opening code |
| termination | TEXT | Termination type (checkmate, resignation, timeout, etc.) |
| opening | TEXT | Human-readable opening name |
| starting_fen | TEXT | Starting FEN (for Chess960 or non-standard positions) |
| source | TEXT | Game source (file, chesscom, lichess) |
| chess960 | INTEGER | 1 if Chess960, 0 otherwise |
Columns after timestamp were added via ALTER TABLE in successive versions - the database handles missing columns gracefully.
| Method | Description |
|---|---|
save_game(game_analysis, pgn_content) | Insert or replace a game record |
get_all_games() | Returns last 200 games ordered by timestamp descending |
get_games_for_users(usernames) | Case-insensitive filter by player names |
get_game(game_id) | Returns a single game by ID |
delete_game(game_id) | Removes a game |
game_exists(game_id) | Checks if a game is already stored |
clear_history() | Removes all game records |
SQLite opening book database generated from the Lichess ECO dataset (TSV files in assets/openings/a.tsv through e.tsv).
opening_nodes table| Column | Type | Description |
|---|---|---|
| id | INTEGER (PK) | Auto-increment ID |
| fen | TEXT (UNIQUE) | Normalized FEN (first 4 fields) |
opening_edges table| Column | Type | Description |
|---|---|---|
| parent_id | INTEGER (FK) | Parent node ID |
| child_id | INTEGER (FK) | Child node ID |
| move_san | TEXT | SAN notation |
| PK | (parent_id, move_san) |
node_openings table| Column | Type | Description |
|---|---|---|
| node_id | INTEGER (FK) | Node ID |
| eco | TEXT | ECO code |
| opening_name | TEXT | Human-readable opening name |
| PK | (node_id, eco) |
opening_book_metadata table| Column | Type | Description |
|---|---|---|
| version | TEXT (PK) | Schema version |
| imported_at | DATETIME | When the database was populated |
Game history can be exported to CSV from the History tab. The CSV includes all game metadata and summary fields. Column headers must not be modified - modified CSV files may fail on import.
File: chess_analyzer.log (created in the directory where the application is launched)
The logger captures:
View last 100 lines:
tail -100 chess_analyzer.log
Search for errors:
grep "ERROR" chess_analyzer.log