Inspiration

My phone holds years of travel photos, and almost every one of them knows exactly where it was taken. Yet there was no good way to see my life on a map: the apps that try want an account, a cloud upload or manual check-ins. I grew up on strategy games where the world starts dark and you uncover it by exploring. What if your camera roll could do that for your real life, without a single photo ever leaving your phone?

What it does

Fogged covers the world map in fog and clears it using the GPS tags already in your photos. On the first run your photos fly onto the map one by one and burn through the fog where they were taken — that's the magic moment. From there it works by itself:

  • Trips — it detects your home (even several homes over the years) and groups your photos into trips with automatic titles.
  • Stats — exploration percentage, countries, cities, continents, days on the road.
  • Timeline — a travel résumé of every trip, with stops and photos.
  • Share cards — around 30 templates in Story, Square and Portrait formats.

Everything is processed on-device. No account, no server, and only location metadata is read — never your pixels.

How we built it

  • Native iOS: SwiftUI, SwiftData, PhotoKit for the library, MapKit for the base map.
  • The fog is a custom Metal shader drawing soft-edged reveal circles over the map, with a gyroscope-driven shimmer that makes it feel like frosted glass.
  • Offline geocoding from bundled, compactly encoded open data — country borders (Natural Earth), cities (GeoNames), airports (OurAirports) — using point-in-polygon for countries and nearest-neighbour lookup for cities. No network calls.
  • Background pipeline built on Swift actors: scan → home detection → trip detection → reveal computation, so the UI stays smooth.
  • Built solo, with Claude Code as a pair programmer — including multi-agent workflows for translation and review.
  • App Store screenshots are captured by UI tests in every language and composed by a Node pipeline; releases ship to TestFlight through the App Store Connect CLI.

Challenges we ran into

  • Fog performance — thousands of reveal circles have to redraw smoothly on every pan and zoom. That meant culling, merging nearby photos into larger zones, and careful shader work.
  • Geocoding with no server — fitting the whole world's borders and cities into the app bundle, and getting disputed borders right.
  • Messy photo libraries — years-long gaps, moving house, huge bursts of shots. Turning that into trips that feel right took a lot of tuning.
  • Keeping up with the library — handling new photos, deleted photos and limited photo access without rescanning everything.
  • Localization beyond translation — Slavic plural rules (1 / 2–4 / 5+), numbers agreeing with their words, city names in each language, and a Cyrillic fallback font because our brand font has no Cyrillic.

Accomplishments that we're proud of

  • A genuinely serverless app — the privacy promise is the architecture, not a policy page.
  • The first-run reveal animation, which makes people say "wow" out loud.
  • A share-card system with around 30 designs, rendered from your real data in three formats.
  • Launching in six languages — English, Russian, Ukrainian, German, Spanish and Polish — with localized store listings and screenshots.
  • A fully automated pipeline from screenshots to TestFlight, run by one developer.

What we learned

  • Privacy by architecture makes everything simpler: no accounts, no backend, no data to leak.
  • Real-world data is messy — the "it just works" feeling comes from handling the edge cases.
  • Good localization is grammar, typography and place names, not just translated strings.
  • For a solo developer, automating the boring parts (screenshots, builds, releases) pays for itself fast.

What's next for Fogged

  • Launch 1.0 on the App Store and learn from real users.
  • Trip editing: split, merge and move stops.
  • A custom-styled world map under the fog.
  • An Explorer Level system and a yearly "Wrapped"-style recap.
  • More languages — and Android, if iOS proves itself.

Built With

Share this project:

Updates

Submission history