helg

helg pushed to master at helg/wordle

1 week ago

helg pushed to master at helg/wordle

  • 71318a9b06 feat: hint mode on empty solver board Pressing Enter with an empty board now returns the best starting word (by positional letter frequency) instead of doing nothing. UI shows only the suggested word, no other result elements. Co-Authored-By: Claude <noreply@anthropic.com>
  • b6c0726e24 feat: add Wordle Solver at /solver and /ru/solver Server-side filtering with positional constraints (green/yellow/gray), suggested guess scoring by letter frequency, and best-letters panel. 6×5 editable game-board grid with cursor navigation, per-tile color cycling (gray→yellow→green), and on-screen keyboard integration. Co-Authored-By: Claude <noreply@anthropic.com>
  • View comparison for these 2 commits »

1 week ago

helg pushed to master at helg/wordle

1 week ago

helg pushed to master at helg/wordle

1 week ago

helg pushed to master at helg/wordle

  • fed79d6f1d Merge remote-tracking branch 'refs/remotes/origin/master'
  • a3295448a1 fix: histogram bars now proportional instead of binary The flex: 1 shorthand (flex-basis: 0%) was overriding the width percentage on the bar div, causing bars to render full-width or empty instead of proportionally by count. Split into a track div (flex: 1, gray background) and an inner fill div (width: pct%, green) so the bar width reflects actual statistics. Co-Authored-By: Claude <noreply@anthropic.com>
  • df816473db doc: .gitignore
  • 6cf3bd4fa8 doc: config
  • edf5c04001 doc: old prompts for changes
  • View comparison for these 6 commits »

1 week ago

helg pushed to master at helg/wordle

  • c3693b1e92 refactor: dictionary hints
  • 922a2d78bc refactor: remove id field from targets, use array index Targets no longer carry an 'id' key — wordId is now the array index (0-indexed). This eliminates redundant data and simplifies lookups. Changes: - data: removed 'id' from all target entries in both word banks - TargetWord interface: removed 'id' field - getTargetWord: now uses direct array indexing instead of .find() - getDailyWordId: returns 0-indexed (days % N instead of +1) - selectPlayAgainWord: returns {target, index} instead of using t.id - play-again cache: keyed by index instead of target.id - Generation scripts: no longer write 'id' to targets Co-Authored-By: Claude <noreply@anthropic.com>
  • c48b7a32d7 feat: extend targets dictionary to 1000 words - Take first 1000 words from frequency-sorted guessable list as targets - English: 997/1000 with synonym hints (Datamuse API + WordNet) - Russian: 295/1000 with synonym hints (Abramov dictionary + curated) - IDs sequential 1..1000, most common words first - Daily word cycles through 1000 words (~2.7 years) - .gitignore: exclude 7MB Abramov dictionary (auto-downloaded by script) Co-Authored-By: Claude <noreply@anthropic.com>
  • 5391d108ed fix: audio to dict
  • View comparison for these 4 commits »

1 week ago

helg pushed to master at helg/wordle

  • e92e3ac01a feat: synonym hints on 5th incorrect guess - Add 'hint' synonym field to every target in word-bank.json and word-bank-ru.json - English: Datamuse API + WordNet + manual overrides for quality - Russian: fully curated 100-word synonym dictionary - Server returns hint on 5th guess when not correct (tryNo=5) - Client displays 'Hint: synonym' below grid, localized per language - i18n: EN hintLabel='Hint', RU hintLabel='Подсказка' Co-Authored-By: Claude <noreply@anthropic.com>
  • becaa75c9c perf: optimize entropy solver with cached first guess and int feedback - Cache the best first guess per dictionary (computed once from a ~100-word sample) — eliminates the O(N²) first-attempt search. - Use integer encoding for feedback patterns (base-3, 0-242) in the entropy inner loop instead of string allocation/compare. - Results: ~93s → ~24ms per target after cache warmup (~3,875x). Co-Authored-By: Claude <noreply@anthropic.com>
  • View comparison for these 2 commits »

1 week ago

helg pushed to master at helg/wordle

1 week ago

helg pushed to master at helg/wordle

  • c38d407857 feat: tap letter in current guess to move cursor Clicking/tapping a letter cell in the current (unsubmitted) guess row moves the cursor to that position, matching the arrow-key cursor navigation. Co-Authored-By: Claude <noreply@anthropic.com>

1 week ago

