wanessalabs games production August 26, 2026

Mini Crossword

A daily five by five, plus a book maker that fills all sixteen corner-blacked grid shapes from a hand-written word bank.

ReactTypeScriptTailwindVitestjsPDFCloudflare Pages
The daily grid. Ten hand-written puzzles, every square open, one served per date from an append-only archive.
The daily grid. Ten hand-written puzzles, every square open, one served per date from an append-only archive.
The same puzzle on a phone. Tapping a filled square a second time flips to the down clue and the crossing lights up.
The same puzzle on a phone. Tapping a filled square a second time flips to the down clue and the crossing lights up.
Three grids the book maker produced from one seed. Top right blacked, both top corners blacked, both bottom corners blacked. Same five by five, three different shapes.
Three grids the book maker produced from one seed. Top right blacked, both top corners blacked, both bottom corners blacked. Same five by five, three different shapes.
The maker. Twenty puzzles, every page previewed as it will print, exported as a KDP ready PDF.
The maker. Twenty puzzles, every page previewed as it will print, exported as a KDP ready PDF.

The daily puzzle is ten hand-written five by fives with every square open. That is a fine game and a terrible book. Twenty pages of the identical grid shape is not a puzzle book, it is a worksheet, and the fix was not more puzzles. It was letting the corners go black.

What It Is

Two surfaces over one idea. A daily mini at games.wanessalabs.com/games/crossword, and a generator at games.wanessalabs.com/creator/crossword-book-maker that prints books of them. The game module landed 2026-05-26. The maker, and the sixteen shapes it needed, landed 2026-08-26.

The daily is deliberately small. Five across, five down, nine numbered entries, a timer that starts when the page does. Type into a square and the cursor walks the word. Tap a square you are already sitting on and the direction flips, so the across you were filling becomes the down that crosses it.

The Archive Is Append Only

Which puzzle a date serves is not computed at load time. It is a row in a generated manifest that currently runs from 2026-08-11 to 2028-09-05, and regenerating it extends the tail rather than rewriting the head. That is the whole point: a date that has already been played must serve the same puzzle forever, or the Time Machine archive is showing people a yesterday they never had. The generator refuses outright if a pinned puzzle id has left the bank.

Reveals Are Priced, And Only Charged When They Do Something

Three coins shows the letter under the cursor, eight shows the whole answer, twenty five opens the grid. Two rules keep that honest. A reveal is charged only when there is something left to reveal, so paying eight coins for a word you have already filled correctly is not possible. And a reveal does not advance the cursor, because you did not put that letter there and the cursor should not pretend you did.

Sixteen Shapes, Not One

Black squares are permitted at any corner of the five by five and nowhere else. Four corners, each independently black or not, is exactly sixteen grid shapes. Four of the sixteen are rotationally symmetric and all sixteen ship anyway: symmetry is a convention that belongs to the fifteen by fifteen daily, and enforcing it here would have thrown away three quarters of the shape variety in a hundred puzzle book to satisfy a rule nobody applies to minis.

Corner-only blacking is what makes the rest tractable. Every run in every one of the sixteen shapes is three, four or five cells long, so the word bank needs exactly three length buckets and the filler never has to reason about a two letter entry. It also means no cell is ever unchecked: every white square sits on both an across and a down, so anything you write can be verified from its crossing.

The Word Bank Is The Slow Part

A generated grid without clues is worth nothing, and there is no model call in this hub at runtime, so every word and clue is written ahead of time. The bank ships 1,638 entries against a target of 4,000, and the maker reports that shortfall on the page rather than letting you find it by noticing repeats.

Every entry is hand-authored in the repo. The obvious shortcut, a frequency word list already sitting in scripts/popular.txt, was refused: it is an unattributed derivative of a CC BY-SA source, and a book somebody sells on KDP is commercial redistribution. Being to hand is not the same as being licensed.

The Book Maker

Same engine as the Sudoku, Linked and Anagram makers. Pick a count up to 180, a theme, a page size, and a seed. The seed is the contract: the same seed and settings always produce the same book, and per puzzle seeds are derived by label rather than drawn in sequence, so puzzle nine needing three fill attempts cannot change what puzzle ten looks like.

The generator gets six attempts per puzzle. If it runs out, the book comes back visibly short instead of quietly padded with a repeat. Export is a print ready PDF with the answer grids in the back, plus the front matter as .pptx so the cover can be redesigned in Canva and dropped back in.

The whole maker is lazy loaded. Not a micro-optimisation: the crossword bank is the largest of the four data files, and importing it statically pushed the entry chunk past the 2 MiB precache ceiling and broke the build.

Stack

ToolRole
React + TypeScriptGame UI, maker UI, pure engine modules
TailwindHub design tokens, per-game accent
VitestMask, fill, bank, render and archive replay tests
jsPDF + pptxgenjsPrint PDF and Canva front matter export
localStorageDaily checkpoint, wins, coin balance
Cloudflare PagesStatic hosting, no server

Live at games.wanessalabs.com/games/crossword. Book maker at games.wanessalabs.com/creator/crossword-book-maker.