| # Wrdler - Project Context | |
| ## Project Overview | |
| Wrdler is a simplified vocabulary puzzle game based on BattleWords, with these key differences: | |
| - **8x6 grid** (instead of 12x12) | |
| - **One word per row, horizontal only** (no vertical words) | |
| - **No scope/radar visualization** | |
| - **2 free letter guesses at game start** (all instances of chosen letters are revealed) | |
| **Current Version:** 0.0.4 | |
| **Repository:** https://github.com/Oncorporation/Wrdler.git | |
| **Live Demo:** [DEPLOYMENT_URL_HERE] | |
| ## Recent Changes | |
| **v0.0.4 (Current):** | |
| - β Version updated in `__init__.py` to 0.0.4 | |
| - β Documentation synchronized across all files | |
| - β Project structure validated and consistent | |
| - β All Phase 1 requirements complete (7 sprints) | |
| - β 100% test coverage (25/25 tests passing) | |
| - **Status: Ready for deployment!** π | |
| **v0.0.2-0.0.3 (Previous):** | |
| - β All 7 sprints complete (12.75 hours development time) | |
| - β Core data models updated for rectangular 8Γ6 grid | |
| - β Generator refactored for horizontal-only, one-per-row placement | |
| - β Radar/scope visualization removed (~217 lines) | |
| - β Free letter selection UI with circular green gradient buttons | |
| - β Grid UI updated for 8Γ6 display with responsive layout | |
| - β Comprehensive integration testing suite | |
| - β Complete documentation (GAMEPLAY_GUIDE.md) | |
| - β Fixed duplicate rendering call bug | |
| - β PWA support with service worker and manifest | |
| ## Core Gameplay | |
| - 8x6 grid with 6 hidden words (one per row, horizontal only) | |
| - **Word composition:** 2 four-letter words, 2 five-letter words, 2 six-letter words | |
| - No scope/radar visualization | |
| - Players start by choosing 2 letters; all instances are revealed | |
| - Players click cells to reveal letters or empty spaces | |
| - After revealing a letter, players can guess words | |
| - Scoring: word length + bonus for unrevealed letters | |
| - Game ends when all words are guessed or all word letters are revealed | |
| - Incorrect guess history with optional display (enabled by default) | |
| - 10 incorrect guess limit per game | |
| - **β IMPLEMENTED:** Challenge Mode with game sharing via short URLs | |
| - **β IMPLEMENTED:** Remote storage via Hugging Face datasets | |
| - **β IMPLEMENTED:** PWA install support (v0.2.28+) | |
| - **PLANNED:** Local persistent storage for game results and high scores (v0.3.0) | |
| ### Scoring Tiers | |
| - **Fantastic:** 42+ points | |
| - **Great:** 38-41 points | |
| - **Good:** 34-37 points | |
| - **Keep practicing:** < 34 points | |
| ## Technical Architecture | |
| ### Technology Stack | |
| - **Framework:** Streamlit 1.51.0 | |
| - **Language:** Python 3.12.8 (requires >=3.12, <3.13) | |
| - **Visualization:** Matplotlib (>=3.8) | |
| - **HTTP Requests:** requests (>=2.31.0) | |
| - **Remote Storage:** huggingface_hub (>=0.20.0) | |
| - **Environment:** python-dotenv (>=1.0.0) | |
| - **Testing:** Pytest | |
| - **Package Manager:** UV or pip | |
| ### Project Structure | |
| ``` | |
| wrdler/ | |
| βββ app.py # Streamlit entry point | |
| βββ wrdler/ # Main package | |
| β βββ __init__.py # Version: 0.0.4 | |
| β βββ models.py # Data models (Coord, Word, Puzzle, GameState) | |
| β βββ generator.py # Puzzle generation with deterministic seeding | |
| β βββ logic.py # Game mechanics (reveal, guess, scoring) | |
| β βββ ui.py # Streamlit UI | |
| β βββ word_loader.py # Word list management | |
| β βββ audio.py # Background music system | |
| β βββ sounds.py # Sound effects management | |
| β βββ generate_sounds.py # Sound generation utilities | |
| β βββ game_storage.py # HF game storage wrapper | |
| β βββ version_info.py # Version display | |
| β βββ modules/ # Shared utility modules (from OpenBadge) | |
| β β βββ __init__.py # Module exports | |
| β β βββ storage.py # HuggingFace storage & URL shortener | |
| β β βββ storage.md # Storage module documentation | |
| β β βββ constants.py # Storage-related constants (trimmed) | |
| β β βββ file_utils.py # File utility functions | |
| β βββ words/ # Word list files | |
| β βββ classic.txt # Default word list | |
| β βββ fourth_grade.txt # Elementary word list | |
| β βββ wordlist.txt # Full word list | |
| βββ tests/ # Unit tests | |
| β βββ test_sprint6_integration.py # Comprehensive integration tests | |
| βββ specs/ # Documentation | |
| β βββ specs.md # Game specifications | |
| β βββ requirements.md # Implementation requirements | |
| β βββ wrdler_implementation_plan.md # Sprint planning summary | |
| βββ static/ # PWA assets | |
| β βββ manifest.json # PWA manifest | |
| β βββ service-worker.js # Service worker for offline caching | |
| β βββ icons/ # App icons | |
| βββ .env # Environment variables (HF credentials) | |
| βββ pyproject.toml # Project metadata | |
| βββ requirements.txt # Dependencies | |
| βββ uv.lock # UV lock file | |
| βββ Dockerfile # Container deployment | |
| βββ README.md # User-facing documentation | |
| βββ CLAUDE.md # This file - project context for Claude | |
| βββ GAMEPLAY_GUIDE.md # User guide with tips and strategies | |
| βββ RELEASE_NOTES_v0.0.4.md # Complete release documentation | |
| ``` | |
| ## Key Features | |
| ### Game Modes | |
| 1. **Classic Mode:** Allows consecutive guessing after correct answers | |
| 2. **Too Easy Mode:** Single guess per reveal | |
| ### Audio & Visual Effects | |
| - **Background Music:** Toggleable ocean-themed background music with volume control | |
| - **Sound Effects:** Hit/miss/correct/incorrect guess sounds with volume control | |
| - **Ocean Theme:** Gradient animated background with wave effects | |
| - **Incorrect Guess History:** Visual display of wrong guesses (toggleable in settings) | |
| ### β Challenge Mode & Remote Storage (v0.2.20+) | |
| - **Game ID System:** Short URL-based challenge sharing | |
| - Format: `?game_id=<sid>` in URL (shortened URL reference) | |
| - Each player gets different random words from the same wordlist | |
| - Enables fair challenges between players | |
| - Stored in Hugging Face dataset repository | |
| - **Remote Storage via HuggingFace Hub:** | |
| - Per-game settings JSON in `games/{uid}/settings.json` | |
| - Shortened URL mapping in `shortener.json` | |
| - Multi-user leaderboards with score, time, and difficulty tracking | |
| - Results sorted by: highest score β fastest time β highest difficulty | |
| - **Challenge Features:** | |
| - Submit results to existing challenges | |
| - Create new challenges from any completed game | |
| - Top 5 leaderboard display in Challenge Mode banner | |
| - Optional player names (defaults to "Anonymous") | |
| - Word list difficulty calculation and display (v0.2.29) | |
| - "Show Challenge Share Links" toggle (default OFF) to control URL visibility (v0.2.27) | |
| ### β Progressive Web App (PWA) Support (v0.2.28+) | |
| - **PWA Installation:** App is installable as a Progressive Web App on desktop and mobile | |
| - Service worker for basic offline caching of static assets | |
| - Manifest.json with app metadata and icons | |
| - Platform-specific installation instructions in INSTALL_GUIDE.md | |
| - No gameplay logic changes required | |
| - Works offline for basic functionality | |
| ### PLANNED: Local Player Storage (v0.3.0) | |
| - **Local Storage:** | |
| - Location: `~/.wrdler/data/` | |
| - Files: `game_results.json`, `highscores.json` | |
| - Privacy-first: no cloud dependency, offline-capable | |
| - **Personal High Scores:** | |
| - Top 100 scores tracked automatically on local machine | |
| - Filterable by wordlist and game mode | |
| - High score sidebar expander display | |
| - **Player Statistics:** | |
| - Games played, average score, best score | |
| - Fastest completion time | |
| - Per-player history on local device | |
| ### Puzzle Generation | |
| - Horizontal-only word placement (one per row in 8Γ6 grid) | |
| - **Word length distribution:** Each puzzle contains exactly 2 four-letter words, 2 five-letter words, and 2 six-letter words | |
| - Deterministic seeding support for reproducible puzzles | |
| - No word spacing configuration (fixed one word per row) | |
| - Validation ensures no overlaps, proper bounds, correct word distribution | |
| ### UI Components (v0.0.2 - Implemented) | |
| - **Game Grid:** Interactive 8Γ6 button grid (48 cells) with responsive layout | |
| - **Free Letter Selection:** Circular green gradient buttons (2 at game start) | |
| - **Score Panel:** Real-time scoring with client-side JavaScript timer | |
| - **Settings Sidebar:** | |
| - Word list picker (classic, fourth_grade, wordlist) | |
| - Game mode selector (Classic, Too Easy) | |
| - Audio volume controls (music and effects separate) | |
| - Toggle for incorrect guess history display | |
| - Player name input | |
| - "Show Challenge Share Links" toggle (default OFF) | |
| - Enable/disable sound effects checkbox | |
| - Enable/disable background music checkbox | |
| - **Theme System:** Ocean gradient background with CSS animations | |
| - **Game Over Dialog:** Final score display with tier ranking | |
| - **Incorrect Guess Display:** Shows history of wrong guesses with count | |
| - **Challenge Mode UI:** | |
| - Challenge Mode banner with leaderboard (top 5 players) | |
| - Share challenge button in game over dialog | |
| - Submit result or create new challenge options | |
| - Word list difficulty display | |
| - **PLANNED (v0.3.0):** Local high scores expander and personal statistics display | |
| ### Development Status | |
| **Current Version:** v0.0.4 (Complete) | |
| - β All 7 sprints complete | |
| - β 100% test coverage (25/25 tests) | |
| - β Ready for production deployment | |
| - β PWA support implemented | |
| - β Challenge Mode fully functional | |
| - π Development time: ~12.75 hours (sprints 1-7) | |
| - π Complete documentation | |
| **Next Version:** v0.3.0 (Planned) | |
| - π Local storage module (`wrdler/local_storage.py`) | |
| - π Personal high score tracking (local JSON files) | |
| - π High score sidebar UI display | |
| - π Player statistics tracking and display | |
| ## Data Models | |
| ### Core Classes | |
| ```python | |
| @dataclass | |
| class Coord: | |
| x: int # row, 0-based | |
| y: int # col, 0-based | |
| @dataclass | |
| class Word: | |
| text: str | |
| start: Coord | |
| direction: Direction # "H" or "V" | |
| cells: List[Coord] | |
| @dataclass | |
| class Puzzle: | |
| words: List[Word] | |
| radar: List[Coord] | |
| may_overlap: bool | |
| spacer: int | |
| uid: str # Unique identifier for caching | |
| @dataclass | |
| class GameState: | |
| grid_size: int | |
| puzzle: Puzzle | |
| revealed: Set[Coord] | |
| guessed: Set[str] | |
| score: int | |
| last_action: str | |
| can_guess: bool | |
| game_mode: str | |
| points_by_word: Dict[str, int] | |
| start_time: Optional[datetime] | |
| end_time: Optional[datetime] | |
| ``` | |
| ## Development Workflow | |
| ### Running Locally | |
| ```bash | |
| # Install dependencies | |
| uv pip install -r requirements.txt --link-mode=copy | |
| # Run app | |
| uv run streamlit run app.py | |
| # or | |
| streamlit run app.py | |
| ``` | |
| ### Docker Deployment | |
| ```bash | |
| docker build -t wrdler . | |
| docker run -p 8501:8501 wrdler | |
| ``` | |
| ### Testing | |
| ```bash | |
| pytest tests/ | |
| ``` | |
| ### Environment Variables (for Challenge Mode) | |
| Challenge Mode requires HuggingFace Hub access for remote storage. Create a `.env` file in the project root: | |
| ```bash | |
| # Required for Challenge Mode | |
| HF_API_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxx # or HF_TOKEN | |
| HF_REPO_ID=YourUsername/YourRepo # Target HF dataset repo | |
| SPACE_NAME=YourUsername/Wrdler # Your HF Space name | |
| # Optional | |
| CRYPTO_PK= # Reserved for future signing | |
| ``` | |
| **How to get your HF_API_TOKEN:** | |
| 1. Go to https://huggingface.co/settings/tokens | |
| 2. Create a new token with `write` access | |
| 3. Add to `.env` file as `HF_API_TOKEN=hf_...` | |
| **HF_REPO_ID Structure:** | |
| The dataset repository will contain: | |
| - `shortener.json` - Short URL mappings | |
| - `games/{uid}/settings.json` - Per-game challenge data | |
| - `games/{uid}/result.json` - Optional detailed results | |
| **Note:** The app will work without these variables but Challenge Mode features (sharing, leaderboards) will be disabled. | |
| ## Git Configuration & Deployment | |
| **Current Branch:** main | |
| **Purpose:** Wrdler - vocabulary puzzle game with simplified 8x6 grid | |
| **Main Branch:** main | |
| ### Remotes | |
| - **ONCORP (origin):** https://github.com/Oncorporation/Wrdler.git (main repository) | |
| - **Hugging Face Spaces:** https://huggingface.co/spaces/[USERNAME]/Wrdler (live deployment) | |
| ### Deployment Platforms | |
| 1. **Hugging Face Spaces** (Primary) - Dockerfile deployment | |
| 2. **Local Development** - Streamlit run | |
| 3. **Docker** - Containerized deployment | |
| 4. **PWA** - Installable web app on any platform | |
| ## Sprint Summary (v0.0.2 - Complete) | |
| | Sprint | Description | Time | Tests | Status | | |
| |--------|-------------|------|-------|--------| | |
| | Sprint 1 | Core Data Models | 3h | 13/13 β | Complete | | |
| | Sprint 2 | Puzzle Generator | 3h | 5/5 β | Complete | | |
| | Sprint 3 | Remove Radar | 0.5h | N/A | Complete | | |
| | Sprint 4 | Free Letters UI | 2h | Manual β | Complete | | |
| | Sprint 5 | Grid UI Updates | 1.25h | Syntax β | Complete | | |
| | Sprint 6 | Integration Testing | 2h | 7/7 β | Complete | | |
| | Sprint 7 | Documentation | 1h | N/A | Complete | | |
| | **Total** | **All Features** | **12.75h** | **25/25** | **Complete β ** | | |
| **Status:** Ready for deployment! π | |
| ## Post-v0.0.2 Enhancements | |
| ### v0.2.20-0.2.29 (Challenge Mode & PWA) | |
| - Remote storage and game sharing via HF datasets | |
| - Multi-user leaderboards | |
| - PWA support with offline caching | |
| - Word list difficulty calculation | |
| - Privacy controls for challenge sharing | |
| - Sound effect and music system improvements | |
| ## Future Roadmap | |
| ### v0.3.0 (Next Phase) | |
| - Local persistent storage module (`~/.wrdler/data/`) | |
| - High score tracking and display | |
| - Player statistics tracking | |
| - Enhanced UI animations | |
| ### v1.0.0 (Long Term) | |
| - Multiple difficulty levels | |
| - Daily puzzle mode | |
| - Internationalization (i18n) | |
| - Performance optimizations | |
| - Advanced word list management | |
| ## Deployment Targets | |
| - **Hugging Face Spaces:** Primary deployment platform (Dockerfile-based) | |
| - **Docker:** Containerized deployment for any platform | |
| - **Local:** Development and testing | |
| - **PWA:** Installable on desktop and mobile devices | |
| ### Privacy & Data (v0.0.4) | |
| - **Challenge Mode:** Optional remote storage via Hugging Face datasets | |
| - Player names optional (defaults to "Anonymous") | |
| - Only stores: word lists, scores, times, game modes | |
| - No PII beyond optional player name | |
| - User controls URL visibility via "Show Challenge Share Links" toggle | |
| - **Local Storage (v0.3.0 - Planned):** | |
| - Location: `~/.wrdler/data/` | |
| - Privacy-first, offline-capable | |
| - Easy to delete | |
| - No cloud dependency | |
| ## Notes for Claude | |
| ### Technical Implementation | |
| - β Project uses modern Python features (3.12.8) | |
| - β Requires Python >=3.12, <3.13 per pyproject.toml | |
| - β Heavy use of Streamlit session state for game state management | |
| - β Client-side JavaScript for timer updates without page refresh | |
| - β CSS heavily customized for ocean theme aesthetics | |
| - β All file paths should be absolute when working in WSL environment | |
| - β Game IDs are deterministic for consistent sharing | |
| - β 8Γ6 rectangular grid (grid_rows=6, grid_cols=8) | |
| - β Horizontal-only word placement (one per row) | |
| - β Radar/scope visualization removed entirely | |
| - β Free letter selection UI implemented with circular buttons | |
| - β PWA injection via Docker build script (`inject-pwa-head.sh`) | |
| ### Key Implementation Details | |
| - **No radar field in Puzzle dataclass** - removed in Sprint 3 | |
| - **No vertical word placement** - horizontal only ("H" direction) | |
| - **Fixed grid dimensions** - always 8x6 (grid_cols=8, grid_rows=6) | |
| - **One word per row** - exactly 6 words total | |
| - **Word length requirement** - exactly 2 four-letter words, 2 five-letter words, and 2 six-letter words per puzzle | |
| - **Free letters tracked** - `free_letters` set and `free_letters_used` counter | |
| - **Auto-completion** - words auto-marked when all letters revealed | |
| - **Incorrect guess limit** - maximum 10 per game | |
| ### WSL Environment Python Versions | |
| The development environment is WSL (Windows Subsystem for Linux) with access to both native Linux and Windows Python installations: | |
| **Native WSL (Linux):** | |
| - `python3` β Python 3.10.12 (`/usr/bin/python3`) | |
| - `python3.10` β Python 3.10.12 | |
| **Windows Python (accessible via WSL):** | |
| - `python311.exe` β Python 3.11.9 (`/mnt/c/Users/cfettinger/AppData/Local/Programs/Python/Python311/`) | |
| - `python3.13.exe` β Python 3.13.1 (`/mnt/c/ProgramData/chocolatey/bin/`) | |
| **Note:** Windows Python executables (`.exe`) can be invoked directly from WSL and are useful for testing compatibility across Python versions. The project targets Python 3.12.8 specifically but requires >=3.12, <3.13 per pyproject.toml. | |
| ## Documentation Structure | |
| This file (CLAUDE.md) serves as a **living context document** for AI-assisted development: | |
| - **[specs/specs.md](specs/specs.md)** - Game rules, requirements, and feature specifications | |
| - **[specs/requirements.md](specs/requirements.md)** - Implementation requirements and acceptance criteria | |
| - **[GAMEPLAY_GUIDE.md](GAMEPLAY_GUIDE.md)** - User guide with tips and strategies | |
| - **[INSTALL_GUIDE.md](INSTALL_GUIDE.md)** - PWA installation instructions | |
| - **[README.md](README.md)** - User-facing documentation, installation guide, and complete changelog | |
| - **[Dockerfile](Dockerfile)** - Container deployment configuration with PWA injection | |
| - **[pyproject.toml](pyproject.toml)** - Python project metadata and dependencies | |
| **When to use each:** | |
| - **specs.md** - Understanding game rules and scoring system | |
| - **requirements.md** - Implementation status and acceptance criteria | |
| - **CLAUDE.md** - Quick reference for codebase and development context | |
| - **GAMEPLAY_GUIDE.md** - How to play the game | |
| - **README.md** - Public-facing info, setup instructions, and complete changelog | |
| - **INSTALL_GUIDE.md** - Installing Wrdler as a PWA | |
| - **Dockerfile** - Deployment configuration and container setup | |
| ## Challenge Mode & Remote Storage | |
| - β Challenge Mode allows sharing games via short links (`?game_id=<sid>`) | |
| - β Results stored in Hugging Face dataset repos via `game_storage.py` | |
| - β Leaderboard sorted by: highest score β fastest time β highest difficulty | |
| - β Multi-user challenges with top 5 display | |
| - β Optional sharing (controlled by "Show Challenge Share Links" toggle, default OFF) | |
| - β Word list difficulty calculation (v0.2.29) | |
| - β iframe embedding support with `&iframe_host=` parameter (v0.2.23) | |
| ## Known Issues | |
| ### Active | |
| - β Word list loading bug: the app may not select the proper word lists in some environments. Investigate `word_loader.get_wordlist_files()` / `load_word_list()` and sidebar selection persistence to ensure the chosen file is correctly used by the generator. | |
| ### Resolved | |
| - β Duplicate rendering call bug (fixed in v0.0.2) | |
| - β Music looping on congratulations screen (fixed in v0.2.12) | |
| - β Sound effect and music volume wiring (fixed in v0.2.18, v0.2.19) | |
| - β Sonar grid alignment (removed in Sprint 3) | |
| - β Challenge mode link issues (fixed in v0.2.22) | |
| ## Dependencies | |
| From `requirements.txt`: | |
| - streamlit>=1.51.0 (primary framework) | |
| - matplotlib>=3.8 (visualization) | |
| - requests>=2.31.0 (HTTP requests) | |
| - huggingface_hub>=0.20.0 (remote storage) | |
| - python-dotenv>=1.0.0 (environment variables) | |
| From `pyproject.toml`: | |
| - Python >=3.12, <3.13 (strict version requirement) | |
| ## Version History Summary | |
| - **v0.0.4** (Current) - Documentation sync, version update | |
| - **v0.0.2-0.0.3** - All 7 sprints complete, core Wrdler features | |
| - **v0.2.20-0.2.29** - Challenge Mode, PWA, remote storage (inherited from BattleWords) | |
| - **v0.1.x** - Initial BattleWords releases before Wrdler fork | |
| See README.md for complete changelog. | |
| --- | |
| **Last Updated:** 2025-01-31 | |
| **Current Version:** 0.0.4 | |
| **Status:** Production Ready - All Features Complete β | |
| ## Test File Location | |
| All test files must be placed in the `/tests` folder. This ensures a clean project structure and makes it easy to discover and run all tests. | |