helg pushed to master at helg/wordle

  • 0563543e2a feat: editable word with cursor and on-the-fly validation - Add blinking underline cursor in the current guess row showing where the next letter will be inserted. - Add 4th keyboard row with Enter, Left, Right, Backspace keys. Enter and Backspace removed from existing letter rows. - Left/Right arrow keys move cursor; typing replaces the letter under cursor rather than always appending. - Enter key greys out when word is incomplete (<5 letters) or invalid (client-side validation via GET /api/validate/:word). - Both physical and on-screen keyboard share the same logic. Co-Authored-By: Claude <noreply@anthropic.com>

1 week ago

helg pushed to master at helg/wordle

  • 5068455283 feat: frequency-sorted dictionaries with 100 Gaussian-picked targets Replace alphabetically-sorted word banks with frequency-sorted dictionaries (EN: 2309→5965 words, RU: 2064→2380 words). Select 100 target words per language using Gaussian distribution (μ=0, σ=100) on the frequency-ranked lists, heavily favoring common words. New targets have IDs 1..100. Includes generation script (raw/generate-banks.py) for reproducibility. Co-Authored-By: Claude <noreply@anthropic.com>
  • 242beda1c9 refactor: offload entropy solver to child process, include failed solvers in results - Move long-running entropy computation (14s) to child_process.fork() so it never blocks the API event loop. Fast 3-solver results still computed inline on cache miss for immediate response. - Cache pre-warming now happens in daily and play-again routes too (was only in guess), so by the time the player finishes their last guess all 4 solvers are usually cached. - Failed solvers (>6 attempts) now appear on the results page instead of being hidden. They contribute 10 attempts to the difficulty score. - Fix build:bundle sed to use correct relative import depth for files in dist/server/src/routes/ (../../../ instead of ../../). - Revert solver grid to 2x2 layout. Co-Authored-By: Claude <noreply@anthropic.com>
  • 4b918ce0db fix: add Cyrillic vowels to Vowel First solver so it works for Russian VOWELS set was Latin-only (a,e,i,o,u), causing the solver to degenerate into a random guesser for Russian words. Added Cyrillic vowels (а,е,ё,и,о,у,ы,э,ю,я) so the algorithm works for both languages. Fixes missing Vowel First replay for word 'хасид'.
  • 4d031c34dc fix: switch solver replays to single-column layout for reliable visibility Changed the solver results grid from 2-column to single-column flex layout. Ensures all solver MiniBoards (including Vowel First with its 6-step rows) are always fully visible regardless of varying step counts between solvers.
  • 8af03b085a refactor: lazy cache for replays/difficulty — no startup pre-computation Cache starts empty. First API request for a word computes with 3 fast solvers (~20ms) and returns immediately, then fires all 4 solvers (including entropy) in the background. Once the background computation completes (~14s), the cache is upgraded with full results. Server startup is now instant. Play Again uses cached difficulty with a 3.0 default for words not yet played.
  • View comparison for these 8 commits »

1 week ago

helg pushed to master at helg/wordle

1 week ago

helg pushed to master at helg/wordle

1 week ago

helg pushed to master at helg/wordle

  • 16534fe334 refactor: simplify solver steps from objects to string arrays Steps changed from [{guess: 'raise'}, ...] to ['raise', ...]. Removed SolverStep interface entirely. Data files ~25% smaller.
  • 19cd6d1466 refactor: stop writing colors to word-bank files from solvers All 4 solvers now push only {guess} into replay steps. Colors are computed client-side at render time.
  • View comparison for these 2 commits »

1 week ago

helg pushed to master at helg/wordle

  • 18b945bfed fix: vowel-first solver picks starting word from the actual word bank Removed hardcoded English starting words (adieu, audio, raise, arose, irate) that caused the Russian solver to use non-Russian guesses. Now dynamically picks the best vowel-rich word from the actual guessable list for any language.

1 week ago

helg pushed to master at helg/wordle

  • 9141e1e3b5 refactor: compute solver replay colors client-side instead of storing in word-bank Removed 'colors' from SolverStep type and both word-bank JSON files. Client now computes feedback colors at render time using the same green/yellow/gray algorithm as the server. Reduces data file size and API response payload.

1 week ago

helg pushed to master at helg/wordle

2 weeks ago

