AI-First iOS Development From Scratch


Hey 👋

Last week I did something I never thought I’d do: I built a feature in an iOS app.

Some context: I’m a web developer. Backend preference. I’ve never touched Swift, never opened Xcode with intent, and definitely never worked on the Clay codebase (our internal iOS app at Automattic).

But I had an experiment in mind: how far can AI take me in completely foreign territory?

To make it interesting, I did this alongside Ryan — a colleague who’s an experienced iOS developer. Same feature, same timeframe. He used his expertise. I used… Claude.

The Feature

Contact Photo Matching. The idea is:

All on-device using Apple’s Vision framework and Core ML. I had never written a line of Swift.

Act 1: Surprisingly Fast Start

Day 1, morning. I started by creating a PRD with Claude — phases, scope, architecture decisions. Within a few hours I had a working prototype: photo grid, face detection, basic UI.

I remember thinking: “This is going to be easy!”

I was wrong.

Act 2: The Wall

Day 1, afternoon. Face matching results were… random. Same image would give different confidence scores every run. 0.85, then 0.91, then 0.78. For the exact same face.

I went in circles with Claude for hours:

Me: “Results are inconsistent” Claude: “Let me add more logging…” Claude: “The values look correct” Me: “But they change every time!” Claude: “That’s strange. Maybe it’s a Vision Framework bug on the simulator?” Me: “That can’t be right…”

Claude kept insisting. I kept dismissing. We tried a dozen other fixes. Nothing worked.

Act 3: Fresh Start

Day 2. Fresh conversation, fresh mind.

This time I tried a different approach: “Build me a debug view.”

I asked Claude to create a visualization showing:

And suddenly I could see the problem. Landmark values were drifting on every detection run:

Run 1: leftEye.x = 0.3421
Run 2: leftEye.x = 0.3398
Run 3: leftEye.x = 0.3445
Run 4: leftEye.x = 0.3367

Same image. Same face. Different landmarks.

Ryan happened to be nearby. “Want to test on my device?”

Seconds later: values consistent. The simulator was the problem.

Claude was right. It’s a known Vision Framework bug on the simulator (since 2021!). VNDetectFaceLandmarksRequest with CPU-only mode returns inconsistent landmarks. Only on simulator. Works fine on real hardware.

I had wasted hours dismissing something the AI correctly identified early on.

Looking back

Would I have learned Swift, Xcode, the Vision framework, AND built this feature in two days on my own? No way. I still needed Ryan’s help for the simulator thing, and his code is probably much cleaner than mine. But I got something working. In two days. With zero iOS experience.

A few things that stuck with me:

Claude suggested the simulator bug early on and I kept dismissing it because it felt wrong. I should have just tested it on a real device right away instead of going in circles for hours. When the AI insists on something, at least rule it out properly.

Day 1 ended with frustration and a polluted conversation context. Day 2’s fresh start brought immediate progress. I think both humans and AI benefit from “sleeping on it.” Context pollution is real.

And one fun side effect of running multiple Claude sessions in parallel: while waiting for agents to finish their tasks, I had enough free time to build a Bomberman clone in a separate session. Because why not.