Phrasey
A daily phrase-guessing game. Everyone gets the same hidden phrase each day and uncovers it one letter at a time; fewer letters is better.
Built with React, TypeScript, Vite, Vitest, Vercel

What it is
One hidden phrase per day (an idiom, saying or everyday expression) with a category as the only hint. Players guess letters or try to solve outright; six strikes and you’re out. Results share as a spoiler-free emoji grid, Wordle-style.
How it’s built
- Fully static. No backend and no database: the day’s puzzle is picked from the player’s local date, and progress, stats and streaks live in
localStorage. If storage is blocked the game still works, it just doesn’t persist. - Game rules are pure functions in
src/lib/, unit tested with Vitest, so rule changes can’t silently break scoring. - The phrase list is validated at build time, so a malformed entry fails the deploy instead of breaking someone’s daily puzzle.
Design decisions
- Score is letters used, lower is better. Every guess counts the same, right or wrong, which keeps the scoring easy to explain in one line.
- Solving compares letters only. Case, spaces and punctuation are ignored, so
dontandDon'tboth match. A guess with the wrong number of letters is rejected for free, since the board already shows the count. - A rapid-tap guard. Players were spelling out the answer on the letter keys, which inflated their score. Taps within 0.5 s of the previous one are now ignored, with a hint pointing to the answer box.