Over the last 18 months I've shipped three production mobile apps using the same base codebase — the one that eventually became TurboRocket. This is an honest retrospective on what that's actually like: what got reused, what got rewritten, and where the kit helped most.
The three apps:
- Delightminds — a mindfulness / guided-meditation app with AI voice sessions.
- Peanut & Me — a couples app with private shared timelines.
- Thinknative — an AI-powered journaling tool.
Three very different products, three different user bases, one starter kit.
What stayed the same every time
Auth, payments, push, storage. These are the four plumbing problems that every app needs and none of them are product-specific. I haven't touched the login flow in 18 months — it just works. Same for Stripe's payment sheet, same for Expo push with the FCM backend, same for Supabase storage + signed URLs.
The entire dev-tooling stack. Pre-commit hooks, build scripts (pnpm ios, pnpm android, pnpm eas:build), version-bump helpers, keystore management. These are boring and invisible and I'm glad I don't have to think about them.
The design system baseline. React Native Reusables + NativeWind + the dark/light theme scaffolding. I rebrand colors and typography per app; the underlying primitive set doesn't change.
What got ripped out every time
The sample "Tasks" feature. Every kit ships with a demo CRUD feature. Every time, I delete it completely before the first commit on a new project. The useful part was the pattern (RLS + React Query + optimistic updates), not the feature itself.
The paywall copy and pricing logic. Generic paywalls don't convert. Every app needs its own trial terms, its own pricing ladder, its own "why subscribe" copy. The kit's paywall component is a great skeleton but the content is always bespoke.
Half the navigation. Every product has a different shape of information architecture. Tabs for one app, stack-based for another, drawer for a third. The kit gives you primitives; the structure is yours.
What I'd change about the kit
Starting over, knowing what I know now:
-
I'd have AI voice integrated from day one. OpenAI Realtime over WebRTC is the best mobile UX moment I've shipped in years. I built it from scratch for Delightminds and wished I had it templated from the start. It's now in the kit.
-
I'd ship fewer "batteries" and more guides. The kit's docs folder does more for me day-to-day than any particular component. "How do I rotate Supabase keys" or "what's the App Store review gotcha for paywalls" matters more than another pre-built screen.
-
I'd version more aggressively. Apps ship on different SDK versions; the kit should too. That's what Evergreen became — a subscription for the always-fresh version of the stack as it evolves.
The meta lesson
A starter kit isn't a shortcut, it's a bias. It locks in technology decisions that would otherwise eat your first two weeks: "React Native vs Flutter," "Supabase vs Firebase," "RevenueCat vs Stripe," "Expo Router vs React Navigation." Every one of those decisions has a right answer for most apps, and every one of them takes 3-5 days of research and 1-2 weeks of hands-on trial to discover.
When I started Peanut & Me I had the stack locked in the moment I cloned the repo. The first commit was the product — not the infrastructure. That's what you're actually paying for when you buy a kit.
If this resonates, the kit is $199 one-time. If not, the docs are public and you can read everything I've written about shipping on this stack.
Read more
React Native + Supabase: The Stack We'd Pick to Ship an App in 2026
A opinionated look at why React Native with Expo and Supabase is the fastest way to a production mobile app in 2026 — and the three places it bites you.
Expo SDK Upgrades: The Gotchas Nobody Warns You About
A battle-tested field guide to Expo SDK upgrades — what breaks, what quietly changes behavior, and how to test an upgrade without shipping a broken build.
RevenueCat vs Stripe for Mobile In-App Purchases: When to Use Which
A decision framework for mobile payments: when RevenueCat's abstraction pays for itself, when Stripe's native sheet is enough, and when you need both.