Skip to main content

Crossword Generator

Generate a small themed crossword from a bundled clue pack with across/down clues and answer toggle.

Written by Golam Rabbani, Founder & Lead Engineer

9–15

Generates a small crossword from a bundled word/clue pack (15 words). Words are placed greedily by length and intersection count. Toggle answers to reveal the solution grid.

Placed: 7Skipped: 8
1W
2I
N
D
O
W
S
L
3B
4F
A
R
5M
O
U
N
T
A
I
N
R
D
D
6O
E
G
7C
A
S
T
L
E
E
E
T
A
N

Across

  1. 1. Opening in a wall for light (6)
  2. 5. A very tall natural elevation (8)
  3. 7. Fortified medieval residence (6)

Down

  1. 2. Land surrounded by water (6)
  2. 3. Structure built to span an obstacle (6)
  3. 4. Dense area of trees (6)
  4. 6. Vast body of salt water (5)

Puzzle ready

7 clues fit in a 13×13 grid using the General pack (8 skipped — regenerate to try again).

How to use this crossword generator

  1. Pick a theme (General, Animals, Tech, or Food) from the dropdown to set the bundled clue pack.
  2. Choose a grid size between 9 and 15 — bigger grids fit more words but feel less dense.
  3. Press Generate to build a fresh crossword; the placed words snap into a grid with numbered clue cells.
  4. Read the Across and Down clue lists below the grid; numbers in the grid match numbers in the lists.
  5. Toggle Show answers to reveal the solution letters in the grid, or Copy Puzzle to put the whole puzzle (grid + clues) on your clipboard.

About this crossword generator

Crossword Generator builds a small themed crossword from a bundled 15-entry clue pack. Each theme (General, Animals, Tech, Food) ships its own pack of word/clue pairs in lib/data/crossword-words.ts. The generator anchors the longest word horizontally in the middle of the grid, then for every remaining word it scans every cell on the grid for an existing letter that matches one of the word's letters, and tries to drop the word so the two letters cross. Placement is rejected if the word would touch a parallel word, if it would extend off the grid, or if it would overwrite an existing letter that does not match. The placement with the most intersections wins, which tends to produce a tight, connected grid.

After every placement the grid is renumbered by reading order, and each placement records its number, direction (across/down), starting row, and starting column. The Across and Down lists are sorted by number and printed below the grid. Black cells are the parts of the bounding box that no word occupies. The puzzle is fully solvable on paper — when you toggle Show answers, the letters appear directly in the grid; otherwise the cells show only their numbers.

Worked example: select the Tech theme with a 13×13 grid and press Generate. The generator starts with PYTHON (6 letters) placed across the centre. ROUTER (6 letters) finds an intersection on R, so it goes down through the R of PYTHON. SERVER lands across, intersecting the R of ROUTER. After several rounds you might see 10–12 of the 15 words placed; any that could not fit are reported in the "Skipped" counter. Press Generate again for a different layout (placements are heuristic, not exhaustive) or toggle Show answers to confirm the solution. Press Copy Puzzle and you get the bare grid (dots = empty, spaces = black squares) plus the Across and Down clue lists ready to paste into a Word doc or share over chat.

FAQ

Is the crossword symmetric like a newspaper puzzle?
No — the generator optimises for intersections, not for the 180° rotational symmetry traditional crosswords use. Black squares fall wherever no word reaches.
Why are some words skipped?
The greedy placement gives up on a word if it cannot find any legal intersection with the existing grid. Press Generate again to try a different anchor order; on larger grid sizes more words fit.
Can I print the puzzle?
Yes — use Copy Puzzle to grab a plain-text version (grid + clues) and paste into Word or Docs, then print. The on-screen grid also prints cleanly from the browser.
Where do the clues come from?
Four bundled packs of 15 word/clue pairs in lib/data/crossword-words.ts. No external dictionary is queried; clues are written to be solvable from general knowledge.
Does Show answers send the solution anywhere?
No. The solution is already on the page in the DOM; the toggle simply changes the letter colour from transparent to dark. Everything is client-side.
Why 9 to 15 as the size limit?
Below 9 the grid is usually too small to fit several 6-letter words; above 15 the layout no longer fits one column on a phone. 13 is a good default for most themes.