03Tessera / Case Study

Tessera Puzzle

A daily word puzzle, built, shipped, and automated solo. Swap tiles until every row and column spells a word. Now a self-running product: new puzzle at midnight, growth loop across five social networks, zero manual ops.

Client
Tessera
Role
Solo founder
Year
2026
Status
Live
Tessera. Swap two tiles at a time until every row, and every column, spells a word.

I built Tessera Puzzle with Claude Code, to challenge myself and because it sounded fun. One person, one idea: a daily word grid where rows and columns both have to resolve, at the same time. Simple to explain, dense to solve. It now runs itself, end to end, with no manual ops.

A constraint that runs both ways

Wordle narrows letters. Tessera arranges them. You start scrambled, swap two tiles at a time, and try to land on the day's solution in as few moves as possible. You can't optimise rows without breaking columns. The grid pushes back.

Wordle is about narrowing letters. Tessera is about arranging letters. Different muscles.

The first version generated grids from the full Scrabble word list and kept serving up words nobody says out loud. I curated a smaller dictionary, the 2,000 most-frequent four-letter English words, intersected against the Scrabble list, proper nouns and a blocklist removed.

4,017

full dictionary

2,000

curated solution words

0

generation failures across 13.7 years of seeds

<10ms

grid generation time

The generator is a constraint-propagation backtracker: pick a first row, find a second whose columns prefix something solvable, recurse. Every day's puzzle comes from the UTC date hashed into a seed, same puzzle for everyone, no backend, no per-user server state.

A second mode, considered and rejected three other ways

A few weeks in I shipped Tessera Hard, a 5x5 sibling to the original 4x4. Before building it I weighed four options: replace the 4x4 outright, ship the 5x5 behind a difficulty toggle, ship it as a fully separate mode with its own streak, or ship a sliding scale of grid sizes. I rejected the first for losing the entry point that new players actually share. I rejected the second because a 5x5 isn't "the same game, harder," it's a different constraint problem. I rejected the fourth as over-engineering a question I had no data to answer yet.

Tessera Hard, a 5x5 grid variant

Shipping a second grid size also broke the original grading scale: a 5x5 needs more swaps to solve than a 4x4, so a fixed move-count threshold couldn't grade both fairly. I reworked tiers to a ratio, moves against the puzzle's true minimum-swap count, calibrated against a few hundred real production solves rather than picked from a hat.

≤ 1.5×

Legendary

≤ 2.5×

Genius

≤ 4.5×

Wordsmith

≤ 7.0×

Persistent

The machine that runs itself

I went on holiday for a week and didn't touch it. New puzzle at UTC midnight. A GitHub Action screenshots the day's grid, writes a caption from a stats precompute, and posts to X, Facebook, Reddit, Bluesky, and Instagram at 08:00, in parallel, across five separate credential flows. A reminder email fires at 06:00 through a serialised, rate-limit-aware fan-out after an earlier parallel version started tripping 429s. A stats dashboard runs on the PostHog Query API with a precompute cron so the page loads fast.

The daily share card, posted automatically to five social networks every morning
The daily share card. Same image, five networks, one cron, zero manual steps.

The analytics almost broke it. Default tracking fires on every page view, every autocaptured click, every web vital, and the projected bill was heading somewhere uncomfortable by the time I noticed, from a bus with one bar of signal, somewhere between Spain and Andorra. The fix was a diet: cut web vitals and pageleave, keep gameplay events, share clicks, and the reminder event, move the read-only stats subdomain off analytics entirely. Event volume dropped sharply. The dashboard didn't lose a single number it draws.

Full stack, solo

There's no team behind this. I own every layer, built end to end in Claude Code: the game engine and frontend, the backend and cron infrastructure that generates and ships each day's puzzle, the analytics pipeline that turns raw events into the dashboard above, and the automated marketing loop that posts, emails, and grows the player base without me touching a keyboard. Product, engineering, infra, data, and growth, in one person, one tool.

  • Claude Code
  • Grid generation, constraint-propagation backtracker
  • Ratio-based tier grading
  • Backend + cron infrastructure
  • 5-platform automated marketing
  • Rate-limit-aware email fan-out
  • Analytics pipeline, PostHog on a diet
  • Cost monitoring and spend alerts

Outcome

3,095,892

tiles flipped, all time

100,879

visitors, all time

130

day top streak

77%

returning players

The product ships itself now. I open it when I want to play it, check the dashboard when I'm curious, and read it properly maybe twice a week. The machine ran for a week without me. It can run for a year.