Inspiration

Every morning at breakfast, my daughter Lea, who is almost four, asks her dad to tell her a story. Not read one, tell one. "Tell me a story about a cat who drives a tram." The next morning it's something else.

Books can't keep up. In Latvia, where we live, many children grow up with three languages: Latvian, Russian and English. Every book has to exist three times. Children's books are expensive and not always easy to find, and the one we need this week is rarely at hand: for potty training, for a doctor's visit she's afraid of, for a hard day at kindergarten, for learning the alphabet. A child's interests and worries change faster than any bookshelf.

I also worry about screens. We keep Lea's screen time as short as we can, but I see where it goes: children want screens, especially when every adult around them holds a phone. And most of what's on them breaks a child's attention and creativity. I want a different kind of screen time, one where a child has to think up a story, wait for it, and then listen.

LuniMuni is my answer.

What it does

A child makes a story from an idea. They can say it out loud, type it, or take or choose a photo of a drawing or a favourite toy. Making the story takes about a minute, and meanwhile the child can play with Luni, the app's mascot, who hops and waves when tapped. The finished story is a short text with a cover illustration, narrated aloud, with each word highlighted as it is read, so the child can follow along. The child can also pick the background music for each story.

Any story can be continued with one tap. The next chapter keeps the same characters, so a favourite story grows into a series. In one of ours, the characters learned to find north and south by looking at nature.

The app also comes with its own numbered series of stories about Luni, ready to read from the first minute. They are written to show how a story can be born from a voice, a doodle or a simple idea, so the child sees what they can make themselves.

Parents set up a profile for each child. They can describe what the child looks like and loves to wear, so the child appears on the covers, and add family members, pets and what is going on in the child's life, like a fear of the doctor or learning to share, for the stories to draw on. They choose the languages the stories are written and narrated in, from 15 supported languages; a child can have several and choose one for each story. They can also turn on review, so each new story waits for their approval before the child sees it.

Every story stays on the child's bookshelf, to read and listen to again. Parents can save stories for offline listening.

The child earns stickers for making, continuing and listening to stories, which encourages them to keep creating.

How I built it

I brought more than ten years of engineering to LuniMuni, across testing, backend, frontend and computer vision, and my goal was an architecture that stays solid while the AI underneath it keeps changing.

The app is Flutter, on a Python backend (FastAPI) with Supabase for the database, auth, storage and realtime updates. Android comes next from the same Flutter code.

Each story is made by a pipeline of specialised agents: a vision model reads the child's drawing or photo, speech-to-text turns their voice into an editable idea, the storyteller writes, the artist illustrates the cover, the narrator records the voice-over, and a summarizer carries the characters into the next chapter. The read-along needs no model of its own: every word is timed from the pauses in the narration itself.

Every agent is defined in its own YAML file: vendor, model, parameters, prompts and an optional fallback vendor. Nothing about a model is hardcoded in the backend, so changing a model, a vendor or a prompt is a config change and a deploy, live for every user at once, with no app update. Today the pipeline uses models from Google, Anthropic and OpenAI.

Safety is part of the pipeline, not a layer on top. A child's input goes through a keyword filter in every supported language and a moderation model before any story is written. Prompt-injection detection first strips invisible characters and look-alike letters, and the child's words reach the model as data, never mixed into its instructions. The story, its title and its cover are moderated again on the way out. The child's photos, drawings and recordings are never stored.

I partnered with a very talented designer on the interface, the icons and Luni. Keeping the app light was a deliberate choice at every step: all motion is written in code, without animation libraries like Lottie or Rive; Luni is one SVG split into moving parts; and every animation respects the system's reduce-motion setting. The whole app is under 80 MB.

More than 2,000 automated tests cover the app and the backend. Among them, layout tests open every screen in all 15 languages on three screen sizes and check that all the text fits, so no button or title is ever cut off in another language.

In production, Sentry reports errors from the app and the backend, and PostHog measures how the app is used, anonymously and without personal profiles. Langfuse traces the pipeline for debugging, but only in development and test runs: production never sends it a child's data.

Challenges I ran into

Building on AI for children came with six hard problems.

