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

Overview
Most crossword-making tools fall into two camps. The ones that generate grids automatically pull from a generic dictionary, so the puzzle has nothing to do with words you actually wanted to use. The ones that let you bring your own words usually hand you a blank canvas and expect you to place every word by hand, which is exactly the part that's tedious.
Crossword Creator covers the middle: you supply a word list and a constraint-satisfaction engine packs those words into a real-style crossword, intersecting them as densely as possible. Three different 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.
Under the hood, it's a focused 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 that produce visibly different grids from the same input, and Web Workers fanning the solver out across multiple seeds in parallel.
The novel change in strategy I've provided 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-throughable demos in one place.



