Atlas
An iPhone app that builds a travel record out of the photos already on your phone. It reads where and when each one was taken, then maps every city and country you have been to.
Atlas is an iPhone app we designed and built from scratch. Phone cameras quietly save the date and the coordinates inside every photo they take. Atlas reads that, works out which cities and countries those photos were taken in, and turns a camera roll into a map of everywhere someone has been. There is nothing to log and no account to make. If you took a photo there, Atlas knows you were there. The work all happens on the phone. There is no server behind it, so there is nowhere for anyone's photos to go.
Native iPhone app written in Swift and SwiftUI for iOS 18 and later
Photo metadata read on the device through PhotoKit, so images are never copied or uploaded
Every city and country worked out from the library itself, with no trips to create and nowhere to check in
A world map with a photograph pinned at each city and the routes of each trip drawn between them
Travel statistics covering countries out of 195, continents, cities, time zones, days away and distance travelled
A passport of stamps for continents, country and city milestones, distance, latitude and seasons
Stamps kept in the reader's own iCloud, so they follow them to a new phone without an account
Share cards rendered at 3x, sized for an Instagram or TikTok story rather than a screenshot
Limited photo access supported as a first-class state, with an in-app control to change the selection
A travel history worked out on the phone, with no server behind it
The interesting part of Atlas is what happens between opening the app and seeing a map. Every located photo is read for its date and coordinates, those coordinates are turned into place names, and the result is bucketed into visits, trips and statistics. All of it runs on the device and off the main thread, and it has to stay quick on a library of tens of thousands of photos.
Geocoding and Caching
Coordinates are quantised onto a roughly 2 km grid before they are looked up, and every answer is cached to disk. A city someone has photographed a thousand times costs a handful of lookups rather than a thousand, and the coordinates that do leave the phone are deliberately blunt.
Place Naming
Geocoders return administrative names nobody uses out loud. Atlas strips the wrappers, so Mueang Chiang Mai District reads as Chiang Mai, promotes wards and boroughs to the city they sit in, and merges suburbs within 18 km so one trip does not split into five places.
Visits and Trips
Photos fall into visits based on the gaps between them, and visits chain into trips. A holiday that touches four cities reads as one journey, with its dates, its cities in the order they were seen, and the distance covered.
Working Out Home
Home is inferred from how many separate months a place turns up across rather than how many photos it holds, so a long holiday is not mistaken for where someone lives. Trips are then named after where they went rather than the airport they left from.
Photo times are shown in the timezone they were taken in, and distance is measured along the whole chronological chain of visits, so the flight out counts rather than only the moving around once you arrive.
A travel record that builds itself out of photos people already have, without an account, a server, or anything to fill in.