A free KDP puzzle book generator: makes a print-ready word search, sudoku, maze, criss-cross or crossword book for Amazon KDP — interior PDF and full-wrap cover — in the browser. Nothing is uploaded.
Live: https://puzzlepress.bananafest-destiny.com
Five puzzle types — word search, sudoku, mazes, criss-cross fill-ins and themed clued crosswords, plus a large-print preset at 8.5×11 sized for older eyes. Up to 200 puzzles, six KDP trim sizes, fonts embedded, answer keys, front matter, page numbers, and a cover whose spine width comes from the page count of the book you just made.
Free to use, and it makes the entire book. A free book carries one small line in
each page footer and a cover marked PREVIEW; $19 once removes both. No
account, no subscription.
A Bananafest Destiny app. Making activity books for younger readers? Trace Press makes KDP handwriting workbooks the same way: A–Z tracing pages, numbers 0–9, sight words and a matching cover, in the browser.
See it without running anything
Every sample below was generated by this code and is committed to the repo under
public/samples/. Interiors are 20 puzzles with solutions; each cover is the
single full-wrap PDF KDP asks for, with the spine sized to that book's page
count.
| Type | Interior | Cover |
|---|---|---|
| Word search | 6×9 | wrap |
| Large print | 8.5×11 | wrap |
| Sudoku | 6×9 | wrap |
| Mazes | 6×9 | wrap |
| Criss-cross | 6×9 | wrap |
| Crosswords | 6×9 | wrap |
Why the code is public
Because the central claim is a privacy claim — your word lists never leave your
browser — and there is no way to check that from the outside except by reading
the thing. Generation and PDF rendering are src/generator and src/pdf, both
entirely client-side. The only request that ever carries user data is the unlock
email. test/privacy.mjs drives a real browser through making and downloading a
book and fails if anything else leaves the page.
Licence — read this before you copy anything
There is no LICENSE file, which means all rights reserved. This is source-available, not open source. Read it, check it, learn from it, quote it, file an issue. Do not redeploy it.
What it produces
A PDF that meets Amazon KDP's paperback manuscript rules:
-
Six trim sizes (5×8 → 8.5×11), bleed or no bleed.
-
Inside (gutter) margin from KDP's page-count table, swapping sides by page parity so it binds correctly.
-
Title page, copyright page, one puzzle per page, a
Solutionsdivider forced onto a right-hand page, and solutions packed as densely as 7pt answer letters allow: 6 a page (4 on small trims), stepping down to 4, 2 or 1 when the grids are big, e.g. a 30×30 grid typed into a 5×8 book gets one a page. The page count shown before download already includes that, so the cover's spine matches the interior. -
KDP's measurable interior rules, from the Paperback Submission Guidelines, are each tested against rendered PDFs.
test/kdplines.mjsreads the drawing operators of every book type at every trim, including typed 21×21 and 30×30 grids:- lines: "a minimum thickness/weight of 0.75 point";
- type: "Minimum font size: 7 points";
- fills: "a minimum grayscale fill of 10%".
test/inkcheck.mjsrasterises every page and checks each pixel of ink sits inside KDP's margins, with 1/32" to spare. -
Large print (word search and sudoku) is large print on every page, answers included. KDP says large-print books "usually have a font size of 16 points or higher". At 6-up the answer letters are about 8pt, so a large-print book gets one answer grid a page, and every word a reader reads is 16pt or more (checked by
test/largeprint.test.js, which records every size drawn). At 8.5×11 a book of up to 50 puzzles still fits in KDP's flat-rate 110 pages. -
Notes pages to reach an even page count, and no further: a short book is not filled out to KDP's 24-page minimum — a one-puzzle book is ten pages and stays ten pages. The app warns you on screen when your settings produce a book KDP will reject for being too short, and that warning is what protects you, not extra pages. (This README claimed otherwise until 2026-09-14. It was wrong, and support was answering "KDP rejected my file" out of the wrong model.)
-
Fonts embedded and subset (Liberation Sans, SIL OFL) — KDP rejects manuscripts with un-embedded fonts.
-
A full-wrap cover: spine width from the page count and paper stock, bleed and barcode area kept clear, and every word at least 0.125" inside the trim lines, as KDP's cover guidelines ask (
test/coversafe.mjschecks that in pixels across every colour, trim and a deliberately over-long title and author). One of eight colours (picked from the title, or chosen), a two-colour title in Lilita One (SIL OFL), the book's own puzzle on the front with answers ringed in highlighter colours, a sticker with the puzzle count, a second puzzle on the back as printed inside, and a strip for the puzzle count, large print and solutions.
Free calculators, no sign-up
The KDP arithmetic this code had to get right internally is also published as single-purpose pages, because getting any of it wrong is a rejected file or a book that earns less than it should:
- Royalty calculator — printing cost and what you keep. Printing is flat $2.30 on regular trim from 24 pages to 110, and KDP pays 60% at $9.99 and 50% below it, so $9.98 earns a dollar a copy less than $9.99. It prices groundwood paper too — KDP's third paperback stock, black ink only and cheaper to print than white or cream — and says plainly that Expanded Distribution's 40% doesn't apply: KDP lists puzzle books, word search, sudoku, crossword and mazes as "content not currently accepted" there.
- Spine calculator — spine width from page count and paper (white, cream, groundwood or colour), and the full cover canvas in pixels at 300 DPI, which is what design tools actually ask you for.
- Margin calculator — the inside margin for your page count, which steps up at 150 pages.
- How to make a puzzle book — the 24-page minimum, the even-page rule, and the traps around both.
Puzzle quality
Anyone can scatter letters in a grid. Every type promises exactly one answer, and each promise is kept by construction or by check rather than by hope — because a puzzle with two solutions is a one-star review.
- Word search — every word appears exactly once. Crossing words can
accidentally spell another puzzle word a second time; those layouts are
discarded and regenerated, and palindromes are accounted for. No word nested
inside another in the same grid (
DEERandREINDEERnever share one, though both stay in the pool for other puzzles). Filler letters are screened so random fill never spells something you would not want in a children's or grandparent's book — words you chose are left alone. Every puzzle in a book gets a distinct word set. Three difficulties. - Sudoku — clues dug out in symmetric pairs; before each removal a solver counts solutions with a cap of two, and the pair goes back if it finds two. Four difficulties, plus 6×6 and 4×4 for kids' books.
- Mazes — iterative DFS carve, so the maze is a spanning tree and the path between any two cells is unique by construction. Nothing is punched open afterwards, which is where other generators produce two routes or sealed pockets.
- Criss-cross fill-ins — verified to have exactly one valid fill.
- Crosswords — open interlocking grids, 8–22 answers on a subject, with
2,346 clues written for the tool. No clue contains its answer; the test suite
checks that on every build. Paste
word — cluelines for your own.
Seeded and deterministic throughout — the same seed rebuilds the same book exactly.
Develop
npm install
npm test # generator + PDF unit tests
npm run build # bundle the UI to public/
npx wrangler dev # local Worker + site
npm run test:privacy # real browser, watches the network
npm run test:unlock # the paid path, against a stub Stripe, no money
npm run sample # regenerate the public sample book
Deploy is npx wrangler deploy with a Cloudflare token that has
Account → Workers Scripts → Edit.
The suites ending .mjs mostly drive a real browser with Playwright; a few need
pdftotext (poppler-utils) to read the generated PDFs. That matters more than
it sounds. The watermark test used to grep the PDF bytes for the words, which
can never match, because pdf-lib subsets the embedded font and the text is glyph
ids inside a compressed stream. The single claim the product makes about what
$19 buys was being checked by an assertion that could not fail.
Layout
| Path | What |
|---|---|
src/generator/ |
the five generators, themed word lists, book batching, seeded RNG |
src/pdf/ |
KDP page geometry, imposition, cover wrap, the pdf-lib renderer |
src/ui/ |
the single-page app and licence state |
src/worker.js |
Cloudflare Worker: static assets, /config.js, /api/verify |
test/ |
unit tests (node --test) and real-browser runs |
scripts/ |
build, deploy helpers, traffic dashboard, support lookup |
There was a marketing/ directory here — launch plans, the support runbook, the
prepared answers to launch-day questions. It now lives in the repo this one is
split out of, https://github.com/walkertbrown/vibe-cider, which is the public
build log for the whole project: it is one click away, not hidden. The split is
about what belongs where — this repo is the product and its source — and not
about secrecy, and it would be dishonest to imply otherwise. Two test files
check copy against that directory and skip those checks when it is absent,
which is what this repo looks like.
Who made it
An agent — Claude (Opus 5, later Opus 5.5) in Claude Code — running as the sole worker on the
project, under a boss who answers factual questions and buys things and does not
workshop the product. The full plan-and-outcome log, including the parts that
went wrong, is in walkertbrown/vibe-cider:
what was planned each day in plan/, what actually happened in actual/, and
what was learned in LEARNED.md.


