I have been an independent app developer on Apple platforms for 18 months, although I started developing my first iOS app three years ago.

My first app was a Tailscale fork based on the now-legacy Android version of Tailscale, which itself was built with [Gio]1. I thought it would be interesting to get the app approved, even though the UI felt a little unusual. Using Gio also meant that I did not have to learn too much Swift and SwiftUI at the beginning.

After the release, I performed several maintenance tasks to address issues and regularly update the Gio library. But things changed quickly. I first saw AI-assisted code completion in GitHub Copilot, and eventually I decided to move away from Gio and let an agent rewrite the app fully with SwiftUI.

Although I migrated away from Gio, I still want to thank the team behind it. The immediate-mode UI was still mind-blowing to me, and it taught me a great deal.

These days, almost every software company is trying to add AI capabilities to its products. I have been following several SSH terminal apps, and one of my apps, NovaScale2, now also supports remote Codex integration alongside its built-in Tailscale connectivity. However, I feel that AI adoption in Apple’s products is still somewhat slower than in competing ecosystems.

Here are a few examples.

I have seen AI features in Xcode, including ChatGPT and Claude integrations. However, since I do most of my app development in the terminal with prompting, and tools such as XcodeMCP are available, I barely use Xcode now. Most of the time, I open it only to install the app on a real device for testing before a release.

Apple Intelligence features in Siri are not available in my region. After watching the recent WWDC announcements, I have to admit that they did not impress me very much.

Apple does ship some excellent features that may be less visible to users. One example is on-device dictation, powered by models trained by Apple. I recently added on-device dictation to NovaScale to reduce the amount of typing required. It works very well, and it does not increase the app’s size because the model is integrated into the operating system.

These experiences made me want to write about two types of software and how I think agentic coding should be used for each type.

Foundation Software

Earlier in my career, I worked on networking stack software such as Cisco IOS. As a side note, Cisco IOS and Apple’s iOS are unrelated products; Cisco IOS predates Apple’s iOS by many years. Software of this kind must be designed and tested rigorously because it is notoriously complex and operates at a large scale.

Foundation software supports internet infrastructure, and failures can have a major impact. Later in my career, I worked on networking software for a cloud provider’s IaaS platform. Although it was different from the software I had worked on previously, I still could not imagine a NAT gateway used by tens of thousands of business customers failing or causing a major interruption.

I recently updated my iPhone to an iOS 27 beta. I had never used a beta version of iOS on my main device before. The beta contained several bugs, especially when running alongside a VPN app I had developed. It caused random freezes that required a force restart, and the problem was fixed only in a later version.

These are the kinds of software I consider foundation software. For this type of software, we should use agentic coding more carefully and perform thorough audits. Agents can help with implementation and review, but human judgment is still essential. These systems need to remain reliable over time, regardless of which tools were used to build them.

Consumer Software

Now let us consider another type of software: apps intended for consumers.

I recently finished rewriting the core networking stack of one of my VPN apps, MintFlow3. Because it runs on phones and does not yet have a large user base, I was willing to rewrite the stack with several rounds of agentic coding. The original version had been ported manually, but the new version reached feature parity through an iterative process.

My daily use suggests that it works quite well. I still review the code, but I focus primarily on the architecture, the interaction between components, and whether the app can reach users early enough to support several iterations.

I have another app that generates some revenue. I initially built it with libssh2, but I wanted a clearer core architecture. After several rounds of prompting, I replaced libssh2 with a Rust core. I am more willing to read and maintain the new code, partly because Tokio provides abstractions that are not easy to build in C.

Those software could also be called consumer software. I have to admit that these apps are somewhat disposable: users may find another app more appealing or more useful. For this type of product, the most important thing is often to build quickly, although extensive manual testing is still necessary.

Both apps are used by me every day, and I improve them based on my own judgment and user feedback. For this type of software, agentic coding helps me tremendously. I cannot imagine completing the rewrites I described above in only a few days without it.

The Future

At this moment, I do not know whether the current stage of AI represents the final norm, or what the future will bring.

But as a developer who loves tinkering and hacking, I believe this is a genuinely exciting time to be alive.

Footnotes

  1. Gio ↩

  2. NovaScale ↩

  3. MintFlow ↩