I build a mobile app for the first time recently. What's the app? An audio journal: You create entries by speaking, the app transcribes your entries, that's pretty much it. The rest is just CRUD data management. For example, each recording you make creates a "thread". You can add new journal entries to that thread, or create new threads. This allows you to continue a train of thought, or start a new one. None of this is complicated stuff. My sense going in was that if I was going to build this for the web it would take a 1-2 days[^1]. However, from a UX perspective this project _has to be a mobile app_, for two reasons: 1. Voice notes are most appealing on mobile, since it's always available and you don't have a keyboard (i.e. text entry is slow without voice). 2. You want to be able to take long, meandering audio memos. This requires _background recording_ while the phone is locked. The main point is number 2, because as far as I know it's not possible to continue recording when the screen turns off on iOS without being a mobile app. So, with that in mind, how could I build this thing fast enough to be done before I lose interest[^2]? # A stack to build quickly Before starting this project I already knew what the tech stack would be: - React Native - Why? Because, I assumed[^3], AI would be good at writing RN code. AI is great at writing React for the web, so it's probably good at writing RN too. - Escape hatch when AI fails. Since I myself wrote hundreds of thousands of lines using React/TypeScript before the advent of AI, I knew I would be able to make modifications as needed if AI failed me. If I chose Swift I would be entirely in the hands of AI[^4]. - InstantDB (aka Firebase with relations) - Why? I did NOT want to have to write a backend if I could avoid it, but I needed to do some simple data modeling. Thus a platform as a service was the natural fit. Instant is like "firebase but better" in my mind after having used it for building a side project for my mom recently (see: [[This is better than AI]]). - The thinking is that I don't want AI writing my auth layer or database layer, I just want it using abstractions on top of a solid foundation. # Outcome The project took **4 days** to get to a state where I can use it myself. I feel great about this outcome. That's roughly twice as long as I thought a web version would take, but it's still quick in absolute terms and: - Two of those days were weekend days, which means more time with the kid than weekdays (less time for side projects). - I went in with zero knowledge of React Native. ### The App Store... The inescapable caveat of native apps is that distribution is terrible. Your ability to distribute is entirely at the whims of Apple (or Google) and they don't make the process painless. I tried setting up TestFlight this morning, but didn't get very far before I had to do some more pressing work. The process is non-obvious and the app fails to build in Xcode, despite working great when run via Expo. Where to go from here? I definitely want to get the app deployed to TestFlight and then later to the live app store, so: - Spike another 30m to get the build to complete and get it on TestFlight - Try Expos "eas" build platform to see if they can build it - If all that fails... wait until the next advancement in AI so that the AI can do it for me. - Not joking, unfortunately. I have no desire to spend time fighting the poor UX and bureaucracy imposed by Apple. - Alternatively, I expect Upwork has people who will handle this, so perhaps I could hire someone. I'm a bit loth to increase the cost basis of this app though, since it's an unknown player in a bad market by my estimation[^5]. [^1]: This estimate was based on using a backend as a service, thus eliminating a huge swath of dev time by outsourcing it to a platform. [^2]: Yes, this is a common problem with side projects. I get started, and am very excited about it for a day or two, but as rough edges continue to crop up without reaching completion interest wanes and the project ultimately falls into obscurity. [^3]: A correct assumption, it turns out. [^4]: Well, unless I decided to learn Swift. But I have no desire to learn that particular language, and more to the point: this project is about moving fast. Learning a new language would take time. [^5]: Broadly speaking I would consider this a "note taking app" or a "journaling app", both of which are _very_ crowded spaces on iOS and online. Furthermore, I don't yet have a strong differentiator. Yes the app is slightly different than others in the space, but I don't yet have a compelling argument for why any random person online would care.