Developing on iOS is underrated: CloudKit and more
I had long stayed away from developing iOS apps, probably thanks to some long-forgotten Objective-C-related trauma. But I’ve recently built four (Congruence, Lightwork’s onsite inspection app, linen&, and CribCam; I’ll post about the latter two soon) and discovered some utilities that make the developer experience delightful.
The first is the combination of native Apple accounts and CloudKit.
The these two allow for serverless app building — all I need to code is the frontend, and I get authentication, cross-device syncing, sharing, and storage for free. Apple handles everything and doesn’t charge a penny.
There are a bunch of upsides here — the biggest being a lack of maintenance burden (the client code just keeps chugging along on user devices) and zero cost. Plus strong privacy and security.
To interact with CloudKit, I use the third-party sqlite-data package. It lets me use sqlite as the local database (which I prefer) and handles the CloudKit sync simply and intuitively. But you can also use SwiftData instead.
I can’t overstate how nice this is. I only worry about writing client code, and users are automatically “signed in” via Apple account access (no auth flows!), their data is synced across all their devices using the same account, sharing is easy to enable, and data is stored off-device at no cost and with no ongoing maintenance.
For a small personal app, this is perfect. Less overhead is the dream — less to build and less to maintain and less to keep track of. And I suspect it’s great even for scaled apps too.
This biases me towards building native apps for iOS and MacOS over web apps for most personal use cases, which is something I wouldn’t have believed a couple years ago. I distribute via TestFlight, updates land automatically, and the experience is smoother throughout.
CloudKit & Apple accounts are the big ones, but there are a bunch of other gems in the Apple ecosystem. For the Lightwork inspection app, I use RoomPlan, which is an astonishingly good (and again… free) framework to 3D model a room. But that’s pretty niche.
More broadly applicably, the new SpeechAnalyzer and Foundation Models frameworks are outstanding.
SpeechAnalyzer can do many things, but I use it for fast, on-device speech-to-text. Instead of calling Whisper or another remote model (and paying, needing a server, dealing with API keys, etc.), I just call SpeechAnalyzer on device and it turns the user’s speech into text.
And the Foundation Models are solid, very fast, (mostly) on-device LLMs. They can do structured outputs and tool calls. Of course some use cases require frontier or near-frontier intelligence. But many don’t, and if I can avoid the headache of dealing with the cost, maintenance, authentication, and such of that, I will.
When you combine all of these — Apple account automatic auth, CloudKit for data storage and sync, SpeechAnalyzer and Foundation Models for intelligence… you can build a lot without ever creating server code and the associated maintenance burden.
And, lest I repeat myself… all of this is free and easy to use.
I suspect I will be reaching for Xcode more often in the future as a result.
A final tip: Apple’s developer docs are inaccessible to LLMs. Sosumi.ai is a Markdown mirror of the Apple docs that you can point your agents at. The paths are all the same — just replace developer.apple.com with sosumi.ai and it’ll work.
But beyond Apple’s own docs, if you’re using any third-party packages (like sqlite-data), Swift Package Index is the equivalent documentation site. They recently were acquired by Apple. And just like Apple’s own docs, they are inaccessible to LLMs.
So I forked sosumi.ai, added support for SPI, and published it here. If you want your agents to have access to docs for all of Apple’s frameworks and third-party packages:
git clone https://github.com/abromberg/sosumi.ai
cd sosumi.ai
npm install
npm run dev
The easiest way to hook it up is as an MCP server — it exposes tools for searching Apple docs and fetching Apple, HIG, and Swift Package Index documentation. In Claude Code:
claude mcp add --transport http sosumi http://localhost:8787/mcp
(For other MCP-capable agents, point them at http://localhost:8787/mcp.)
Alternatively, you can tell your clanker:
Anytime you’re looking up Apple or third-party Swift package docs, find their documentation URL (e.g. https://developer.apple.com/documentation/foundationmodels or https://swiftpackageindex.com/pointfreeco/sqlite-data/main/documentation/sqlitedata) and replace https://developer.apple.com or https://swiftpackageindex.com with http://localhost:8787
Happy building.
Looking for more to read?
Want to hear about new essays? Subscribe to my roughly-monthly newsletter recapping my recent writing and things I'm enjoying:
And I'd love to hear from you directly: andy@andybromberg.com