The largest machinery in the app served its smallest feature
Until this week ICIDO shipped with an optional 370 MB vision model, fetched on demand, so that camera questions — "what do you see?" — could be answered on an iPhone that cannot use Apple Intelligence. It has been removed (68bd780).
Three reasons, stacked. The bundled model answered noticeably worse than the model built into the operating system. It held roughly 400 MB resident for as long as the camera was up. And it was, by a wide margin, the largest machinery in the app serving the smallest feature in it.
Taking it out removed six model files, the runner and the store that managed them, the inference runtime package, the on-demand-resource tag, the fetch script, and an Info.plist build phase that existed for no reason except that framework (68bd780). The app now embeds no frameworks at all. The code that asks the camera a question went from 227 lines to 116 and no longer has two paths to keep in agreement.
That last part is the durable gain. Two backends for one feature is two behaviours, two failure modes, and two sets of wording to keep honest — for the smallest feature in the app.
What still works without it
The deployment target did not move. It stays at iOS 16 (68bd780), and scanning still needs the LiDAR sensor — iPhone 12 Pro and later Pro models (README.md, Requirements).
Everything except one feature works on every iPhone the app supports: scanning, relocalizing against a saved place, routing, tagging spots, and reading signs aloud. Reading uses Vision's text recogniser rather than any language model, which is exactly why it was untouched by this (68bd780). Only "what do you see?" needs Apple Intelligence.
This is worth stating precisely, because "the model was removed" invites the assumption that something people rely on got quieter. Finding yourself in a building, and being routed across it, were never a model's job — they work on an iPhone where no vision model is available at all (68bd780), out of the saved map and an A* route with obstacle clearance (README.md).
Say it once, rather than offer a download
The part of this that took the most care was wording.
Both voice hosts used to answer, when asked to describe the scene without the model present, that the vision model was not downloaded yet and could be fetched in Settings. That was true while a download existed. After the removal it would have been an instruction to do something impossible (68bd780). Settings had a matching row — "Download vision model (~370 MB)" — and that is gone too.
What replaces it depends on the device. Where the operating system can do this, Settings shows a switch and the line "Built into iOS — nothing to download". Where it cannot, Settings says why, once, and follows it with what is still true: "Everything else works: scanning, finding yourself, routes, tagging, and reading your map aloud" (68bd780).
A dead row that looks broken, or a large download offered for a poor result, are both worse than a plain sentence.
The seam that made the swap cheap
None of this was expensive, and the reason is a decision made earlier.
When the operating system's model was first added as an alternative, every call site in the app stayed unchanged, because access to camera vision had already been narrowed to four operations — is it ready, look, prewarm, release (1e1e046). That turned out to be the right seam. Adding a second backend behind it changed nothing above it, and removing the first one later was mostly deletion.
A build that now refuses to lie about itself
The system-model path is gated at compile time by #if canImport(USDKit), a framework new in iOS 27, because the file still has to compile against the older SDK (1e1e046).
Compile-time gates fail quietly. Builds 224 through 228 were all archived with a toolchain whose SDK made that check false, so the camera vision was compiled out of five consecutive TestFlight builds. Nothing failed: the app was valid, the archive succeeded, the upload succeeded, and only a warning buried in thousands of lines of build output said otherwise. It was confirmed afterwards from the shipped binary, which reported SDK 26.5 (77bf363).
The ship script now reads the toolchain's iOS SDK and exits if it is older than 27, naming the command to use. An override exists, deliberately and visibly. Both directions were verified: the old toolchain is refused, the new one passes, and the rebuilt binary reports SDK 27.0 (77bf363).
That guard landed days before the model was removed, and it matters more now than it did then. With a bundled fallback in the app, building against the wrong SDK cost a worse answer. Without one, it costs the whole feature — silently, in a build that looks fine.
Where this runs
Camera frames are processed on the device in real time and are not recorded or stored, and scanned maps, tagged spots and settings are stored locally on the iPhone (privacy policy, 29 August 2026).
Removing 370 MB of machinery did not change any of that. It removed a second way of doing one small thing, badly.
The work described here is in TestFlight builds. ICIDO is coming to the App Store, and scanning requires the LiDAR sensor — iPhone 12 Pro and later Pro models.