Project 004 — build · Jul 2026

Chain.

A daily word game. Everyone gets the same chains. You clear one by spelling a run of words, each starting on the last letter of the one before, until every letter on the board is used.

When
July 2026
Stack
Next.js · React · TypeScript · Vitest
Status
Live
Site
playthechaingame.com →
Chain’s opening walkthrough: a pile of letters and the rule — every word starts where the last one ended
The walkthrough a new player sees first.
Sector 1 — why

The rules.

Chain N words using every letter, and each word has to begin where the last one ended. The pivot letter is free; you only spend letters from the pool to finish a word. The chain is cleared when the pool is empty and every word is in the dictionary.

You can’t fail. A chain waits all day and you can reset it as often as you want. Each one you finish makes the next a bit bigger (more words, longer words), and it ramps faster past the “pro” level. There are stamps to collect, a daily streak, and an emoji grid to share.

I wanted something like Wordle: one puzzle a day, the same for everyone, done in a few minutes. Word chains were the version of that I hadn’t seen anyone make.

Sector 2 — how

How everyone gets the same puzzle.

The client works out the UTC day number. That plus the index of the chain you’re on seeds a Mulberry32 PRNG, and the generator lays real words down end to start, then hands you a shuffled bag of exactly the letters those words need. Same day, same seed, same chains for everyone, and every chain is solvable by construction.

The whole dictionary ships in the client bundle, so puzzles generate instantly and offline. It’s every 4 to 8 letter word in ENABLE, about 79,000 of them minus a blocklist, front-coded down to 95 KB. Answers come from a much smaller common list of around 6,300 words, so a chain is always solvable with words you’d know, even though the game accepts far more.

Stats, streak, collection, calendar and the chain you’re on all live in localStorage. No accounts, no backend, no environment variables. The game logic is pure functions over a seed, covered by Vitest, and the app deploys to Vercel as-is.

day  = floor(Date.now() / 86_400_000)
seed = seedFor(day, chainIndex)      // Mulberry32
lvl  = genLevel(seed, cfgSize(chainIndex))
// → words laid head-to-tail, then their letters, shuffled
Sector 3 — what stuck

Lessons.

  • A word game that rejects a word you know feels broken. Every time I tried a smaller word list, someone hit a word just outside it.
  • Seeded puzzles mean there is nothing to sync. Everyone can compute the same day, so a whole layer of infrastructure never has to exist.
  • Marketing it. I have been using AI to run the social media side and that has been its own learning curve.
“Same day, same seed, same chains.”

Play today’s chains.

Free, in the browser, no account. There’s a practice chain if you want to learn the rules first.

Open Chain →