Inspiration

Three or four years ago, two of my interests collided. I had always wanted to really know the world (its flags, capitals and where every country actually is) but never had the time to sit down and study it. At the same time I was getting into programming, and I realized the best way to learn both was to build the thing I wanted to use.

There was a third reason too. I study and do research in physics. I love science, but it rarely pays well, so in my free time I wanted to build mobile apps that I genuinely enjoy, that other people find useful, and that could one day bring in some extra income.

The name came later: Geolympia, the Olympics of geography. That's why the mascot is a globe wearing a laurel crown. The idea is that knowing the world can feel like a sport: you train, you keep streaks, you compete, and you get better every day.

What it does

Geolympia is a geography game for everyone, with 20+ game modes built around one goal: getting to know the whole world.

  • Streak modes: flags, countries on the map and capitals, in Normal, Hard and Extreme. In Hard mode you type the answer on an in-game keyboard instead of picking it.
  • Expedition: a story mode where you chase a gang of thieves across three continents, picking your route stop by stop, answering customs questions at every border and collecting clues and passport stamps.
  • Fill the World: name every country you can against the clock and watch the map light up, continent by continent.
  • Real or Fake?: swipe a deck of flags and spot the subtle counterfeits.
  • Daily challenges that reset every day (The Scale, National Day, GeoRadar, Population Duel, Pixel Flag and more), plus a daily streak, Weekly Bingo, missions, XP levels and achievements.
  • Learn mode: short guided lessons that teach each country's flag, location and capital, review sessions built from your own mistakes, and an Atlas that tracks which countries you've mastered.
  • Real-time competition: 1v1 duels, multi-player Survival and monthly rankings.

Everything is free to play. Geolympia Plus (with a 7-day free trial) adds unlimited lessons and reviews, Plus stats, the offline Atlas and no ads. There's also a one-time Remove Ads purchase and coin packs.

The app is available in 7 languages: English, Spanish, Portuguese, French, German, Italian and Indonesian.

How I built it

When I started, I knew nothing about Kotlin, so I spent hours on YouTube tutorials and developer forums learning the fundamentals of Android development. That first prototype was never published: it sat untouched on my computer for about two years.

This year I picked it back up with Claude Code as a coding partner. I drove the architecture, the game ideas, the design and the logic, and used the tool to write and refactor code much faster than I could alone, instead of spending another few months on tutorials.

The stack

  • App: Kotlin and Jetpack Compose, with a custom design system (Baloo 2 typeface, one gradient color per mode, a custom in-game keyboard) and art made specifically for the game.
  • Backend: Firebase Auth (guest and Google sign-in, with progress tied to the account), Realtime Database, and Cloud Functions for everything that must not be trusted to the client: the coin economy, leaderboards, duel rooms and achievements.
  • Monetization: the RevenueCat SDK handles the Plus subscription, one-time purchases and consumable coin packs through two entitlements (no_ads, plus) and two offerings. The paywall is a RevenueCat Paywalls V2 design served from the dashboard, so I can iterate on it without shipping a build. A RevenueCat webhook keeps the backend in sync, and server functions check the plus entitlement against the RevenueCat API before granting Plus rewards. Ads are the other half of the model, because most players of a casual game never pay. I wanted them to earn money at a steady pace without wearing players out. Rewarded ads are always opt-in and give something useful back: a second chance on a streak, a revive in Expedition, an extra lesson or free coins. Interstitials appear at most once every 3 finished games, only on end screens or natural breaks, never in the middle of a question and never right after another ad, and the pacing can be tuned remotely without an update. All ads are loaded through RevenueCat's ad tracker, so ad revenue and purchase revenue live in the same dashboard. Players who'd rather not see ads at all can remove them with a one-time purchase or with Plus.
  • Maps: I wrote my own Python pipeline that turns public-domain Natural Earth data into a clean SVG map for every country, with its neighbors drawn for context.

A little bit of physics inside the game

The country maps use an equirectangular projection with an aspect correction at the map's mean latitude \(\bar{\varphi}\), where \(\varphi\) is latitude and \(\lambda\) is longitude:

$$x = R \lambda \cos\bar{\varphi}, \qquad y = R \varphi$$

