

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.