π I just shipped my first iOS app! It's called Timeline and you can find it in the iOS App Store: https://apps.apple.com/us/app/timeline-shared-group-timers/id6740108880
Thank you Mosses, Muaz Khalid, Steven Liu, Fabs, Oliver Hoffmann, Al Bilbao, Maggie McRoskey, Pooja Bhaumik, Serge Middendorf, Llorenc Sole, and others in the community for your help and encouragement along the way!
Also, here's my (very long, but wish it was shorter π ) retrospective on building my first app...
SELF-REFLECTIVE FEEDBACK
π© Great job for actually starting a project. Nothing can finish unless it starts! An endless list of ideas means nothing!
π© Great job for actually shipping. There were so many things that could have led to (a) giving up because of frustrations or tough problems or life circumstances or (b) continuing to fix and refine the app endlessly w/o ever shipping. (I'm proud of the 31 work items I cut from v1.)
π© Great job on my part for caring about privacy and security even for a small project. I could have taken shortcuts to make my sharing and invitations system easier to build. Instead, I learned new skills to secure data in Firestore via appropriate rules and cloud functions while keeping the UX simple.
π¨ Next time, I'll improve my approach to idea validation. I took the Paul Graham approach of building something for myself and my family - solving a problem we actually had. And, though I got some external validation on the problem as well, I'm doubtful this first app will have mass market appeal. TBD.
π¨ Next time, I'll probably avoid ideas that center around time management. I say this because (a) there is so much competition in this space and it's really difficult to differentiate -- see also "validation" above -- and (b) date/time math can get super complicated. Just about all of my custom functions are for date/time math, some working with DateTime objects, others working with raw milliseconds. I'm not sure that was time well spent.
π¨ Next time, I'll use what I've learned to plan out better data structures and function call patterns. I did some upfront planning, which was super helpful. (A paper notebook was my best friend for planning!) But as I got deeper, I learned how to do things in better ways, so I'll leverage that learning for the next project. (e.g. As a basic rookie mistake, I was passing strings in some calls instead of using using enums and that caused me a bunch of needless headaches. There are 10 more examples like this.)
FEEDBACK FOR FLUTTERFLOW
π© Thank you FF team for what you've built! YOU. ARE. AMAZING. Seriously. I'd tried other platforms before finding FlutterFlow (at least 3, probably more) and I never got to the point of shipping. FF has a great blend of "easy setup" (especially for Firebase!) and also "amazing flexibility" (especially as it relates to layout and custom functions). Most environments have ease or flexibility, but you've got both!
π© I found the FF University and FF Expert videos super useful at the start, not necessarily because I followed them step-by-step, but because they gave me confidence that the things I wanted to do were possible. They showed me the power of the platform and made me less worried that I'd hit a dead-end.
π© Overall, I found the Action Flow Editor and Backend Query builders to be great tools. Being able to structure everything visually - instead of looking at raw code - was really helpful in most cases. There are times where I felt like I'd mind-melded with the Editor --- I could create fairly complex things and entered a state of flow quite easily. (Let me also give a bonus set of kudos for ConditionalBuilder. That widget is pure gold.)
π© Shipping to the iOS App Store was super simple. Of course, I've never tried doing this manually, but I'm guessing it's pretty tedious? So I'm happy to have this one-click way to get things into TestFlight.
π© I love that FF is continuously improving. There are some changes (like rule inheritance for Firestore) that appeared just when I needed them. And though I had some issues with Git Merge at first, that feels like the right investment and something I'll end up leveraging more and more down the road. (That said, I write this compliment with real empathy for developers that haven't had the same smooth experience with every update. I'll certainly speak up once I hit a breaking change!)
π¨ I had a terrible time getting push notifications to work. I thought I'd have to give up on my project entirely once I'd reached two points (a) trying to get push notifications to work at all, even just from the test page in FF in the simplest case and (b) trying to get push notifications to fire on a schedule instead of just being based on user interaction. I figured out both (with great help from Support on "a") but it was tough.
π¨ I'm no longer afraid of the red screen of death when the app crashes because of a null value. With enough persistence and a methodical approach, I've always figured it out. That said, the experience is so trial-and-error driven and the red screen almost never gives me any useful clues on what I need to fix. I would sometimes spend an entire day on a single error. Not great.
π¨ Though I love the Action Flow Editor, I wish it had more built in debugging tools. In particular, sometimes a series of actions just halts - not a crash, not a red screen, it just stops - and I have zero idea why it stopped. For debugging, I wish the Action Flow Editor was visible at runtime so I could see which nodes are getting activated (generally useful for variety of debugging scenarios) and where things are halting (the most frustrating single scenario for me) so I no longer need to add manual debug dialogs.
π¨ I never figured out how to make Custom Actions or Custom Functions that interacted with Firestore. And, trust me, I tried many many times. Life with custom code was mostly good: I made a very cool custom action that handles some special foreground/background activities for me. I was so proud of that. And I have 20+ custom functions overall. But I never figured out how to interact with Firestore. This would have been useful because, again as much as I love the Action Flow Editor, there are some scenarios where it would have been much easier to have custom code working against Firestore instead of pointing and clicking in a visual interface.
π¨ My entire app is free because getting RevenueCat configured was super frustrating. I tried doing a "demo" of this in a separate project and it was so difficult that I decided not to integrate it for my main project. This is a shame because I want to explore in-app purchases for this app (optional) and for my next idea (required) and I've got a lot of trepidation about it.