Over the past few days ICIDO went through three passes aimed at a single question: what does the app tell someone who is not looking at the screen? At the start, the answer was less than it appeared.
Guidance that stops without saying so
During navigation ICIDO draws a lattice on the floor and arrows along the route. When ARKit's tracking degrades, those overlays vanish and a banner is drawn in their place. That is a complete account of the situation for anyone watching the screen, and no account at all for anyone who is not — and it is the second group who are still walking on the last direction they were given, which may now be stale.
Losing tracking, and recovering it, is now announced aloud for everyone rather than only under VoiceOver. The reasoning was that this is not an interface nicety; it is whether the guidance can be trusted. The same argument applied to a second silent state. Walking past the edge of the mapped area ends the guidance and offers to scan the new area — a question aimed entirely at someone looking at the screen. It is announced too.
One state was deliberately left VoiceOver-only. When the app is searching for you and the wait gets long, a "Still looking" line and a Restart button appear. A sighted user already has that answer on screen, and nothing about it is safety-critical.
The announcements are debounced: after 1.5 seconds, once, latched, and silent while the user is talking to ICIDO. Tracking flickers, and an app that says "finding you again" every few seconds is one you switch off.
A fourth state was surveyed and needed nothing. A change of storey was already spoken, set alongside its banner. Checking before writing saved a duplicate announcement.
"Button. Button. Button."
The navigation HUD's controls were built by a helper that drew an icon and nothing else. With no accessibility label, all three announced themselves as "button". Labels and hints were added, along with names for seven close buttons — and the label parameter was made required, so the next control added to that HUD cannot ship mute.
The measurement taken before the work started: 22 accessibility labels against 91 icons, four hints, one value. That was a first slice, not a finish.
Large text broke the first screen
This one was found by looking rather than by reading code. With the system text size set to its largest accessibility setting, the Home screen — the first thing anyone meets — showed "New S…", "Import…" and "Find…". The primary navigation was unreadable at exactly the setting people choose when reading small print is hard.
The first attempt made it worse. Scaling the icon turned a 40-point box into roughly 90, the words got the leftovers, and "Places" broke mid-word as "Place / s". A row is the wrong shape at those sizes whatever you do to its parts. The cards now switch to a stack — icon above, words across the full width — which is what iOS itself does.
Two smaller lessons came out of the same pass. SwiftUI truncates text rather than growing the row unless it is told not to, and that is what cut a warning off mid-sentence. And the "ICIDO" wordmark is now capped in size and hidden from VoiceOver, because it is the app's name rather than information. Nothing a reader actually needs is capped.
Two doors on the first screen
First launch used to assume why you had opened the app. On a scanning iPhone it went straight into a guided tour that coaches you through mapping a room. That is right for someone setting a place up. It is wrong for someone who has just been sent a place and needs to open it — the import they want was a card further down the screen. And an iPhone without the LiDAR sensor was shown a tutorial about scanning, the one thing it can never do, when it can open a place someone shares perfectly well.
First run now asks which door you came in by: scan a place, open a place someone sent, or just look around. On a device that cannot scan, the first option is replaced with "See how it works", and the copy says why. Three plain buttons rather than six swipe-through pages — a page carousel is poor going with VoiceOver and leaves you no closer to having a place. Each choice is one accessibility element with a hint, so it reads as a title, then a detail, then what it will do.
The same grouping rule turned up in History, which gained a Seen tab. The camera memory is opt-in, and until now the only way to reach its contents was to ask it a question; you could not simply read what had been kept. Seen lists every observation, grouped by day, newest first, with place and time, and single entries can be removed rather than only clearing everything. Each row is one accessibility element read as a sentence, instead of three fragments announced in turn.
What did not change
None of this changes what leaves the device, which is nothing. ICIDO has no accounts and no sign-in, no analytics, and makes no network connections. Scanned maps, tagged spots and settings stay on the iPhone.
Settings did get shorter — 517 words of prose down to 261, with the longest single block cut from 141 words to 43. One thing was kept in full: the explanation that the camera memory is a record of the inside of your home, that it is never uploaded, and that Clear erases it. Brevity does not apply to telling someone what is being recorded about them.
Scanning needs the LiDAR sensor, which means an iPhone 12 Pro or a later Pro model; other iPhones can browse the library and open places. These builds are in TestFlight. ICIDO is coming to the App Store.