TL;DR
Halo is a children’s Bible-stories app for iOS and Android — stories, prayers, songs, devotionals, and affirmations.
I shipped it solo, working alongside Claude Code as my engineering partner.
- Headcount: 1 human + AI tooling
- Role: Founder / Designer / PM / Engineer
- Stack: Flutter, Firebase (Firestore + Auth), RevenueCat, Algolia, Elevenlabs TTS, Suno AI
- Platforms: iOS (App Store), Android (Play Store)
- Built: September 2025 – March 2026 (FlutterFlow prototype → full Flutter rewrite)
As a new parent, you discover a world of new people problems.

People Problems
- “I am having trouble getting my kids to bed.”
- “I want to raise godly children and protect them from worldly influences”
Parents want a calm, intentional way to share faith with their kids at bedtime — and the existing Bible-app market does not give them one.
There was no app that felt like sitting next to a kind storyteller in a quiet room. So I built one.
How we know this is real
Market signal: Keyword research, verified through the Keywords Everywhere API and cross-checked against Google Keyword Planner, showed substantial underserved demand:
- “bedtime bible stories” — 49,500 searches/month
- “bible app for kids” — 12,000/month
- “sleep stories app for children” + “christian bedtime app” — thousands/month across long-tail variants
Google Keyword Planner was hiding 77% of the real search opportunity — a gap I only found by reconciling two sources during campaign planning. The demand is real. The market is underserved.
Competitive gap: The top competitors validate the market, but they miss the bedtime brief. Pray.com ($13.99/mo) treats kids content as an add-on to an adult meditation app. Bible App for Kids (YouVersion) is gamified and screen-heavy. Minno ($10.99/mo) and Yippee TV ($7.99/mo) are video-first — the opposite of screen-off audio. Hallow is the closest in spirit: sacred, warm, content-rich. But it is built for adults.
Existing audience: Christian Pure (christianpure.com), the parent content platform, was already reaching 240K monthly active users across 4927 blog posts — with almost nothing aimed at parents or kids. The audience existed. The bridge to a product did not.
Success Metrics
Primary metric:
7-day return rate during the 7–9pm window. A parent who opens Halo three nights in a row at bedtime is the product working.
Counter-metrics:
- Session length — average session 5–15 min. If it climbs above 20 min, we have become a pacifier, not a sanctuary.
- Refund rate < 2% — parents who pay should feel the value right away.
- App Store rating ≥ 4.6 — the parents-trust-this signal.
Qualitative:
Parent-written reviews using the words calm, peaceful, beautiful, my child loves it. One of those is worth more than a thousand DAU points.
Shipped:
- 100+ pieces of content: Bible stories, prayers, lullabies, affirmations, songs
- 5 languages: English, Spanish, Portuguese, Russian, German
- Freemium model: subscription ($8.99/mo or $78.99/yr) + individual story purchases ($0.99)
- Google Ad Grants campaign: $10K/month in free Google Ads, 11 ad groups, verified keyword clusters
- 100-200 downloads per day currently
Process
1. Aligning on the art style
The hardest part of building a calm app is resisting the urge to make it loud. The whole category pulls toward more — more color, more motion, more micro-interactions, more notifications. Halo needed the opposite.
I started from the wrong reference and corrected it mid-build. That turned out to be the most important design decision in the project.
First pass: The reference was Calm / Headspace — minimalist, meditative, lots of whitespace.
Course correction: After running a design audit on the homepage, I realized minimalism was not quite right. Halo needed more warmth and content density than a meditation app — where the home tab is the browse experience, organized by themed collections rather than by content type. Sacred, but full. Quiet, but generous.
I locked that direction into a design brief that lives in CLAUDE.md and ships with the repo, so every future AI session inherits it:
Three brand words: Gentle. Reverent. Whimsical.
Sanctuary, not playground. Resist the urge to add gamification, badges, streaks, or anything that creates urgency.
Warmth over polish. Hand-drawn, organic, textured. Imperfection is part of the charm.
Breathe. Generous whitespace. Never crowd the screen.
One thing at a time. One primary action per view.
Earned trust. No dark patterns. No manipulative upsells. No attention-hijacking. Parents must feel this is safe.
The visual language followed:
- Color: Warm earth tones on parchment. Light mode is sunlit linen (
#EBE8DD); dark mode is a cozy night sky (#262523). Each content category gets its own warm hue — gold for songs, orange for stories, teal for prayers, forest for devotionals, muted purple for affirmations. - Type: Playpen Sans (handwritten, child-friendly, whimsical) for headlines + Inter (clean, geometric, trustworthy) for UI. Playpen carries the warmth; Inter carries the readability.
- Motion: Slow fades and soft slides. No springy bounces.
- Touch targets: 48px minimum — children’s hands are imprecise.
- Bedtime-friendly transitions: Native push transitions with a 200ms minimum duration. Default Flutter transitions felt jittery.
The App Store screenshots went through the same correction. The first set led with feature lists — a cardinal sin of ASO. The redesign philosophy was simple: sell the feeling, not the features. Lead with the moment — a child falling asleep — build a narrative arc across frames, go full-bleed with illustrations, and end with social proof and a warm CTA.
2. Defining the name
Why did “Halo” win? It carries reverence without being preachy. One syllable — parents will say it out loud. It implies light and protection. It also works across all five languages the app ships in.
3. Building & customizing the app
The FlutterFlow phase (September – December 2025)
Halo started in FlutterFlow. That was the right call for speed: it let me get a working prototype with audio playback, a Firebase backend, and RevenueCat subscriptions live on both platforms fast.
FlutterFlow hit its ceiling on three fronts:
Audio engineering was brutal. The app needed dual-track playback: a narration track and a background music track, playing at the same time, continuing with the screen locked, with lock-screen controls on both platforms. That meant navigating audioplayers (no background support), just_audio + just_audio_background (which needed initialization in main() before runApp(), something FlutterFlow’s architecture made fragile), and audio_session (for iOS audio category configuration). At one point narration worked on iOS but not Android because JustAudioBackground.init() was conditionally excluded from Android in a platform check — a bug that only surfaced after reading raw console output and tracing initialization order through FlutterFlow’s generated code.
Consumable purchases did not fit. FlutterFlow’s RevenueCat integration centered on subscriptions and entitlements. Individual story purchases — consumable IAPs at $0.99 — required custom Dart actions for the post-purchase flow: updating Firestore with purchased story IDs, refreshing the UI to show unlocked content, and handling the distinction between subscription access and individual purchase access. FlutterFlow’s UI for wiring custom actions was opaque.
The feedback loop was too slow. FlutterFlow showed one version of main.dart in its editor while the exported code contained much more. Debugging meant jumping between FlutterFlow, Android Studio, Xcode, the Firebase console, and RevenueCat’s dashboard.
The Flutter + Claude Code phase (January 2026 onward)
The migration was gradual and surgical: evolve, don’t rewrite. FlutterFlow’s exported code became the starting point. Claude Code in VS Code became the primary development tool.
Headline features shipped:
| Feature | What it does | Why it was hard |
|---|---|---|
| Five-category content mosaic | The homepage: five thematic tiles — Stories, Prayers, Songs, Devotionals, and Affirmations — each with its own color, illustration, and detail page. | It had to feel like a curated bookshelf, not a navigation menu. |
| Multi-language story library | The same stories across five Firestore collections (stories, stories_es, stories_pt, stories_ru, stories_de). | Doc IDs do not match across languages. I built a canonical-ID resolver that prefers the id field inside the doc and falls back to the doc ID, so favorites and purchases survive language switches. |
| Algolia search | Instant search across stories with localized indices. | Localized indices only contain text fields — image, audio, tier, and duration are missing. I added a fetch-full-doc-after-search step and an automatic fallback to the base index when localized search returns empty. |
| Favorites that survive everything | Hearts on stories, persisted across language switches and reinstalls. | I migrated from legacy Firestore DocumentReference paths, which broke on language change, to canonical IDs in ff_favoriteStoryIds. |
| Purchase preservation across account merges | Users who pay never lose purchases, even if they sign in with a different provider. | This took an entire sprint (builds 74–75). Storing unlocks as canonical IDs under user/{uid}/unlockedStoryIds instead of doc references made merges idempotent. |
| RevenueCat premium + individual purchases | One subscription unlocks everything. Individual stories are also available at $0.99. | I needed one source of truth: FFAppState().hasPremium from the halopremium entitlement. isStoryUnlocked() short-circuits on premium so subscribers never see a paywall on individual stories. |
| Performance pass for older Android | Disk image caching, lazy carousels, lazy SliverGrid, and selective rebuilds on category pages. | Halo’s audience includes parents on older or handed-down devices. The app had to feel calm there too. |
| Dual-track audio with lock-screen controls | Narration + background music on both platforms, with screen-off playback. | This was the most technically painful feature in the build: cross-platform foreground service configuration, JustAudioBackground initialization order, and AudioSession category management. |
The single biggest engineering day was March 6. In one push, I shipped seven bug fixes, a performance refactor with eight surgical improvements, disk image caching, lazy carousel loading, a homepage visual overhaul, carousel and verse-card polish, and native push transitions. That was the day Halo stopped feeling like a FlutterFlow export and started feeling like Halo.
Then it shipped. App Store on March 10. Play Store right after.
4. How I used AI along the way
The engineering workflow
- Claude Code as the primary engineering partner. Not autocomplete — a collaborator I plan with, argue with, and hand surgical work to. It lives in the terminal next to the project.
- A persistent design brief (
CLAUDE.md) that ships with the repo. Every new session starts with the brand voice, color tokens, design principles, common pitfalls, and the people problem already loaded. This was the highest-leverage thing I did. The AI never had to be reminded what Halo was supposed to feel like. - Custom skills I built or installed for specific kinds of work:
product-thinking— forces a start from the people problem before writing codemeta-ic-execution— routes each task to the right rigor level (small fix vs. cross-cutting architectural change)auditandcritique— design-quality passes run on screens before shipping. The Hallow course correction came out of one of these.teach-impeccable— a one-time setup that walked the codebase, asked design questions, and persisted the answers intoCLAUDE.md- Cross-machine sync via iCloud, so the same skills, memory, and design brief follow me between machines. Continuity matters when you work in fragmented windows.
AI across the entire production pipeline
AI was not just the coding partner. It became the production method for almost every layer of the product.
Voice generation (ElevenLabs TTS): All story narrations were generated with ElevenLabs text-to-speech using emotion tags. Each story was marked up with tags — <emotion value="calm"/> for narration, <emotion value="warm"/> for God’s voice, <emotion value="excited"/> for wonder moments, <emotion value="soft"/> for prayers. Strategic <break> tags controlled pacing. Speed and volume were reduced globally for bedtime warmth. Before ElevenLabs, I evaluated Cartesia, Google Gemini 2.5 TTS, Fish Audio, Hume Octave, and open-source alternatives. ElevenLabs won on emotional control — critical for stories where God’s voice needs to sound different from the narrator.
Music generation (Suno AI): Original nursery rhymes and lullabies were composed and generated with Suno. The process was iterative: write lyrics in nursery-rhyme structure — 4–5 words per line, heavy repetition, animal sounds — then tune the style tags across multiple generations. The goal was simple: songs predictable enough that a toddler can anticipate every line by verse two.
Art generation: Story illustrations and app assets were explored through Midjourney and Ideogram, with prompt engineering tuned for a children’s-book aesthetic: warm colors, diverse characters, scripture-appropriate scenes.
Content authoring: Bible stories were retold for ages 3–10, prayers written in age-appropriate language, and affirmations grounded in Scripture — all co-authored with AI under a theological accuracy constraint.
Marketing and growth: AI also helped with keyword-research analysis, Google Ads campaign architecture (11 ad groups, negative keyword lists, GA4 + Firebase conversion tracking), landing page copy and design (three iterations, from WordPress blocks to a custom bedtime-atmosphere page with star-field animations), App Store release notes with Spanish and Portuguese translations, email marketing architecture with Kit, and multilingual strategy.
Where AI was genuinely transformative
- Multilingual content infrastructure. Five languages, canonical-ID resolution, cross-collection fallbacks, Algolia localized-index quirks. I designed the architecture; Claude Code wrote and verified the implementations.
- Performance refactoring. The March 6 perf pass — disk image caching, lazy
SliverGrid, selective rebuilds — was a surgical eight-change refactor that would have taken a week by hand. With an AI partner that reads function signatures before calling them, it took an afternoon. - Design rigor. Running
/auditand/critiqueon the homepage caught a Critical accessibility issue — zeroSemantics()calls, so no screen-reader support — and a hard-coded color that made a badge invisible in dark mode. I would not have caught either by eye.
Where AI was not the answer
- The naming. Brand decisions are still human.
- The people problem. The reason Halo exists cannot come from a model. It has to come from a life.
- Knowing when to ship. The AI will polish forever if you let it. Knowing that March 10 was good enough for real parents was a judgment call.
- Theological accuracy. AI can write a children’s prayer, but deciding whether it is doctrinally appropriate for both Catholic and Protestant families still requires human judgment.
Outcomes
- Shipped to App Store: March 10, 2026
- Shipped to Play Store: March 24, 2026
- Languages: 5 (English, Spanish, Portuguese, Russian, German)
- Content: 100+ stories, prayers, songs, devotionals, affirmations
- Monetization: Freemium (RevenueCat) — subscription + individual purchases
- Growth: Google Ad Grants ($10K/mo free spend), landing page on christianpure.com, conversion tracking pipeline
- 100-200 downloads per day
What I’d do differently
- Lock the design brief on day one, not week six. The course correction would have saved a homepage refactor if I had run the design audit before shipping the first version.
- Start in Flutter, not FlutterFlow. The visual builder saved time early, then created months of technical debt — especially around audio engineering and purchase flows. Every FlutterFlow limitation forced a more baroque workaround. The migration cost weeks that could have gone into features.
- Build the conversion infrastructure before the product. Halo was live on both app stores for months with almost no meaningful install traction because there was no funnel connecting Christian Pure’s 240K monthly visitors to the app. The Google Ads campaigns and landing page came too late.
- Talk to five parents before writing a line of code. I built from instinct and personal need. Both turned out to be right, but I got lucky.
Why this work matters
I’m one of the rare candidates who can ship a polished consumer product solo by treating an LLM as a collaborator rather than autocomplete. I built persistent design briefs, custom skills, and a multi-machine workflow that let me move at the speed of a small team — while maintaining design rigor through automated audits and critique passes.
I started from a real human moment and reverse-engineered an entire product, brand, and visual language from that single feeling. I can show the audit-and-critique trail that turned the wrong reference into the right one, and the App Store screenshot strategy that moved from feature lists to emotional storytelling.
I designed, built, and shipped a five-language consumer app across two platforms in three months, solo. The AI production pipeline — ElevenLabs for voice, Suno for music, Claude Code for engineering, Midjourney for art — is itself a case study in how a designer-builder operates when AI is the force multiplier.


