In my pursuit of becoming an independent app creator/solopreneur/one-man show, I’ve come a long way.
In my previous article (there’s only one—you’ll find it), I shared the process of developing an app solo and how hard it can be.
Looking back, I see what a colossal success this app was—not because of the number of paying users (there were none, and there aren’t even any free users right now 😊)—but because the journey of creating this app painfully taught me that having programming skills is not enough, and to be honest, it’s not even that important.
Don’t get me wrong, it’s super useful that I know how to code, how to host my own apps on some cheap VPS, etc., but you can create an app using mostly low/no-code tools for the frontend and backend. Let’s say only 5–10% of the process really requires coding.
Given the type of person I am, I struggled to find a way—or philosophy, rather, or maybe framework (?)—for app creation. This changed when I stumbled upon Pieter Levels (https://x.com/levelsio/). To me, his philosophy is very much like punk rock: easy, fast, and nonconformist. He uses PHP and SQLite—no fancy next-gen frameworks, patterns, or architectures. One of his apps wasn’t even an app; he just had a payment system with a form where users submitted photos, and he manually trained AI to create photos in the style they wanted. Only when it became too hard to do it manually did he automate the process.
So How Does This Fit Into the Title?
When I try to figure out how to write an application, I always try to divide it into steps and areas like frontend, backend, logic, hosting, etc. Given the lessons I’ve learned, I know that I shouldn’t go overboard with fancy technology or features. First of all, make an MVP.
So my approach was to take each smallest element I had and make it shitty—just barely working. Instead of frontend, backend, logic, hosting, I would have a shitty frontend, shitty backend, shitty logic, and shitty hosting. After that, when this compost pile is done—but it’s working—I can start to polish it. So, adding styling to the frontend, adding authentication to the backend, etc.
IT IS MUCH HARDER THAN YOU MIGHT THINK—at least for me. The typical approach is that the first thing you do is shitty, and you improve it. That’s not true. The first thing you do is a semi-ambitious vision of forced potential problems that you try to resolve before they exist, using semi-proper architecture and thinking about future scaling potential. You don’t start at “shitty”; you start at “ambitious and not finished.” Then you either start cutting to increase momentum, or you start running around in circles trying to implement or fix something that is not necessary for the basic MVP to work. You either spend too much time on it or give up.
You would think that knowing this would be enough to avoid the trap. But being able to make a shitty app is a skill, and it’s not an easy one to acquire. The number of ideas that lay in my graveyard of unfinished ambitions is staggering. Each time I’m writing something, I catch myself falling into the while(true) loop of adding or fixing something that isn’t needed for the SVP (shittiest viable product).
I’m not saying the app needs to be shitty, but when you have the SVP done, you can then take each part of it, polish it, and make it less shitty—or not, if there’s no traction. Then you just move on to the next project. Also, I have a strong feeling that sometimes the first version of any module is more than good enough.
What Is the Conclusion Here?
I think a lot of potential is wasted on the compulsive need to make something “good.” The creation of an app is quite a big endeavor—or perhaps we have a tendency to make it unnecessarily complicated because we don’t want to make something that’s not “good enough.”
But you know what’s truly not good enough? An app that doesn’t work because it’s not finished.
Done is better than perfect – And with that, I wish you—and myself—the strength to make something shitty.
Please keep in mind that the problems and ideas presented in this article are mine. I often write You/We/They, but this is more a conversation with myself than a certainty that these problems apply to anyone else but me. You might struggle with something entirely different. What I’d like you to take from all of this is to know that: You are good enough and You have what it takes — You just have to try and:
Fail early, fail often, but always fail forward.