Reza Golkhandani // Senior Software Engineer | Backend platforms
A Walking Map That Never Phones Home: Local-First Done Properly
Local-first | Mobile | Product
A Walking Map That Never Phones Home: Local-First Done Properly
The goal
The idea was a fog-of-war map of your own city. Everything starts hidden, streets appear only where you have physically walked, and they stay revealed forever. A lifetime record of everywhere a person has walked is the most sensitive dataset a phone can produce, so the goal was to build it under my studio's rule: no server, no account, nothing leaves the device, and still sync between a person's own devices.
The approach
Design the data so that sync needs no server, package the map as a file the user owns, and make the privacy promise something the app can state plainly on its store page.
What I built
Conflict-free sync. A revealed map is a set of cells. The union of the sets on two devices is correct by definition, so devices merge through the user's own cloud container with nothing to resolve. Pins use last-write-wins.
Maps as files. Openly licensed map data packaged into per-city files served from a static bucket. Download once, offline forever, attribution on the map and in settings.
The studio skeleton. One SQLite file that doubles as the backup unit, a schema that upgrades itself on open, one controller as the only mutation path, and compile-time feature flags so anything unfinished ships switched off and tree-shaken out of the build.
The honest label. Location is used on the device during a session the user starts and ends. The store's privacy label says nothing is collected, and the review notes explain exactly why the background-location mode exists.
The result
The app has no login screen, no password reset, and no analytics, and each of those is a sentence on the product page rather than an apology. The same skeleton has since carried a meal-planning app, a music-practice companion, and a receipt tracker to the store, each in a few weeks, each with the same sentence on its label.
Takeaways
- If a feature seems to need a server, look at the data model first. Sets merge for free.
- Write the boundaries down. A privacy promise is only worth what it forbids you from building.
- A reusable skeleton turns a philosophy into a two-week ship cycle.