The borders are then simplified with the Ramer–Douglas–Peucker algorithm, using a tolerance \(\varepsilon\) tied to the size of one screen pixel. That keeps every map at 2–20 KB while the borders still look real.

GeoRadar gives you the distance and direction from your guess to the hidden country. The distance is the great-circle distance (haversine formula), with \(R = 6371\) km:

$$d = 2R \arcsin\sqrt{\sin^2\left(\frac{\Delta\varphi}{2}\right) + \cos\varphi_1 \cos\varphi_2 \sin^2\left(\frac{\Delta\lambda}{2}\right)}$$

The arrow comes from the true initial bearing,

$$\theta = \text{atan2}\left(\sin\Delta\lambda \cos\varphi_2 ,\ \cos\varphi_1 \sin\varphi_2 - \sin\varphi_1 \cos\varphi_2 \cos\Delta\lambda\right)$$

split into 8 sectors of \(45^\circ\). My first version compared latitudes and longitudes with a fixed threshold, and it pointed the wrong way for distant countries. Spherical geometry fixed it.

Challenges I ran into

  • Time. This was the hardest part by far. When I started I was finishing my physics degree, which is why the project paused for two years. Bringing it back meant balancing my master's coursework and research with months of focused development.
  • AI is a partner, not autopilot. Working with Claude Code still took a lot of manual debugging, architectural planning and patience. I had to know what I wanted, review everything and catch the cases where the "obvious" fix was wrong.
  • Real-world production bugs. A few examples:
    • Initializing the purchase SDK on the main thread caused a real startup freeze (ANR) on cold launch, so I moved it to a background thread.
    • Turning on code shrinking (R8) silently broke data classes that travel through Firebase until I added the right keep rules.
    • Google Play wouldn't even let me create in-app products until the first production release was approved, which blocked the whole RevenueCat setup for days.
  • Maps for every country, not just the big ones. Tiny island nations disappeared at world scale, and borders far from the equator got over-simplified because a degree of longitude shrinks with latitude. I fixed it with higher-resolution sources for small countries, special framing for remote islands, and a latitude-aware tolerance.
  • Fair content. I wanted every country and region to get the same care, not only the famous ones, so I kept revisiting the content to keep it balanced.
  • Monetization that doesn't ruin the game. I set some rules: ads never appear in the middle of a question, rewarded ads are always the player's choice, interstitials appear at most once every 3 games, and nothing competitive can be bought. A broken streak can only be saved by watching an ad, never with coins, so streaks still mean something.
  • A new name mid-way. Two other apps were already called "GeoTrivia" on Google Play, so the app became Geolympia, with a new package name, before its first public release.

Accomplishments that I'm proud of

I'm proud of taking an unpublished prototype that had been sitting on my computer for years and turning it into a real, finished app, released on Google Play for the first time during Shipaton 2026: 20+ modes, a full story mode, my own map pipeline, a complete monetization stack and 7 languages, built by one person alongside a master's degree.

Discovering the RevenueCat Shipaton gave me exactly the push I needed to take the project seriously, add monetization and ship Geolympia to the world.

What I learned

  • Android, end to end: Kotlin, Jetpack Compose, the app lifecycle, game and quiz logic, release builds, and the whole publishing process on Google Play.
  • Monetization design: implementing subscriptions, one-time purchases, consumables and ads with RevenueCat, and learning that where and when the paywall appears matters as much as the price.
  • Server authority: anything that has value (coins, scores, Plus rewards) has to be validated on the server, never trusted to the phone.
  • Directing AI tools: how to use AI coding tools to build a production app as a solo creator, while staying the one who decides what gets built and why.
  • Users are the best roadmap: shipping early, watching what people actually play, and iterating beats designing in isolation.

What's next for Geolympia

  • Geolympia on iOS: bringing the game to iPhone and publishing it on the App Store, with the same account, progress and Plus subscription across both platforms (RevenueCat already handles the cross-platform entitlements).
  • Country-by-country lessons in Learn mode, with richer content for each country.
  • New game modes and question types, plus more daily challenges.
  • Polishing the interface and performance based on real player feedback.
  • Testing paywall and pricing experiments with RevenueCat.

I want to keep maintaining Geolympia so more people can enjoy learning geography, and turn it into a sustainable project.

Built With

Share this project:

Updates

Submission history