Scroll for what this is.

What this is

My son Marcus is one. Every few days he does something small and completely his own, and I forget most of it by the weekend.

So I write down what actually happened, in my own words, and an AI turns it into an illustrated storybook: a few pages, a picture for each, the same face and the same yellow puppy pyjamas throughout. The moments are real — nothing is invented except the telling.

Something he can read later about a version of himself he will not remember.

Family: make a new storyYou’ll be asked for the family password. The stories are readable by anyone I send a link to; what I originally wrote down is not.

How it was built

An AI wrote most of this code. The value I added was knowing what to check.

Three things it got past me, and how each was caught.

A picture, not a test

Every cover was being drawn from page one’s art prompt. A function returned null for the cover slot and a ?? 0 quietly turned that into “page one”. Character consistency worked perfectly, the story was right, nothing threw. The cover was simply the same picture as the first page. No test caught it. I looked at two images and thought they were too similar.

An event that meant something else

Read-aloud had three separate bugs with one cause: speechSynthesis.cancel()fires the same “ended” event that a finished page does, so stopping skipped ahead and carried on reading. My first fix reintroduced the same mistake somewhere new. What held was a fake speech engine that could fire events in the wrong order on purpose.

A number no one eyeballs

A colour pair on the one button that spends money measured 4.503 against a 4.5 threshold. It passed, and passing by three thousandths is not passing on purpose. That one needed arithmetic rather than judgement, which is the other half of the same point.

Colour contrast is one of 8 checks that have to pass before anything merges: 40 pairs across both themes, reading the palette out of the stylesheet so it cannot drift from what ships.

Writing a story and illustrating it costs about 14 cents a book, more for a longer one — every page is another picture, and the pictures are most of it. Those are provider-reported figures recorded on each row as it happens, not estimates. Built with Next.js, Postgres, Gemini for the words and GPT Image for the pictures. How it holds up.

The print stylesheet makes a title page and one page per sheet. It has been checked as a PDF and printed — on one printer, at one paper size.