Posts
The harness for my iOS app development:
- A single self-contained Rust CLI that only depends on xcrun and xcodebuild
- Returns a reliable, structured and consistent response for every sub-command it runs
- Responses are optimized so LLMs can efficiently know success/failure, get hints on problem resolution and have links to logs and more detail if something went wrong
- Manages a pool of cached simulators and manages locking/contention between them so I can have multiple agent sessions that still performantly run UI and unit tests
- Allows IDB-like interaction with UIs so agents can tap through the UI tree (which is full accessibility ID instrumented)
Before this harness the LLM would spin for a long time while trying to click a bloody button and keep having to rediscover how to do this. Not helped by simulators getting stuck from time to time.
Now the LLM has a semantic tree of UI controls with IDs, taps on them with ease, and in case of a problem like a stuck simulator, simple nukes and re-creates it quickly with this tool.
This is my fourth go at this app.
Chronologically (1.5 years elapsed, working on it on weekends only, it's not my job):
-
SwiftUI v1: failed, due to my poor understanding of SwiftUI, lost the will to keep hacking to get native Apple-like UX
-
SwiftUI + SwiftData v2: failed, could not get performance and UX how i wanted.
-
SwiftUI + CloudKit + Core Data + Swift Data v3: a terrible idea, do not have two persistence layers trying to co-operate.
-
UIKit + CloudKit + CoreData v4: shipped on Apple Store within 4 months of first rewrite commit
(* with some assistance from LLMs since I am not a UIKit expert)
NOTE: it would have been longer than 4 months had I not failed awfully a few times :)