How I Built a Full App Solo in 3 Weeks
How I Built a Full App Solo in 3 Weeks
January 15th. I open the RevenueCat Shipyard brief. 28 days to build something real.
February 9th. Muse Otter is live — 6 AI companiones, voice input, custom coach creator, subscription system, iPad-native design, and full localization.
Here’s how.
The Timeline
| Week | Focus | Deliverables |
|---|---|---|
| Week 1 | Foundation | Auth, data models, default coaches, basic chat |
| Week 2 | Core Features | Voice input, custom coaches, Know You context |
| Week 3 | Polish | iPad UI, Foundation feature, onboarding, paywall |
| Week 4 | Ship | Testing, docs, marketing assets, submission |
I didn’t plan it this clean. It just happened because I’ve done this before.
The Stack That Made It Possible
Every choice was about removing decisions:
Frontend: Flutter 3.24 (one codebase, 6 platforms)
State: Riverpod (code-gen, type-safe)
Backend: Firebase Cloud Functions v2 (zero ops)
Database: Firestore (real-time, offline)
AI: Genkit + Gemini 2.0 Flash
Payments: RevenueCat (handled in hours)
Voice: Vapi SDK
i18n: Slang (code-gen translations)
Why Flutter? One codebase for iOS, Android, Web, and macOS. iPad isn’t a stretched phone UI — it’s a proper three-column layout.
Why Firebase? I don’t want to manage servers. Cloud Functions scale automatically. Firestore handles offline sync. Auth handles everything from anonymous to Google Sign-In.
Why RevenueCat? StoreKit and Google Billing would have taken a week each. RevenueCat took an afternoon.
The Process
Day 1-3: Auth + Data Model
Started with the boring stuff:
- Firebase Auth (anonymous first, link account later)
- Firestore structure (users, coaches, chats, messages)
- Basic Riverpod providers
Day 4-10: Make It Work
- Chat interface with real-time updates
- AI pipeline (Genkit → Gemini → Firestore)
- 6 default coaches with distinct personalities
- Know You context system
Day 11-17: Make It Good
- Voice input with Cloud Speech-to-Text
- Custom coach wizard (4-step creation flow)
- iPad-native responsive design
- Foundation feature (personal growth tracking)
Day 18-21: Make It Ship
- RevenueCat integration
- Paywall screens (soft + hard)
- Onboarding flow with celebration animations
- Localization (EN + FR)
- Testing, bug fixes, polish
Key Decisions
1. Anonymous Auth First
No signup friction. Users can chat immediately. Account linking comes later if they want to sync across devices.
Result: Zero drop-off at onboarding.
2. Document-Status Pattern for AI
Instead of WebSockets or complex streaming:
1. User sends message → status: "pending"
2. Cloud Function triggers
3. Genkit calls Gemini
4. Response written → status: "done"
5. App updates via Firestore listener
Simple. Reliable. Debuggable.
3. Feature-First Architecture
Every feature is self-contained:
lib/features/chat/
├── data/ ← Firebase integration
├── domain/ ← Business logic
└── presentation/ ← UI + Riverpod
No cross-feature dependencies. I can work on one thing at a time.
4. iPad as First-Class Citizen
Most apps treat tablets as an afterthought. I built a three-column layout from day one:
Phone: Chat only
Tablet: Coaches | Chat | Context
It’s not harder. It just requires thinking about it early.
What I Shipped
- 6 AI Coaches with distinct methodologies
- Know You personal context system
- Foundation personal growth journal
- Custom Coaches with AI-assisted creation
- Voice Input via Cloud Speech-to-Text
- Voice Calls via Vapi (real-time AI conversations)
- Subscription System via RevenueCat
- iPad-Native responsive design
- EN + FR localization
The Real Secret
I’ve built 3 structured reflection apps before this one. BeeDone. Evolum. Strive.
Every app makes the next one faster. Not because I copy code — I don’t. But because I know what works:
- Document-status pattern for AI
- Anonymous → linked auth flow
- Feature-first architecture
- RevenueCat from day one
The first time I built a reflection app, it took 6 months. Now it takes 3 weeks.
Try It
Muse Otter is free to start. 20 messages per day, no credit card.
If you’re building something and want a sounding board at 2am, give it a shot.
That’s what I built it for.