- Changed button text to "🔗 Share this challenge link" and added tooltip for sharing instructions.
- Moved share URL above the copy button, styled for higher visibility.
- Removed old, less visible share URL display below the button.
- Overall, improved clarity and accessibility of the share link UI.
Launch Challenge: launching a highlighted run now returns to the default play screen and opens the generated challenge via ?game_id=<sid> instead of reloading the leaderboard page.
Game-over share controls are hidden by default (UI visibility change only).
17 days ago
fix: patch AgGrid iframe sandbox for top-navigation
Added client-side script to leaderboard table rendering to inject `allow-top-navigation` and `allow-top-navigation-by-user-activation` into AgGrid iframe sandbox, enabling same-tab challenge links. Script reloads iframe and is non-fatal if blocked. Documented in code and spec.
Bump version to 0.4.2, update challenge link targets
Updated version numbers to 0.4.2 in all docs and __init__.py. Changed leaderboard and share challenge links to open with target="_top" instead of "_blank" in both UI and docs, ensuring links open in the top-level frame. Removed rel="noopener noreferrer" from share links. Minor doc clarifications.
18 days ago
chore: bump version to 0.4.1, improve leaderboard challenge link
- Increment project version to 0.4.1 in code and docs
- Update documentation for new version, features, and last updated date
- Persist generated challenge `sid` in leaderboard via `submit_to_leaderboard(source_challenge_id=sid)` for permanent 🎯 marker
- Change challenge link to open in same tab (`target="_self"`)
- Optimistically update leaderboard UI with new `sid` after challenge creation
- Add session state flags for challenge creation/persistence feedback
- Refactor leaderboard code for robust, case-insensitive UID matching
- Improve UI stability, query param handling, and error feedback
- Update `pyproject.toml` and `__init__.py` for new version and leaderboard behavior
Improve query param handling with st.query_params and errors
Switch to st.query_params for retrieving parameters like "uid" and "game_id". Add error handling to avoid exceptions for missing or malformed params. Return the first element if the value is a list/tuple, else return the value. Return None on exception for robustness.
chore: bump to 0.4.0, Streamlit 1.56+; challenge link UI
- Version bump to 0.4.0; require Streamlit 1.56+ and update docs
- Migrate all query param handling to `st.query_params`
- Add "🔗 Generate Challenge Link" button to leaderboard nav (server-side, visible with `?uid=`, not `?game_id=`)
- Leaderboard: improved UID matching (case/whitespace tolerant), fallback to `game_id` if challenge not yet propagated
- AgGrid Player cell: 🎯 marker now clickable link via hidden `challenge_url` column; nav preserves query params
- Refactor `save_game_to_hf` for sanitized UID folders and deduplication
- Add `sanitize_folder_name` utility
- Update specs and docs for new challenge flow and robust UID matching
The falling text animation for legendary scores now includes all puzzle words, not just "LEGENDARY!" and "🏛️ HALL OF LEGENDS". Font sizes, speeds, and animation duration have been adjusted to fit the expanded word list and create a more elaborate effect.
19 days ago
Add history_start_week/day fields to JSON config files
Added "history_start_week" and "history_start_day" fields to classic-classic-0.json, classic-classic-1.json, classic-classic-full_sound_free_letters.json, and default.json. No other changes to existing fields or structure.
feat: stable player UIDs, profanity filter, UI/UX, v0.3.9
Introduced stable player_uid for leaderboard deduplication and row highlighting. Added profanity filtering for usernames and word lists using better-profanity. Improved leaderboard UI with challenge links, row highlighting, and navigation context. Hardened settings page session state handling. Updated word lists and documentation for v0.3.9. Added better-profanity dependency. Internal refactoring and minor UI/CSS tweaks for robustness and usability.
27 days ago
Bump version to 0.3.8, doc updates, share/leaderboard UX
Updated docs and version to 0.3.8. Added "Recent Changes" sections. Enhanced challenge share link UX and added "Generate Challenge Link" button. Improved leaderboard panel contrast and leaderboard links now include game_id for context. Added wrdler/similarity.py for semantic ranking. Minor mobile and word list fixes. Updated project structure in CLAUDE.md.
Improve challenge share link UI, update docs to v0.3.8
- Bump version to 0.3.8 in README.md and __init__.py; update last updated date
- Add "Recent Changes (v0.3.8)" section to README.md for share link updates
- Enhance challenge share link UI: add copy-to-clipboard tooltip, clearer feedback ("✅ Copied to Clipboard!"), and accessibility improvements
- Replace Streamlit code block with custom HTML/CSS/JS copy button in game over panel for better clipboard support and feedback
- Improve leaderboard panel background contrast
- Allow challenge link generation from game over screen, handling new/existing shared games with error handling and session state updates
- Minor UI tweaks and code comments for clarity
feat: add semantic word ranking with SentenceTransformer
Added similarity.py for semantic word ranking using SentenceTransformer embeddings. Includes lazy model loading, word list utilities, related_words and related_to_topic functions, integration plan, and CLI demo for ranking vocabulary by similarity to a seed or topic. Enables thematically related word selection for puzzle generation.
- Leaderboard table now auto-sizes grid height to fit all rows, removing internal scroll bars and enforcing a minimum height.
- Updated scroll-to-anchor JS in `ui.py` to avoid triggering inside Streamlit dialogs and switched scroll behavior to "instant" for smoother UX.
- Refined input focus-and-scroll logic to use `scrollIntoView` with `{ behavior: "instant", block: "nearest" }`, reducing UI jitter.
- Leaderboard table now auto-sizes grid height to fit all rows, removing internal scroll bars and enforcing a minimum height.
- Updated scroll-to-anchor JS in `ui.py` to avoid triggering inside Streamlit dialogs and switched scroll behavior to "instant" for smoother UX.
- Refined input focus-and-scroll logic to use `scrollIntoView` with `{ behavior: "instant", block: "nearest" }`, reducing UI jitter.
Leaderboard panel in ui.py now has id, tabindex, and higher z-index for accessibility. After submission, focus is managed for better UX. Added new words to classic.txt for BEND, CASE, REMARK, STRONG, and VACANT categories.
Added utility functions in hall_of_legends.py for ISO week string parsing, validation, existence checks, week adjustment, formatting, and listing available weeks to support weekly leaderboard logic. Introduced GAMES_LEADERBOARDS_WEEKLY in constants.py as a global cache for available weekly leaderboard folders. Updated imports accordingly.
Hall of Legends tooltips, docs, UI, and vocab update
- Documented Hall of Legends (v1.4.8) and new "hall" entry_type in leaderboard_spec.mdx, including UI/UX and accessibility for tooltips.
- Added CSS-only mouse-over tooltips to hall_of_legends.py table rows (player, score, tier, word list, timestamp), with 2s delay and a11y improvements; updated columns to show elapsed time and date.
- Allowed st.html to use unsafe_allow_javascript in ui.py for score panel.
- Tweaked CSS for overflow and mobile footer in ui_helpers.py.
- Expanded classic.txt word lists with new vocabulary.
Enhanced guess input focus by moving JS to _render_grid, ensuring focus on allowed guesses. Refined rerun logic after reveals: full app rerun on word/game end, fragment rerun otherwise. Updated CSS in _render_guess_form for layout and input accessibility. Tweaked .bw-radio-caption styling in ui_helpers.py for readability.
Hall of Legends tooltips, docs, UI, and vocab update
- Documented Hall of Legends (v1.4.8) and new "hall" entry_type in leaderboard_spec.mdx, including UI/UX and accessibility for tooltips.
- Added CSS-only mouse-over tooltips to hall_of_legends.py table rows (player, score, tier, word list, timestamp), with 2s delay and a11y improvements; updated columns to show elapsed time and date.
- Allowed st.html to use unsafe_allow_javascript in ui.py for score panel.
- Tweaked CSS for overflow and mobile footer in ui_helpers.py.
- Expanded classic.txt word lists with new vocabulary.
Update leaderboard UI text and expand classic word list
Standardized "Today" in leaderboard UI and help text. Clarified history tab help. Corrected comment in classic.txt and added many new words to the word list, enhancing vocabulary coverage.
feat: config-driven leaderboard history & version 0.3.5
Added settings for history range (start week/day), improved leaderboard period generation (no HuggingFace scan), made history dropdown fully config-driven, updated Settings UI, and revised docs/specs for v0.3.5. Minor UI tweak for footer responsiveness.
Inject JS via st.html to enable tap-to-show tooltips for incorrect guesses on touch devices, preserving desktop hover. Add mobile CSS to prevent word-break and tweak guess input background for improved appearance.
Bugfix: Use public get_daily_ids_for_week for daily IDs
Replaced the private _get_daily_ids_for_week with the public get_daily_ids_for_week when generating daily IDs for the selected week. This improves code clarity and ensures the correct function is referenced.
- Added Weekly Leaderboard Maintenance Tool (v0.3.4) for admins to rebuild/fix weekly leaderboards using daily and hall-of-legends data.
- Implemented `get_daily_ids_for_week` utility in `leaderboard.py` for ISO week-to-dates conversion; now used across leaderboard logic.
- Added `_fetch_weekly_source_data` and `_fix_weekly_leaderboard` to `settings_page.py` for data aggregation, deduplication, and file updates.
- Updated Settings page UI with validated Week ID input and "Fix Weekly List" button; shows operation results.
- Documented tool usage, algorithm, and error handling in `leaderboard_spec.mdx`.
- Refactored code for shared utilities and improved error reporting.
Bumped version to 0.3.4 in all metadata and docs. Updated "Last Updated" dates to 2026-07-29. Added "Recent Changes (v0.3.4)" sections referencing release notes. Improved `storage.md` with clearer code examples, detailed usage, and enhanced explanations for URL/key management. No functional code changes.
Stricter file ID matching in leaderboard.py excludes files with extra hyphens. Refactored _list_repo_folders in storage.py for clarity and efficiency, improving variable naming and folder extraction logic without changing behavior.
.gitignore now ignores secrets.* files to protect sensitive data.
Added .st-emotion-cache-yxt443 to min-width CSS selector group in ui.py for consistent styling.
Reduce main content container padding for compact layout
Reduced top and bottom padding in .stMainBlockContainer.block-container from 3rem/5rem to 2rem/4rem, making the main content area more vertically compact.
- Switch legendary score animation to custom_falling_text
- Remove prefix from incorrect guesses tooltip
- Increase .stAppHeader opacity and set fixed height
- Adjust main content and footer padding for better layout
The tooltip for recent incorrect guesses no longer includes the "Recent incorrect guesses:" label. Only the bullet list of guesses is displayed for a cleaner UI.
Migrate to st.html, add fade transitions, bump to v0.3.3
Updated all docs and metadata to version 0.3.3 (2026-07-01). Migrated all uses of streamlit.components.v1.html to st.html per project guidelines. Added fade-in/fade-out transitions, improved spinner overlay styling, and polished UI elements. Updated project description and version comments to reflect these changes. Added a new "Recent Changes (v0.3.3)" section to documentation.
Refactor to use st.html, add fade transitions & UI polish
Migrated all uses of `streamlit.components.v1.html` to `st.html` per project guidelines, removing unsupported arguments. Added fade-in/fade-out transitions for the app root and spinner overlay with new helper functions and CSS. Improved spinner overlay styling and ensured overlays operate in the current document context. Updated guess input focus, score panel, and game over dialog to use `st.html`. Added `custom_falling_text` animation utility and made minor UI tweaks. Bumped version to 0.3.3.
Format leaderboard timestamps, clarify column header
Added _format_timestamp helper for consistent 'YYYY-MM-DD HH:MM:SS' display in the Hall of Legends leaderboard. Updated render_hall_page to use this formatting and changed the "Saved" column header to "Date Time (UTC)" for clarity.
Moved and simplified JS focus logic to st.html for better reliability on reruns. Now ensures guess input is focused whenever can_guess is True, adds pointerdown event, removes tooltip logic, and uses unsafe_allow_javascript. Maintains exponential backoff for focus retries.
- Introduced comprehensive analysis and refactoring roadmap for Wrdler's architecture.
- Detailed current architecture analysis, including package structure and key problems identified.
- Proposed reorganized package structure with layered architecture.
- Addressed violations of SOLID principles, including Single Responsibility, Open/Closed, Dependency Inversion, and Interface Segregation.
- Eliminated magic numbers and consolidated constants into dedicated configuration files.
- Implemented centralized session state management to reduce global state usage.
- Consolidated overlapping modules for improved clarity and maintainability.
- Added configuration validation to ensure required settings are provided.
Introduce Hall of Legends leaderboard for legendary scores (46+), accessible from the footer. Remove Hall of Fantastics. Refactor leaderboard logic to use is_legendary_score utility. Update UI, navigation, documentation, and version numbers to v0.3.2. Includes minor bug fixes and display improvements.
Introduced leaderboard management for Hall of Legends and Hall of Fantastics, including data handling, saving, and rendering. Added styled pages with detailed statistics and leaderboards. Updated `_render_grid` to start the timer on the first action. Simplified `_game_over_content` by improving share link handling. Adjusted `_render_game_tab` to include score panel rendering.