๐ Book listing temporarily offline
The Amazon listing for What Does the Moon Dream About? is currently unavailable. We're confirming the book's status with KDP and will restore the buy link once resolved. The story behind the build is still below.
Two months ago I'd never used KDP. Three days ago I shipped my first paperback: What Does the Moon Dream About? โ a bedtime story for ages 3-7. Update 2026-05-13: the Amazon listing is currently offline pending KDP follow-up (see banner above). Two more books built on the same pipeline are en route.
The whole pipeline ran on free tools + ~6 hours of focused work + 2 KDP rejection cycles. Here's what it actually looked like.
The pipeline
Three Python scripts, three open-source models, zero external services:
- Pollinations FLUX (free, no auth) โ generated 24 illustrations at 2550ร2550 (300 DPI for 8.5" print) with seed=42 for character consistency across pages
- reportlab + Google Fonts (Caveat + Patrick Hand) โ assembled the 24-page interior PDF with text overlays in soft cream panels
- reportlab again โ assembled the print-ready 17.31"ร8.75" cover spread (back + spine + front, with bleed)
That's it. No designer, no illustrator, no manuscript editor. The rhyming verses I wrote myself (24 quatrains in one sitting), the character โ a sleepy crescent moon with pink cheek-blush and a small star companion โ was held consistent via prompt-engineering and shared seed.
What KDP rejected (twice)
Both rejections were mechanical, not content. KDP's automated prepress checker caught real issues:
| Rejection | Cause | Fix |
|---|---|---|
| 1. Cover text too close to edges | Title banner sat AT the trim line (0" safety zone); KDP requires โฅ0.375" | Pulled banner 0.4" inside trim, dropped title font 60โ54pt so handwritten ascenders fit inside banner |
| 2. Interior had insufficient bleed | Pages were 8.5ร8.5 flat โ KDP wants 8.75ร8.75 with images extending past trim on all four sides | Re-sized pages to bled dimensions, extended image draws to (0,0)โ(PAGE_W,PAGE_H) |
Both fixes took ~30 minutes once diagnosed. The interior PDF binary went from 313 MB to 313 MB (same โ images dominate, the dimension change is metadata).
Automated preflight (saved me a third rejection)
After the first rejection I wrote a 50-line PyMuPDF script that extracts every text bounding box from the PDF and verifies each is inside KDP's 0.375" safety zone. Same logic runs on the cover (per-side: back / spine / front). 10/10 text spans inside safety = ship.
import fitz
TRIM = 8.5 * 72
BLEED = 0.125 * 72
SAFETY = 0.375 * 72
PAGE = TRIM + 2 * BLEED
safe = fitz.Rect(BLEED + SAFETY, BLEED + SAFETY,
PAGE - BLEED - SAFETY, PAGE - BLEED - SAFETY)
doc = fitz.open("book01_interior.pdf")
for i, page in enumerate(doc):
for block in page.get_text("dict")["blocks"]:
for line in block.get("lines", []):
for span in line.get("spans", []):
bbox = fitz.Rect(span["bbox"])
if not safe.contains(bbox):
print(f"page {i+1} '{span['text'][:30]}' overflows")
If I'd run this before the first submit, I'd have saved a 24-hour KDP review cycle.
The economics
| Item | Number |
|---|---|
| List price (US) | $9.99 |
| KDP printing cost (US) | $4.20 |
| Royalty per US sale (60%) | $3.47 |
| India list price (auto-synced) | โน699 |
| Sales required to recoup time | ~6 hours of work ร $50/hr รท $3.47 = 86 copies |
86 copies is the threshold for hourly-rate breakeven. At a competitive ranking for "moon bedtime story for kids," that's 2-4 months of organic sales without paid acquisition. After break-even, every additional copy is pure margin (KDP prints on demand โ no inventory cost).
Why this isn't a one-off
The full pipeline is now a 90-minute template. Same Pollinations FLUX + reportlab + KDP workflow โ next 4 books in the Dreaming World series are queued (Sun / Stars / Ocean / Forest themes). Each one carries the moon character forward as a recurring guide.
The unit economics scale. A series of 8 books at 20 sales/month each clears ~$550/month in royalties, compounding for 5+ years. No staff, no support burden, no servers. KDP handles fulfillment globally.
Tools used (full list, all free)
- Pollinations.ai โ FLUX-based image generation, no auth, no rate limits I hit
- reportlab โ Python PDF assembly
- Caveat + Patrick Hand โ handwritten Google Fonts
- PyMuPDF โ preflight checker for KDP safety zones
- Amazon KDP โ distribution + print-on-demand
What I'd do differently
Run the preflight checker as the FIRST step after rendering. Both KDP rejections cost me 24-48 hours each of review-queue time when 30 seconds of Python would have caught them.
๐ Grab the pipeline code
The full Python pipeline that built this book (FLUX cover gen + reportlab interior + cover assembler + KDP preflight checker) is in my GitHub org โ open-source. Two more books built on this pipeline are queued for release (AWS SAA-C03 practice exam, Cryptograms for Programmers).
View the source on GitHub โ