GY

Parenting briefing

At home · live · Next.js, Vercel Cron, Resend

A twice-weekly briefing written by a model from vetted sources and delivered by email.

What it is

Claude writes a briefing on early development. It goes out by email on Mondays and Thursdays. I built the system with Claude Code. I let Claude write with warmth and invent activity ideas.

I split the sources into three tiers, labelled in the email. Facts come only from the science tier: CDC milestone guidance, American Academy of Pediatrics guidance on feeding, sleep and safety, Harvard's center on early development, and peer-reviewed studies, each with a citation and an evidence-strength tag. The other tiers hold popular frameworks and books, labelled as widely used and not research-backed, and fresh finds from weekly research. Every edition includes a disclaimer and gives no medical advice.

How it runs

Twice a week, Vercel Cron calls a serverless Next.js route that computes an age in weeks from a date in the config and loads the tiers, an iCal calendar and recent replies. I run two model passes, both Claude through the Vercel AI Gateway. Claude writes the edition, then checks every claim against the sources, corrects what it can and returns a list of issues for the log.

Replies arrive through a webhook into an append-only log in Vercel Blob, and the next edition addresses their themes. A new theme also triggers targeted research. Inbound mail has to pass a sender allowlist and a webhook signature check, and reply text reaches the model in a delimited block marked untrusted.

The weekly research job fetches candidate pages from a source allowlist, validates the support and cross-checks safety against the science tier. Only validated, labelled items reach the store. Nobody reads them first.

What it got wrong

Editions repeated content because the serverless job never wrote the archive that de-duplication read from. I added a durable content ledger the job writes after each send, and its digest goes into generation.

The model wrote the edition's nominal day into the header, so a Wednesday catch-up run said Thursday. Now it emits a token and code substitutes the real date.

The pinned model version went out of date and I didn't notice. The gateway has no latest-version alias, and an old model still writes good editions. I added a check that fails when the pin and the newest version differ.

Status

It's been live since June 2026. The source is private.