Week 1-2: Building the Foundation Before the First App
Before shipping 52 apps, I needed to build the machine that builds apps. Here's how I set up SprintKit Flutter, my starter template.
The Temptation to Just Start Coding
When I announced my plan to build 52 apps in 52 weeks, my first instinct was to immediately start coding the first app. Just pick something simple—a timer, a counter—and ship it.
But I've been down that road before. You build the first app, then the second, and by the third you're copy-pasting code between projects, fixing the same bugs, and wasting time on boilerplate.
So I decided to spend the first two weeks building the foundation: SprintKit Flutter.
What is SprintKit?
SprintKit is my starter template for Flutter apps. The idea is simple: every app I build this year will start from this template, so every hour I invest in it pays dividends 52 times over.
Here's what I needed it to include:
- RevenueCat for subscriptions and one-time purchases
- Firebase Analytics for tracking user behavior
- Theme system with dark/light mode
- Internationalization ready for 9+ languages
- Onboarding flow with paywall
- Fastlane for automated deployments
The Reality Check: 10-15 Hours
I estimated it would take a week. It took closer to 10-15 hours of focused work spread across two weeks.
The biggest time sinks:
-
Flutter SDK setup on macOS - Homebrew, CocoaPods, and Xcode versions need to play nice together. More fiddly than I expected.
-
Android toolchain - The cmdline-tools installation is not intuitive. You need to accept licenses in a specific way, and the emulator setup has its quirks.
-
RevenueCat integration - The SDK is well-documented, but testing purchases requires specific sandbox configurations on both platforms.
Architecture Decisions
Some choices I made for the template:
State Management: Provider
I went with Provider instead of Riverpod or Bloc. Why?
- It's simpler for microapps (one feature, minimal state)
- I already know it well
- Easy to migrate to Riverpod later if needed
For apps with one core feature, you don't need a complex state management solution.
Storage: Hive + SharedPreferences
- SharedPreferences for simple key-value (settings, flags)
- Hive for structured data (if an app needs local persistence)
Most microapps won't need a database. When they do, Hive is fast and simple.
Project Structure
lib/
├── core/
│ ├── theme/ # Colors, typography, dark mode
│ ├── analytics/ # Firebase wrapper
│ ├── monetization/ # RevenueCat service
│ └── i18n/ # Translations
├── features/
│ └── [feature]/ # One feature per app
└── main.dart
The idea is that when I start a new app, I only touch the features/ folder. Everything else is already configured.
Validation: Construction Calculator Pro
Before declaring SprintKit "done," I wanted to validate it with a real app.
I built Construction Calculator Pro in about 6 hours using the template. It's a simple utility for construction workers to calculate materials. Nothing fancy, but it proved the template works:
- RevenueCat paywall: working
- Firebase events: firing
- Both platforms: building
That 6-hour turnaround is exactly what I need for the 1-app-per-week rhythm.
Other Wins This Week
Beyond SprintKit, I also:
- Verified my Google Play Developer account - $25 one-time fee, identity verification took a couple of days
- Requested Garmin API access - For my triathlon app (SprintTri), coming in a few weeks
- Set up my HQ system - A folder structure for tracking progress, backlog, and weekly logs
What's Next
With SprintKit Flutter done, I have two options:
- Start shipping microapps immediately
- Build SprintKit Web (the SaaS starter template)
I'm leaning toward getting SprintKit Web done first, so I have both starters ready before production mode begins. But the itch to ship something real is strong.
Metrics After Week 2
| Metric | Value | |--------|-------| | Apps published | 0 | | MRR | $0 | | Hours invested | ~15h | | Template ready | SprintKit Flutter v0.1 |
The revenue is zero. But the foundation is solid.
Next week, the real work begins.
Follow along on Twitter/X for daily updates.