Inspiration

My brother is autistic. The memory that never left me is a dentist visit: he was afraid before we even reached the door, screaming in the waiting room, and nothing we said could reach him. Nobody had shown him what was going to happen. What helped him was never a grand intervention. It was preparation: knowing what would happen, in what order, in plain words.

Social stories are that idea, formalized. They are one of the best-studied ways to prepare an autistic child for something new: the dentist, a fire drill, plans changing. But they are handmade. In one survey, 96% of teachers said they personalize every story for a specific student, and one good story means writing it, illustrating it, sometimes recording it. Hours of work for something a child might need tomorrow morning. And that assumes a family ever gets near a specialist who writes them at all: roughly 1 in 100 children worldwide are autistic, and where services are scarce, most are never formally identified.

The first story BeBoo ships with is about a child visiting the dentist. That is not a coincidence.

What it does

A caregiver types one sentence, like "Our usual routine is changing because we're traveling," and BeBoo turns it into that child's own story: three to six illustrated pages starring the child, the same character on every page, narrated in a calm voice with word-by-word highlighting the child can follow along.

Between pages come gentle emotion check-ins ("How does Sami feel?"). A miss never gets a red X. It gets a warm clue pointing at something actually visible in the picture ("Look at Sami's hands squeezing the backpack straps."), then another look. A second miss just gets the answer, warmly. There is also a Practice area the child can open any time: How I feel now, Breathe with BeBoo, Squeeze and hug, the same regulation tools the stories teach.

Everything for grown-ups lives behind a four-digit PIN: story creation, the library, per-emotion accuracy, confusion pairs ("often mixes calm with nervous"), and the feelings the child chose to share, so the caregiver can see exactly which emotion needs practice and make the next story about it.

And some rules hold everywhere, always: no autoplayed audio, no timers, no scores, no streaks, no red, no idioms. First name only, no photos, and full deletion of everything in a single request.

How we built it

Spec first. Before any code I wrote five docs (BRAND, PRODUCT, STORY_RULES, PRACTICE, ARCHITECTURE) plus an AGENTS.md that turns nine child-safety rules into acceptance criteria for every task. Then I opened one Codex thread and built the entire product inside it, timestamped conventional commits throughout. Codex read the docs and built to them; on the heavier phases it split the work across parallel subagents (backend foundation, backend runtime, frontend generation) while the main thread held the plan. Whenever something was ambiguous, the docs were the referee, not my mood at 2 AM. The whole session ran GPT-5.6 Terra at Ultra effort.

The pipeline: GPT-5.6 Terra writes the complete story as strict structured-output JSON, covering pages, scenes, check-ins, even a per-page animation choice. A second Terra pass validates every page against the social-story checklist and regenerates failures with reasons, max twice. GPT Image illustrates each page through the Edits endpoint using a cached per-child character sheet, so the cast stays identical across pages; gpt-image-1-mini is the frugal default, and gpt-image-2 at high is the flagship configuration. gpt-4o-mini-tts narrates (voice "marin", instructed to read slowly, like a storyteller). whisper-1 then transcribes BeBoo's own narration with word-level timestamps, and those timestamps drive the karaoke highlight.

Stack: React 18 + TypeScript + Tailwind in front, Express + Prisma + Neon Postgres behind, one Render deployment serving both. Generated media lives as content-hashed bytea in Postgres with immutable cache headers. Hosting cost: $0.

Challenges we ran into

Sometimes I got

Character consistency was the scariest. Image models love to redraw your protagonist on every page. The fix: generate one character sheet per child at profile creation, then make every page through the Edits endpoint with that sheet as the reference. I also learned the hard way that input_fidelity behaves differently across image models: gpt-image-2 applies high fidelity automatically and rejects the parameter, gpt-image-1-mini rejects it too, and only the 1.x models want it explicit.

The karaoke highlight: TTS gives you audio, not timings. So BeBoo transcribes its own narration with whisper-1 word timestamps, sanity-checks them (monotonic, at least 90% of words matched), and falls back to proportional timing when Whisper disagrees with itself.

Making a model boring on purpose is genuinely hard. Sentences under ten words, no idioms, name the feeling and pair it with a visible body cue: the writing pass gets you most of the way, and the validator pass catches the rest. Research on AI social stories names constraint adherence as the core failure mode, so the whole architecture is built around it.

And free tiers. Images and audio inside a 0.5 GB Postgres, cold starts on Render, hence aggressive content-hash caching, cheap runtime defaults with a separate flagship demo config, and a seed mode where the entire child zone runs with no backend at all.

Accomplishments that we're proud of

The thing I'm proudest of is invisible: the story text, the scene description, and the check-in clue are generated as one contract, so when BeBoo says "look at Sami's hands squeezing the backpack straps," the straps are actually in the picture. That coherence is what makes a miss feel like help instead of failure.

Beyond that: a child can use the whole app without reading a single instruction, with fixed, predictable controls, 64 px touch targets, and nothing that jumps or flashes. And it shipped complete, with the child zone, parent zone, Practice, and dashboard, in one Codex thread, because the docs were the spec.

What we learned

An agent is only as good as its constitution. The quality of AGENTS.md determined the quality of every Codex session, and "build nothing outside the docs" prevented more bugs than any test suite. I also learned that designing for autistic children is mostly deleting: no confetti, no streaks, no countdowns, no surprises. Restraint is the feature. And models compose in ways their names don't suggest: Whisper as a timing tool, image Edits as a consistency tool.

What's next for BeBoo

Arabic and French narration and text first the families with the least access to specialists are rarely served in English, and BeBoo exists for them. Then a small pilot with parents and teachers, measuring comprehension against what the literature reports. Printable story export for classrooms. Teacher accounts with several children. And offline caching of finished stories, because a spotty connection should never stand between a child and their story.

Built With

Share this project:

Updates