IO — Ivan Labs

Building World Travel Tracker: An Android App Case Study

3 min read
Android

World Travel Tracker started from a simple, personal itch: wanting a visual record of which countries I'd actually been to, without relying on a spreadsheet or memory.

The core idea

A map-based interface where visited countries get marked directly, with the data structured well enough to export and use elsewhere — not locked into the app.

Why a map, not a list

A list of country names is functionally complete but doesn't give the same at-a-glance sense of coverage a visual map does — seeing which regions are unvisited is immediately obvious on a map in a way a text list doesn't convey. This was the actual reason to build a dedicated app instead of just using a spreadsheet or note.

Offline-first by necessity, not preference

Travel is precisely the situation where connectivity is least reliable — the app needed to work fully without a connection, since checking off a visited country in a remote area with no signal is a completely normal use case, not an edge case. This meant designing the data layer around local storage as the source of truth from the start (see our offline-first architecture guide for the general pattern this follows) rather than retrofitting it later.

Why JSON export

The data model is simple — a list of visited countries with metadata — which makes JSON a natural fit: human-readable, easy to back up manually, and easy to bring into other tools or scripts if someone wanted to do more with their own data than the app's built-in views provide. A proprietary binary format would have solved nothing the app itself needed and would have made the user's own data harder for them to access outside the app.

{
  "visitedCountries": [
    { "code": "IT", "name": "Italy", "visitedDate": "2024-06-12" },
    { "code": "DE", "name": "Germany", "visitedDate": "2023-11-03" }
  ]
}

What I'd emphasize for anyone building something similar

  • Start with the data model, not the map UI. The map is a rendering of the data — getting the underlying structure (what counts as a "visit," what metadata matters) right first makes the visual layer straightforward afterward, not the reverse.
  • Offline-first isn't optional for travel-context apps — it's close to the core requirement, not a nice-to-have.
  • Export in an open format if there's any chance users will want their data outside your app — it costs little upfront and avoids a real trust problem later.

This kind of project — a personal utility that grows into something worth polishing and sharing — is one of my favorite categories to build. See the Projects page for more like it.

Frequently asked questions

Why build a dedicated app instead of just using a spreadsheet?

A spreadsheet doesn't give you a visual map of what's been visited, doesn't work well on mobile for quick updates while traveling, and doesn't export in a structured, reusable format — a purpose-built app solves all three at once.

Why JSON export specifically, instead of a proprietary format?

JSON is human-readable, easy to back up, and easy to import into other tools or scripts later — a proprietary format would lock the data into the app with no easy way out if a user wanted their data elsewhere.

Is offline support relevant for a travel-tracking app?

Very much so — travel is exactly the scenario where connectivity is least reliable, so an app for tracking countries visited needs to work fully offline by design, not as an afterthought.

Need help with this?

Get in touch and I'll help you sort it out.

Contact me

Related articles

Share:X / TwitterLinkedIn