Essen Spiel Route Planning Tool ๐ฒ
Automatically generate an optimized route through Essen Spiel based on your BoardGameGeek collection's "Want to Play" and "Want to Buy" lists.
Features
- ๐ง Auto-setup: Creates Python environment and installs dependencies automatically
- ๐ค Easy BGG collection: Interactive username collection with personalized download URLs
- ๐ฅ Smart game extraction from your BGG collection (excludes owned games and expansions by default)
- ๐ Intelligent BGG scraping with human-like delays and persistent caching
- ๐ข Essen data integration including exhibitor halls, booths, and product listings
- ๐ Advanced matching system:
- Multiple exhibitor matches per game (backup options)
- INFO field matching for abbreviated company names (CGE โ Czech Games Edition)
- Product confirmation when games are actually listed at Essen
- ๐ Rich game information: BGG ratings, complexity weight, player count, playing time
- ๐ Interactive reports: Clickable BGG links in markdown output with helpful icon legend
- ๐ Optimized routes organized by hall with priority for "Want to Buy" games
- ๐พ Multiple output formats: Markdown, CSV, and JSON
- ๐ท๏ธ Tag-based game search for your owned games with personal ratings and unplayed discovery (detailed documentation)
- ๐ฏ Individual game lookup - instantly find any BGG game's location at Essen with
./where - ๐ Web API & UI - Deploy your own instance with beautiful web interface and REST API (deployment guide)
Web API
The game lookup feature is now available as a web service with both a beautiful UI and REST API!
Web UI
- Simply paste a BoardGameGeek URL or game ID
- Get instant hall and booth information
- Mobile-friendly, responsive design
REST API Endpoints
# Look up by game ID
curl "https://your-domain.example.com/where?id=418354"
# Look up by BGG URL
curl "https://your-domain.example.com/where?link=https://boardgamegeek.com/boardgame/418354/babylon"Local Development
# Quick start with Docker
./dev.sh
# Or with Python directly
pip install -r src/api/requirements.txt
cd src && uvicorn api.main:app --reloadSee LOCAL_DEV.md for detailed development guide and DEPLOYMENT.md for production deployment.
Quick Start
Prerequisites
- Python 3.8+ (that's it!)
- The tool will help you get your BGG collection
Installation & Usage
# Clone the repository
git clone git@github.com:leobenkel/essen-route-planning.git
cd essen-route-planning
# Run everything - it handles setup automatically!
./run_allThat's it! The tool will:
- ๐ง Auto-setup: Create Python virtual environment and install dependencies
- ๐ฅ Help with BGG collection: Guide you to download your collection.csv if needed
- ๐ฏ Extract target games: Find your "Want to Play" and "Want to Buy" games
- ๐ Scrape BGG: Get publisher info (with smart caching)
- ๐ข Fetch Essen data: Get exhibitor and booth information
- ๐ Smart matching: Link your games to Essen exhibitors
- ๐ Generate route: Create your personalized Essen route
Advanced Usage
Get your BGG collection easily
If you don't have collection.csv, the tool will help:
./run_all --username=YOUR_BGG_USERNAMEThis generates the exact download URL for your collection!
Resume from a specific step
If something goes wrong:
./run_all --resume 3 # Resume from step 3Individual steps (for debugging)
# Run individual steps if needed
./scripts/step_01
./scripts/step_02
./scripts/step_03
./scripts/step_04
./scripts/step_05Get help
./run_all --helpTag Search Feature
Search your owned games by mechanics and categories (full documentation):
./search coop # Find cooperative games
./search "card game" # Find card games
./search dice # Find dice games
./search unplayed # Find owned but unplayed games
./search --list-tags # List all available tags
./search --help # Show comprehensive helpKey features: Personal ratings display, color-coded output, smart partial matching, tag statistics, and expansion filtering.
Individual Game Lookup
Instantly find any BoardGameGeek game's location at Essen:
./where https://boardgamegeek.com/boardgame/418354/babylon
./where https://boardgamegeek.com/boardgame/1406
./where boardgamegeek.com/boardgame/418354 # URL format flexible
./where --help # Show detailed helpKey features: Real-time BGG scraping, publisher matching, product confirmation, hall/booth locations, and rich game details display.
Output Files
After running, you'll find in data/output/:
ESSEN_ROUTE.md- Your personalized route through Essen, organized by hallroute_summary.csv- Spreadsheet-friendly format for printingroute_report.json- Complete data for further processing
How It Works
The pipeline runs through 5 automated steps, as shown in these screenshots from a real execution:
Pipeline Start
Running ./run_all automatically sets up the environment and begins the process.
Step 1: Collection Extraction
Uses DuckDB to efficiently query your BGG collection and extract "Want to Play" and "Want to Buy" games.
Step 2: BGG Scraping
Fetches publisher data with human-like random delays (1-3 seconds), persistent caching, and progress saving.
Step 3: Essen Data Fetching
Downloads official exhibitor and product lists from Essen Spiel APIs.
Step 4: Smart Matching
Two-tier matching system linking your games to exhibitors with fuzzy string matching.
Step 5: Route Generation
Creates your optimized route, prioritizing "Want to Buy" games and organizing by hall.
Pipeline Complete
The final result with multiple output formats ready for your Essen adventure!
Caching Strategy
The tool implements intelligent caching to:
- Avoid overwhelming BGG servers with rate-limited, human-like requests
- Cache all API responses in
data/cache/for quick re-runs - Save progress periodically for recovery from interruptions
- Allow incremental updates without re-scraping everything
Project Structure
board_games/
โโโ scripts/ # Executable step scripts
โ โโโ step_01 # Extract games from collection
โ โโโ step_02 # Scrape BGG for publisher data
โ โโโ step_03 # Fetch Essen exhibitor data
โ โโโ step_04 # Match publishers to exhibitors
โ โโโ step_05 # Generate optimized route
โโโ src/
โ โโโ steps/ # Processing pipeline steps
โ โ โโโ step1_extract_games.py
โ โ โโโ step2_scrape_bgg.py
โ โ โโโ step3_fetch_essen_data.py
โ โ โโโ step4_match_publishers.py
โ โ โโโ step5_generate_route.py
โ โ โโโ search_tags.py # Tag search CLI interface
โ โ โโโ where.py # Individual game lookup CLI
โ โโโ data_models.py # Pydantic models for type safety
โ โโโ collection_extractor.py # DuckDB-based collection parsing
โ โโโ bgg_scraper.py # BGG API scraping with caching
โ โโโ unified_enricher.py # Unified game enrichment system
โ โโโ tag_search.py # Tag search functionality
โ โโโ game_lookup.py # Individual game lookup service
โ โโโ url_parser.py # BGG URL parsing utilities
โ โโโ utils.py # Shared utilities
โ โโโ __init__.py
โโโ docs/
โ โโโ TAG_SEARCH_FEATURE.md # Detailed tag search documentation
โโโ data/
โ โโโ cache/ # Persistent caching for API responses
โ โ โโโ bgg/ # BGG page cache subfolder
โ โโโ output/ # Generated route files
โ โโโ ESSEN_ROUTE.md # Human-readable route
โ โโโ ESSEN_ROUTE.html # Browser-friendly format
โ โโโ route_summary.csv # Google Sheets compatible
โ โโโ *.json # Intermediate processing files
โโโ search # Tag search entry point script
โโโ where # Individual game lookup script
โโโ collection.csv # Your BGG collection (git-ignored)
โโโ README.md # This file
โโโ requirements.txt # Python dependencies
Configuration
Expansion Filtering
By default, the tool excludes board game expansions since they're typically sold at the same booth as the base game. This helps focus your route on discovering new publishers and booths.
- Default behavior: Excludes expansions (recommended)
- Include expansions: Use
./step_01 --include-expansions - Interactive mode: The tool will show you which expansions would be filtered and let you choose
Example expansions that get filtered:
- "Arkham Horror: Dunwich Legacy"
- "Wingspan: European Expansion"
- "T.I.M.E Stories: Madame"
Matching Thresholds
The matching thresholds can be adjusted in src/steps/step4_match_publishers.py:
- Publisher matching: 80% similarity (default)
- Product title matching: 85% similarity (default)
Troubleshooting
"collection.csv not found"
Download your collection from BGG: https://boardgamegeek.com/collection/user/YOUR_USERNAME
BGG scraping is slow
This is intentional! The scraper uses human-like delays (1-3 seconds) to respect BGG's servers. The cache ensures you only need to do this once.
Some games aren't matched
Not all publishers may have booths at Essen. Check data/output/matched_games.json for details on unmatched games.
API errors
The tool caches all responses. If an API is down, you can often continue with cached data.
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Test your changes with the step scripts
- Submit a pull request
License
MIT License - See LICENSE file
Acknowledgments
- BoardGameGeek for their comprehensive game database
- Essen Spiel for their exhibitor APIs
- The board gaming community ๐ฒ
Contact
Created by @leobenkel
Happy gaming at Essen Spiel! ๐ฏ