helg pushed to master at helg/wordle

  • 8713d85c7d fix: narrower keyboard for phone screens (both EN and RU) - Max width: 380px → 340px - Letter key flex: 9% → 8% - Key height: 48px → 42px - Font sizes slightly reduced - Russian 12-key row now fits on narrow screens Co-Authored-By: Claude <noreply@anthropic.com>
  • b2525ea883 fix: SPA path resolution works in both dev and dist bundle - Server tries client/dist/ first (dev), falls back to client/ (dist bundle) - Fixes ENOENT error when serving from deployed dist/ Co-Authored-By: Claude <noreply@anthropic.com>
  • 2fb4f586d9 fix: language button shows current language (en/ru), taps to switch Co-Authored-By: Claude <noreply@anthropic.com>
  • a437a9cfc3 feat: language switch button in top-right corner - LangSwitch component: shows 'ru' on EN pages, 'en' on RU pages - Tapping navigates between / and /ru/ - Present on all three screens (Rules, Game, Results) - Styled: no border, small font, muted color Co-Authored-By: Claude <noreply@anthropic.com>
  • 03ab5db1ce feat: Russian language support (wordle in Russian) - messages/ru.ts — full Russian UI translation - messages/index.ts — language detection from URL path (/ru/ → RU, / → EN) - data/word-bank-ru.json — 2064 Russian 5-letter words, 40 targets - Server: dual API paths (/api/... EN, /ru/api/... RU) - Solver: processes both EN and RU banks - Client: language-aware API calls, keyboard layout, messages - No server code duplication — mountApi() factory for both languages Co-Authored-By: Claude <noreply@anthropic.com>
  • View comparison for these 7 commits »

2 weeks ago

helg pushed to master at helg/wordle

  • ea6104d0ea fix: keep unknown word on screen instead of wiping it - submitGuess now returns boolean (true=accepted, false=invalid) - Screen2Game only clears currentGuess when guess was valid - Backspace dismisses message but only removes one letter, not whole row - Player can see what they typed, backspace to fix, retry Co-Authored-By: Claude <noreply@anthropic.com>
  • 8813d433d4 feat: add deploy script (rsync to helg.com) npm run deploy — builds + rsyncs dist/ to helg.com:/var/www/wordle/ Co-Authored-By: Claude <noreply@anthropic.com>
  • 6619543932 fix: make dist/ a complete self-contained deployable - Server source + shared types copied to dist/ - Import paths rewritten from @wordle/shared to relative - Standalone dist-package.json with express + tsx deps - npm install && npm start from dist/ works on target server Deploy: rsync dist/ to server, cd dist, npm install, npm start Co-Authored-By: Claude <noreply@anthropic.com>
  • 8b473443fc feat: add build script for deployable dist/ target - npm run build — builds client (Vite) and bundles dist/ - dist/client/ — SPA static files - dist/data/ — word bank - STATIC_DIR env var for production path override - npm start — runs server with tsx - npm run solve — runs solver Co-Authored-By: Claude <noreply@anthropic.com>
  • 30f54d2866 feat: updated word-bank with extended word list - Replaced guessable words with 2309-word list from public Wordle corpus - Replaced xenon (not in new list) with quack - Removed duplicate zebra target, added spire - Recalculated all 4-solver difficulty scores and replays - 40 unique targets, all verified in guessable list Co-Authored-By: Claude <noreply@anthropic.com>
  • View comparison for these 5 commits »

2 weeks ago

helg pushed to master at helg/wordle

  • 65509ca33e Added screenshots with budget
  • 95566acef8 Updated word-bank with extended wird list.
  • 6431c2c592 feat: solver replays on results screen - All 4 solvers record guess sequences (not just attempt counts) - Word bank stores replays alongside difficulty scores - API returns replays on final guess response (win or loss) - Screen 3 renders 2x2 mini grid showing each solver's path - Mini tiles use same green/yellow/gray colors at 20px size Co-Authored-By: Claude <noreply@anthropic.com>
  • f6eead70b0 feat: add vowel-first and greedy solver strategies - Vowel-first: maximize vowel coverage in early guesses, then hunt consonants - Greedy position-masking: respect greens, sort by positional match quality - Difficulty now averages all 4 strategies (entropy, frequency, vowel-first, greedy) - More robust word ranking with 4 independent algorithms Co-Authored-By: Claude <noreply@anthropic.com>
  • 40c7811108 feat: Epic 2 complete — solver engine with word ranking - Entropy-based solver algorithm (information theory) - Frequency/heuristic-based solver (letter frequency scoring) - Aggregated difficulty scores replace default 3.0 values - All 40 target words solvable within 6 attempts - Real difficulty range: 2.0 (large) to 5.0 (prize) - Solver runs as standalone TypeScript script (npm run solve) Co-Authored-By: Claude <noreply@anthropic.com>

2 weeks ago