Safety. Children's stories are full of dragons, storms and friendly monsters, and moderation models flag short texts and non-English text too easily, Baltic and Nordic languages most of all. Too strict, and a child's innocent idea is blocked: to a moderation model, "a murder of crows" looks violent. Too loose, and something unsuitable reaches a small child. I set thresholds per category, adjusted for language and calibrated on real stories from the app, strict where it matters most. A story that fails a check never reaches the child and is not charged.

Consistent quality. Any model can write a story. Making every story worth reading, every cover look like a picture book rather than AI, and every narration sound natural in 15 languages took a year of experiments. So I built an eval system: the same ideas run through competing models and prompts, then an AI judge and I read the results side by side, scoring quality, speed and cost. Every change of model or prompt goes through it first.

Under a minute. A finished story in under a minute has been the goal from the start, and it is hard to hold. Every step takes time: reading the idea, writing, illustrating, narrating. So the steps that don't depend on each other run in parallel, the narration is split into chunks that are generated at the same time, and the length is balanced at up to 250 words: long enough to be a real story, short enough for a small child to listen to the end, and cheap enough to keep the price fair.

Models that keep changing. When I came back to LuniMuni after six months, every model I had tuned was deprecated or had got worse, and the configuration for text, narration and images had to be rebuilt. The config design I chose at the start paid off: each change since has been an evaluation and a deploy, not a rewrite.

Services that fail. AI providers slow down, time out and get overloaded regularly, for every app built on them. The pipeline expects it: calls retry, the storyteller falls back to a second vendor, and if the cover still fails, the story arrives without one rather than not at all. The child sees a story or a gentle message, never a technical error.

Making it pay. Every story costs real money: several models, an illustration and a narration. The price had to stay fair for families and still cover that, which is why the plans are counted in stories and every model choice weighs cost alongside quality.

Accomplishments I'm proud of

I started building LuniMuni in the summer of 2025. Building an app this complex alone, even with AI helping at every step, was really hard, and in March I burned out and stopped.

Six months later, the Shipaton brought me back. It gave me a deadline and a reason to finally deliver LuniMuni and take it to the next level, and in September it went live on the App Store. Without the Shipaton, LuniMuni would still be on hold. I'm truly grateful for it.

What I'm proudest of is that LuniMuni never feels like AI, to a child or to a parent: the stories read like real children's books, the covers look like picture-book paintings, and the narration sounds natural in all 15 languages. And the architecture underneath will keep it that way as the models change, which it has already proved once.

What I learned

The first lesson: an AI product is never finished. The models under it are replaced every few months, so the product is not the pipeline I built once, but the ability to re-tune it again and again.

The second: generating is easy, judging is the work. Any model can write a story; deciding whether it is good enough for a four-year-old is the hard part, and it takes a human reading alongside the AI judge. It also taught me that more rules make worse stories. For months the storyteller's prompt grew rule by rule and the stories got worse, and a short prompt brought them back.

The third is the one I think about most as a mother. AI will be part of my daughter's life whether I like it or not. I can't cancel it, but I can choose how she first meets it: as something she creates with, gently and safely, not something that feeds her videos.

What's next for LuniMuni

Next is the Android release, from the same Flutter code.

Then LuniMuni grows into a family of apps built around Luni. The aim is a new kind of tool for parents: technology that helps a child grow good qualities, like imagination, patience and calm, instead of competing for their attention. The second app is a bedtime routine that a child and a parent play together. The child completes small evening tasks, one unlocking the next; the games are tactile, like a massage or rolling the child up into a cinnamon bun; and when the routine is done, the reward is a bedtime story from Luni. It will be paired with Stories.

After that, Luni as a calm friend for hard moments: when a child is in the middle of a tantrum, Luni breathes with them until they settle. And, if families want them, printed books of their own stories.

To reach the mindful parents LuniMuni was made for, I'm building a content engine, starting with organic content I make myself. Working with creators comes later.

How it makes money

A subscription, run through RevenueCat: two plans, monthly or yearly, that differ in how many stories a family can make. Every plan starts with a 7-day free trial, and every account gets its first three stories free.

Built With

Share this project:

Updates

Submission history