I'm Geoff. I'm a solo indie developer with a day job, a side project habit I can't shake, and an honest admission that I didn't learn to code the traditional way.
I started by downloading Xcode, watching half a tutorial, and asking an AI chatbot to help me build a countdown timer. The first app was rough. The submission process was harder than the code. But it shipped, and that was enough to keep going.
Six apps later, I'm still here. I vibe-code — meaning I use AI as an engineering partner, not a magic button. I read what it writes. I debug what it breaks. I learn the framework as I go. It's not the traditional path, and I don't pretend it is.
Every app I ship follows the same rule: do one thing well, then stop. No feature creep for the sake of a roadmap. No dark patterns. No subscriptions extracting value month after month for an app that hasn't changed. If I charge, it's a one-time purchase — because that's the only model I'd personally accept.
I build fast, but fast doesn't mean broken. Moving quickly means I spend less time on boilerplate and more time on the stuff that actually matters — accessibility, VoiceOver support, localization, testing on real devices. The things that get cut first when a team is burning through a deadline are the things I prioritize because nobody's making me skip them.
"Low Effort" isn't about cutting corners. It's about cutting friction. The apps should feel effortless to use — simple enough that you forget they're there, useful enough that you notice when they're not.
I write about the process on Substack — the wins, the dead ends, the five apps still sitting half-finished in Xcode. If you're curious about what vibe-coding actually looks like when you're honest about it, that's where it lives.