I wanted a way to build crosswords by hand — click a cell, type a
letter, toggle black squares, and get live word suggestions when I’m
stuck filling a gap. So I built a small builder: a 10×10 grid
editor with auto-numbering, a clue editor, and a word finder that
queries a dictionary API for anything matching a pattern like C?T.
How it works
The grid is just an array of cells (letter, isBlack, number).
Auto-numbering walks the grid once, marking any cell that starts an
across or down word using the standard crossword rule: a cell gets a
number if it’s not black, and either the cell to its left is black (or
it’s the first column) with a non-black cell to its right, or the same
vertically.
The word finder is the part I use most. Select a cell, hit “Find
Across” or “Find Down” to pull the current pattern (letters typed so
far, ? for blanks), and it queries a dictionary API for matches —
click any result to drop it straight into the grid.
Finished puzzles export as JSON — grid, clue numbers, and clue text — which is exactly the format the embed below reads.
Try it: play the puzzle
This is the first crossword I made with it, embedded live via the
custom_scripts front matter on this post (see the README for how
that works on any page).
loading puzzle…
Across
Down
What’s next
The builder itself is a page on this site — try the crossword builder if you want to make your own. Next up: a proper symmetry-aware auto-numberer and saving drafts to the browser instead of round-tripping JSON files by hand.