Crossword Creator

Wordlist-first crossword generator and solver. Hand it the words you actually care about; the engine generates a packed, real-style crossword around them.

Personal project · May 2026 to present

Building a freeform puzzle with the adjacency-aware strategy

Overview

Auto-generators pull from a generic dictionary, so the puzzle has nothing to do with the words you wanted. Bring-your-own-word tools hand you a blank canvas and make you place every word yourself, which is exactly the tedious part.

Crossword Creator does the part in between: you supply a word list and a constraint-satisfaction engine packs those words into a dense, real-style crossword. Three placement strategies produce visibly different layouts from the same input, so you can pick the one that looks best.

Finished puzzles can be edited, saved to a short URL, and solved in a keyboard-navigable player that mirrors the basics of the NYT interaction: arrow keys, tab between clues, check letter / word / puzzle, reveal, and so on.

Motivation

This started with wanting to make a crossword for a loved one. The tools online stop at finding intersections between the words you supply, which leaves a sparse grid that doesn't really read as a crossword. By using dictionary fill in conjunction with a user's word list, the engine can pack those words into a densely populated puzzle instead. That gap is what kicked off the project, and what shaped the strategies.

It's a constraint-satisfaction solver written from scratch in TypeScript: AC-3 arc consistency for constraint propagation, a minimum-remaining-values heuristic for slot ordering, three placement strategies, and Web Workers fanning the solver out across multiple seeds in parallel.

The main addition over existing tools is the adjacency-aware placer. It handles two user words that share no letters by placing them side-by-side and validating every resulting two-letter perpendicular run against an English bigram table. If every cross-pair is attested, the placement is accepted; if any pair fails, a different offset is tried. That is what lets the engine pack short personal word lists into a dense grid without flooding the result with generic dictionary fill.

Selected views

A few stills from the How It Works page, which collects the engine documentation, strategy comparisons, and interactive step-through demos in one place.

Strategy overview on the About pageAdjacency-aware strategy page, anchor placedAdjacency-aware strategy page, validating cross-letter pairsAdjacency-aware strategy page, accepted placement

Built with

Next.jsReactTypeScriptTailwindVercelRedisWeb Workers