Building an App as a Solo Dev: My Crazy Journey
If you're a solo developer thinking about building an app, and you can't decide what tools to use, you should probably read this. I built an app, then I rebuilt it, and then I rebuilt it again. I've rebuilt my apps so many times that I think I can finally give you a real recommendation.
First, you should know where I'm coming from.
* I'm a web developer, been programming since I was 15 (I'm 41 now).
* I work full-time as a full-stack dev, building things in C#, Rust, and TypeScript.
* My go-to on the front-end is Qwik, but I've used all the popular stuff like React, Vue, and Angular.
So when it was time to make my own simple app, I had an idea.
Attempt #1: The Web Wrapper Trap
My first thought was, why not just use what I know? I'll build a web app with the Qwik framework and wrap it in Capacitor. So that's what I did. I built the app, set up Google auth, and did all the things I thought I needed.
But when I deployed it, it didn't really work.
* The client-side routing in Qwik just isn't made for that kind of setup. It's built for server rendering, and it's not the same without it.
* I also found a bigger problem with wrapping a web app: you have to build so many things that are free in a native development environment.
* Things like "pull to refresh" or native-style menus are just there out-of-the-box in native. On the web, they get a little wonky.
I appreciate the work people put into these wrapper tools, but I don't think that's where I'll be placing my bets.
Attempt #2: Flutter vs. React Native
So, I moved on. I was deciding between Flutter and React Native.
At first, I thought React Native was the obvious choice since it uses native components on each platform. Flutter does its own custom rendering, which felt like a negative.
But then I thought about it again. I'm a solo developer. I have to test everything myself.
* With Flutter, it's like drawing on a canvas. What I build and test once will look and work the same everywhere.
* With React Native, I'd still have to check how the native components render and behave on both iOS and Android.
For a solo dev, testing one thing is much, much nicer. So I went with Flutter.
Attempt #3: The "Full Native" Detour
Everything was going great with Flutter. Then, I hit a problem with AdMob. It made me feel like I was one layer of abstraction too far away from the problem.
So, I decided to screw it. I'll go full native. I used my favorite editor, Zed, and built:
* An iOS application in Swift.
* An Android application in Kotlin.
The Kotlin one was the most urgent because that's where my users were. The development was actually pretty good. But as I built them, the two projects started to diverge.
* Testing was a huge pain. It's easy for me to test on iOS because I use an iPhone. But making sure everything worked perfectly on Android took way too much time.
* Even with AI speeding up the coding, the time I spent on testing and fixing regressions was much higher.
I realized this wasn't sustainable. The thing that triggered me to leave Flutter in the first place, besides the AdMob issue, was Apple's "liquid glass" presentation. But I don't even need that.
Back to Flutter for Good
I scrapped the native projects and went back to Flutter. And I'm very happy here.
The whole "liquid glass" thing doesn't worry me. Flutter renders with its Impeller engine using Metal on iOS. It's performant. If people want fancy liquid glass effects in Flutter, some smart people will probably figure it out. My design just needs to be good enough.
Here's why I'm sticking with Flutter:
* The Tooling is Amazing: As a web developer, the tooling feels familiar. I can see network requests, logs, a profiler, and even highlight elements on the screen while developing. It's great.
* It Feels Fun: This is a passion project. I want it to be stress-free and fun. Flutter feels fun, nice, and relaxed. The Kotlin Gradle stuff does not.
* No "Package Folder Monster": I can't stand the package folder structure that Kotlin inherited from Java, where you have a folder for every part of the package name. I know Android Studio has ways to hide it, but I know it's there.
* Performance is Solid: Flutter compiles to native code. I saw a video claiming it can even perform better than native Android apps, maybe because it doesn't use Java bytecode. I don't know, but it's fast.
* Future Possibilities: You can make simple games with Flutter using the Flame Engine. Now that I have kids, I want to make games for them.
I use the Zed editor, and I do wish it had a debugger for Flutter. But for now, debugPrint
is my friend, and I have the DevTools when I need them.
So that's my journey. For a solo dev who wants to build for both platforms without losing their mind, Flutter is the way to go.
And just so you know, for my backend, I'm sticking with Rust. I probably wouldn't use Dart for the server.