Word Search
A free, ad-free word search maker for building challenging puzzles from your own word lists, printing them with an answer key, and playing them in the browser or on Android.

I wanted word searches for myself and for my kids' teams, built from our own word lists. The free makers I found were covered in ads, stopped after three puzzles, or produced grids so easy the kids finished them in a minute. So I built my own: no ads, no limits, and a difficulty setting that makes the puzzle hard.
Once I could print them, I wanted to play them on screen too, because I enjoy doing them. Then I wanted them on my phone. The project grew in that order: a print generator, then an online game, then an Android app.
What you can do
- Build a puzzle from any word list. Type or paste up to 100 words, give the puzzle a title, and pick a grid from 5×5 up to 30×30. Randomize pulls a set from a built-in pool of themed words (animals, space, sports, school, nature, faith, and more).
- Make it hard. Words can run forwards, backwards and diagonally. The difficulty slider adds decoys, near-miss copies of your words such as TIGEK next to TIGER, so you can't solve the grid by spotting the first few letters.
- Print it. Printing hides the controls, scales the grid to fit Letter or A4, keeps everything black on white to save ink, and puts an answer key on its own page.
- Play it online. Drag across the letters to select a word. Each word you find lights up in its own color and gets crossed off the word bank until the puzzle is complete.
- Share it. Every setting is stored in the link, so sending the URL sends the whole puzzle setup.
How it works
The puzzle engine is a single TypeScript module. It cleans and uppercases the word list, then places the longest words first, because they're hardest to fit and need an empty grid. For each word it tries up to 100 random starting points and directions. A placement is accepted only if every cell it covers is empty or already holds the same letter, which is how words come to share letters where they cross. Words that can't fit are flagged, not silently dropped.
The decoys go in after the real words: take a real word, change one letter, and place it with the same rules, so a decoy never pushes a real word out. Every remaining empty cell gets a random letter. The engine works on a flat byte buffer instead of nested arrays, so even a full 30×30 grid generates instantly.
The website is Next.js, React, TypeScript and Tailwind, exported as a static site. It has no server, accounts or tracking. Puzzle settings live in the URL query string, and the print layout is @media print CSS with the cell size calculated to fill the page.
On my phone
The Android app is built with Expo and React Native, and it imports the same engine file as the website, so a fix to puzzle generation lands in both. The phone-specific parts were rewritten for touch:
- A drag snaps to the nearest of the eight directions, so a fingertip doesn't have to land precisely on a diagonal.
- An unfinished puzzle is saved, so closing the app doesn't lose your progress.
- Printing goes through Android's print dialog as a PDF, with the same layout and answer key as the web version.
- Settings use the same link format as the website, so a puzzle setup moves between the two.
The app is in testing and not on the Play Store yet.
The screenshots show the live website and the Android build running in an emulator.






