GitHub, TypeScript, Next.js, Tailwind CSS, GSAP, Turso, Vercel • 2026
BLURDLE
Project Overview
Blurdle is a daily music-guessing game where you try to identify an artist through a progressively de-blurring album cover, with five guesses to get it right before it's fully revealed.
The idea started from liking Wordle-style daily games, the kind where everyone gets the same puzzle and can compare results with friends the next day, but built around album art instead of words. Guessing an artist from a heavily corrupted cover is genuinely fun to get right, and watching the image slowly clear up with each wrong guess adds some tension without making it too easy.
Each day's artist and cover image are pulled from the iTunes Search API and stored in a database rather than fetched live on every visit. This keeps every player on the same day looking at the exact same puzzle, and avoids hammering the iTunes API with repeated requests every time someone loads the page. The corruption effect itself is done with a staged sequence of CSS filters (blur, contrast, and brightness), stepping down in intensity with each wrong guess so the cover becomes more legible over the five attempts.
Accounts don't use normal password auth. Instead, users can transfer their account to another device using a temporary 6-digit code generated on demand, so there's no password to remember or reset. If someone is only signed in on one browser/device and chooses to sign out, their account gets deleted after a warning, since without a transfer code already generated, signing out would just leave an orphaned account nobody could ever get back into.
Next.js with TypeScript keeps the fetch/store logic and the game UI in one codebase, deployed on Vercel. CSS filters were used instead of canvas-based image processing to keep things simple and fast in the browser, no server-side image work needed for the blur transitions.
The hardest part was getting the daily reset and player progress to work reliably across different time zones. At first, I only discovered later that the server's local time was being used to determine when a new day started, which meant some players could receive the next puzzle too early or too late depending on where they were. The solution was to base the daily reset on each user's local time instead, ensuring everyone gets a new puzzle when their own day changes. Another challenge was making sure the game consistently saved whether a player had already completed that day's puzzle, preventing duplicate attempts while keeping streaks and statistics accurate.