Automate first, code later.
I am working on some new apps for iOS 18 and counterparts, and I adopted this mantra after years of failing to ship faster to the users.
The moment I create a new project, I used to focus on diving directly into coding and bringing my ideation to life. Now, I follow a system to set the stage for a smoother development process:
- Create a new project in Xcode
- Generate a temporary app icon using Bakery
- Add
ITSAppUsesNonExemptEncryption
toNO
in the Info.plist - Push an initial commit of the project on GitHub
- Set up a workflow on Xcode Cloud for TestFlight
Free CI/CD Minutes
One of the best things as an independent developer is the abundance of free CI/CD providers out there. They offer substantial free tiers that are more than sufficient for automating multiple apps across various platforms like iOS, macOS, and visionOS.
To put this into perspective, in the past two weeks alone, I have pushed over 100 builds across different platforms. This only consumed 9 hours out of the 25 hours available monthly with my Apple Developer membership.
Automation at no additional cost.
CI/CD at a later stage is harder than setting it up for a new project. And a new target that you add to your project.
My CI/CD Workflow
While I do not plan to talk about setting up a CI/CD pipeline, here is a glimpse into my workflow. With over 1.5 years of experience in this industry, I have a good idea to minimize the friction of manually uploading the apps and sending it to TestFlight users or for App Store submission.
As the apps are for iOS 18, macOS 15, and visionOS 2, the workflow is setup for sending to external testers on TestFlight only. It uses the latest beta of Xcode 16, but uses macOS Sonoma as you cannot ship a macOS 15.0+ app yet with Sequioa.
In four days, I had 25 builds. The red ones are mostly me being lazy to fix the errors for the macOS app, while iOS and visionOS worked perfectly. Last night, I sat down and fixed it, and now able push to all the three platforms at once.
A friend of mine asked me for a feature. I coded it in the morning before heading for breakfast, committed to the main
branch, and then went to fill my tummy while all the three builds shipped to the testers with the new feature!
A successful build looks beautiful.
TestFlight Notes
One thing that was missing from Xcode Cloud earlier was the option to add the notes directly as a text file. With that feature in place, it is so much nicer not to switch context and open App Store Connect only to add the notes.
Moving Forward
I gave a whole talk at Deep Dish last year about CI/CD for indies that mentioned something similar. It was sad I did not continue with independent development back then.
Embracing the "automate first, code later" has reduced a lot of friction that I faced when shipping apps, and I think you should take full advantage of the free minutes out there. Manually shipping in a mundane and repetitve task that I feel should be automated as soon as possible.
Most importantly, this approach has allowed me to maintain momentum in my projects. The satisfaction of seeing successful builds across platforms serve as a good motivation, too.
I am content with the workflow I have right now, and moving forward, I will update it for App Store review and add the relevant process to this post.
Happy shipping!