HomeWorkServicesAboutArticlesContactClient Login
Home / Articles / Case Study
/ Case Study

Building Once: Bedtime Stories That Know Your Family

How I built Once, an iOS app that writes a new bedtime story each night starring a family’s real kids, pets, grandparents, and places — and why the hard parts were child safety and a screen that has to put people to sleep.

TL;DR

Once is an iOS app I designed and built end to end. Parents keep a private memory vault of the people and places in their kids’ lives, and each night Once writes a new story starring those real details. The story adapts as it is read, the reader dims as the room gets quieter, and every story is kept forever. It is built with Flutter, FastAPI, PostgreSQL, Firebase Auth, and the Claude API, and most of the engineering went into child safety and into a reader that works at bedtime.

Parker Strode

Founder & Systems Engineer · September 17, 2026 · 8 min read

Most bedtime stories go something like "a friendly dog went on an adventure." Once tells the one where Sully the boxer chased a lava monster past Grandma's blue house, and your kid is the hero, by name and at their age. The whole product exists for the moment a child hears their own dog's name in a story and realizes it's about them.

That's Once, an iOS app I just finished and sent to Apple.

The Once marketing site at getonce.app
getonce.app

What Once Does

A memory vault for your family. Parents add their kids, pets, grandparents, favorite places, and the things that matter at home, like the red wagon, the lake house, or the nightlight. Every story is written from those details, so the stories get better as you add more.

A new story every night. Tap "Tonight's story," pick who's listening, and the story writes itself onto the page in about a minute. Stories stream in as they're written, so nobody stares at a spinner while a tired kid waits.

A story that changes as you read it. This is the part I'm proudest of. See the next section.

Read it together, however you want. Read it yourself and the page follows along with your voice. Or let Once read it aloud while you rest your eyes, with public-domain classical music playing quietly underneath.

Every story is kept. Stories are archived and cached on the phone, so the whole library works offline. You can bookmark a story partway through, reread old favorites, and see what you read "one year ago tonight."

One plan for the whole household. Invite a partner or the grandparents with a code or a QR scan. Everyone shares the same vault and archive and reads to the same kids, all on one subscription for up to four adults.

Once home screen with tonight's storyThe memory vault: pets, family members, places, things, themes, and a never-include listChoosing who is listening tonight before weaving the story
Home, the memory vault (“Your World”), and tonight’s setup

Stories Without a Set Length

The first version asked parents to choose a story length before the story existed. Nobody can answer that at 7pm. You don't know yet whether tonight will be a four-minute night or a twenty-minute one.

So I took the question out. A story starts at about five minutes, doesn't show a length, and whoever's reading can steer it while they go:

  • Gentler if it's getting too exciting
  • More if they're still wide awake
  • Sleepy when their eyes start closing

The story keeps writing toward an ending that moves in response. One rule never changed: this is not an infinite story. The ending, where everyone is safe and drifting off, is the emotional point of the whole product, and a kid who never reaches it never gets that resolution. The reader controls how far away the ending is and what kind of ending it is. They never control whether there is one.

Pricing follows the same idea. Only "More" counts against a family's allowance. Gentler, Sleepy, and "bring it to a close" are always free, because a parent taps those in response to something happening in the room. Putting a paywall there would leave a scared kid stuck halfway through a story.

Child Safety Is the Product

An app that writes stories for three-to-seven-year-olds, using their real names and set in their real houses, has to hold a higher bar than fiction in general. Kids that age can't reliably tell story from reality, and in these stories they're a named character in their own home. Most of the backend work went into this.

A content floor that covers more than scary scenes. It also covers what a story must never do to a child: shame them, compare them to a sibling, treat sleep as a threat or a reward, include a parent who doesn't come back, or aim a moral at the child. Every story ends with everyone safe and at peace, and every story is checked before anyone sees it.

Everything a parent types is screened and neutralized. These are two separate jobs. Screening asks a model whether the content is appropriate, and if it's unsure, it refuses. Neutralizing strips out anything that could act as an instruction to the model. That matters because vault details end up inside the prompt, and the neutralizing step is also the defense for text already in the database. I tested it against the tricks people actually use: full-width punctuation, zero-width spaces, and splitting one long instruction across a dozen short fields.

Names are held to a stricter standard. A dragon who toots is fine at bedtime. A child entered as "Poop" isn't, because that name gets read aloud every night. Names of children, pets, and family members go through a stricter check than places and story details. ("Death Valley" is a real place a family might have visited.)

Remembered, not present. A parent can mark someone who has died, and that person is remembered in the story instead of written in as if they were still around. There's also a "never include" list for anything a family wants kept out of bedtime.

When something is refused, the parent sees why. The server explains what to change, and the app shows that message with the parent's text still on screen so they can fix it. A generic "check your connection" error with the form cleared would be worse than useless.

A Screen That Has to Put People to Sleep

Most apps try to keep you looking at them. Once's reader is built to do the opposite.

It's dark, it dims and warms as the story goes on, and it never makes the screen brighter than you had it. The second half of every story is a long, calm wind-down meant to be read aloud while a kid drifts off. When the ending arrives, the story closes itself: "Drifting off…" runs for ten seconds, then the screen goes dark and says goodnight. Nobody has to reach for the phone.

The Once reader showing The Volcano Dragon with an illuminated drop capYour Stories: the archive of every story written for the family
The reader, and the archive where every story is kept

The story art is also built for the kids who'll see it. The illustration library includes characters who wear glasses, use wheelchairs, and walk with canes, so kids who use those things show up in the world of the story sometimes instead of never.

Tests That Actually Test

One lesson from this build applies to every project I take on. At one point the test suite had 590 passing tests, and the reader still shipped four bugs in a single day: one blanked the story, one hid the ending, and two more. None of those tests ever built the reader. Many of them only checked the source code for the right text, and that kind of test passes even when the code is broken.

So the project now has rules: call the code instead of reading it, give every bug fix a test that reproduces the broken version, and make sure new code has a real caller and a test that goes through that caller. A green checkmark doesn't mean much if the tests never touch the code that broke.

The Stack

  • App: Flutter (Dart), with a small amount of native Swift, for iPhone and iPad
  • Backend: FastAPI (Python) and PostgreSQL. This handles auth, the vault, story streaming, family sharing, and usage limits.
  • AI: Anthropic's Claude API, called only from the server. The API key never ships in the app.
  • Auth: Firebase, with Sign in with Apple and Google
  • Marketing site: React, at getonce.app, including a public reader so a shared story opens in any browser without the app or an account

Why It Matters for Your Project

Once is a consumer app, but the hard problems in it show up in most real software: an AI feature you can trust with sensitive data, billing that doesn't punish people at the wrong moment, a mobile interface built for how people actually use it, and tests that catch real failures. It's the same way I build software for clients. One person handles every layer, from the idea to the App Store listing to the server running underneath.


Once is a product of Anticline. Check it out at getonce.app. If you have an app idea that needs to ship right, let's talk.

/ Let's talk

Got a project in mind?

Call nowGet a quote