---
id: 01K1C4SOFTWARE20260801
title: Two Types of Software
description: Why Apple’s slower adoption of AI may be a good thing
publishedAt: 2026-08-01
updatedAt: 2026-08-01
tags:
  - agentic coding
  - LLM
  - software development
draft: false
---

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, NovaScale[^2], 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,
MintFlow[^3]. 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.

[^1]: [Gio](https://gioui.org/)

[^2]: [NovaScale](https://apps.apple.com/us/app/novascale-built-for-tailscale/id6749938291)

[^3]: [MintFlow](https://apps.apple.com/us/app/mintflow-netstack/id6742394218)
