I made a daily word puzzle. It's called Tessera, and it lives at tesserapuzzle.com. One puzzle a day, same for everyone, resets at UTC midnight.
The gap
A few days ago I was made redundant from Sourceful. That's not a fun sentence to write, but here we are. Rather than spend the time refreshing LinkedIn and feeling sorry for myself, I decided to do the thing that always centres me: make stuff.
I had a list of small ideas I'd been carrying around for a while. CooperPixel (a pixel typeface I'd been doodling glyph by glyph). Cairn (a chill stone-stacking toy I'd wanted since watching someone build one on a Korean travel show). Cherryade (the follow-up mint to my Pandimensionals NFT project from years ago). And this, a Wordle-shaped daily puzzle for word people who like grids.
A redundancy gap turns out to be a decent maker's residency, if you let it be one.
Why a 4x4
There's a whole drawer of daily word puzzles now. Wordle, Connections, Spelling Bee, Strands. I wanted to build one but didn't want to clone any of them.
The rule that hooked me was: every row spells a word, AND every column spells a word too. A 4x4 grid where the constraint runs both ways. Simple to state, dense to solve. You can't just optimise rows or you'll break columns. The grid pushes back.
You start scrambled, you swap two tiles at a time, you try to land on the day's solution. The fewer swaps, the better.
Wordle is about narrowing letters. Tessera is about arranging letters. Different muscles.
The dictionary problem
The first prototype generated grids from a 4-letter Scrabble word list (SOWPODS, around 4000 words). It worked, except the puzzle kept serving up "ESES" once a week. Or "PSST". Or "TSKS". Three of the ten most-common gold words in my stress test were not words I'd ever say out loud.
This is because Scrabble lists are exhaustive. They include obscure short forms that exist almost entirely to win Scrabble. They are technically valid and emotionally infuriating.
I curated a smaller list: the 2000 most-frequent four-letter English words by Wikipedia frequency, intersected with SOWPODS, with proper nouns and a small blocklist removed. After the swap, the top ten gold words were AREA, ARIA, UREA, ENDS, ALOE, ELSE, IDEA, TSAR, ORAL, ILIA. Words you actually meet.
4017
full dictionary
2000
curated solution words
0
failures over 13.7 yrs of seeds
<10ms
grid generation time
Strict matching
The first version turned a row green any time it spelled a real word. Felt clever. In practice, with a richer dictionary, players kept stumbling into "valid but wrong" arrangements, the row would go green, and the columns refused to cooperate. Confusing.
So I switched to strict matching. A row only turns green when it equals the gold word for that row. The whole grid turns gold on completion. Bonus star is gone, replaced with a tactical signal mid-solve and a single celebratory state at the end. Much clearer.
The home row hint
Tessera scrambles 12 swaps from solved. From cold, with no nudge, that's a lot to untangle. So I borrowed a trick from Sudoku: tiles whose letter belongs in their current row get a green outline. Not a fill (that's reserved for the right word), just a hint that says "you're warmer than you think."
I also guarantee at least one home tile per row at scramble time, so no row is ever a pure dead end.
Tiers
A "Solved in N moves" line by itself is a number. A number plus a tier is a vibe.
Legendary
≤ 10 moves
Genius
11 to 20
Wordsmith
21 to 35
Persistent
36 to 60
Tenacious
61+
I picked positive names all the way down. A tough day shouldn't end on "Struggling." The slow solver still made it.
Daily seed
Every day's puzzle is generated from the UTC date hashed into a seed. Same seed, same puzzle, on every device, every time. No backend, no per-user state on a server. The browser does all the work.
The grid generator is a constraint-propagation backtracker: pick a first row, find a second row whose columns prefix something solvable, recurse, build a fourth row from whatever letter sets remain. With the curated word list it never fails and finishes in under 10ms even at the 99th percentile.
Streaks, history, and progress live in localStorage. If you clear your browser data, you start fresh. That's the cost of keeping it simple.
Splitting it out
Tessera started life as a page in my portfolio at /catalogue/tessera. After a few hundred plays it had outgrown that shelf, with its own subreddit, its own banners, its own pace of small fixes. So I extracted it into its own repo and its own domain at tesserapuzzle.com. The catalogue page now redirects.
If you want to follow along, get strategy tips, or shout at me about a missing word: r/TesseraPuzzle.
Try it
Whichever tier you land in today, that's a real word from a real grid you actually solved. Better than scrolling.
From the Catalogue