Inspiration

Me and my friends have been playing daily "-dle" style games for years now — Wordle, GeoGuessr-style daily challenges,moviedle, all of it. It's become a genuine part of our daily routine, comparing scores in a group chat every morning. I kept thinking: this exact loop - a shared daily challenge, a bit of friendly competition is basically what Reddit communities already do naturally, just without the tooling. So I built CityFinder to bring that experience directly into a subreddit, made for Reddit instead of bolted onto it.

What it does

CityFinder is a daily geography game on a rotating 3D satellite globe. Tap where you think each of 5 cities is; score based on distance, with bonus credit for landing in the right country or continent even if you're not pixel-perfect.

A few things I added specifically because it's on Reddit:

  • Daily + Daily Riddle, two fully independent daily challenges — Riddle mode is entirely moderator-curated (they pick the cities and write the clues themselves the day before), so it only goes live once a mod actually sets it up.
  • Per-subreddit leaderboards, separate for each mode, so a community's own regulars can compete with each other, not just a global list.
  • Community Levels — anyone can build and publish their own 5-city challenge for their subreddit to play.
  • Practice mode for unlimited casual play outside the daily.

How I built it

Built on Reddit's Devvit platform: Hono server, Redis for all game state, and a Three.js globe I built by hand (no external globe library) so I could fully control the rotation feel and visuals. The city dataset, country boundaries, and continent lookup were all curated from public GeoNames map data at build time, no external geocoding API calls at runtime.

Challenges I ran into

The globe's continent fill fought me hard. My first attempt (hand-rolled rasterization) had a subtle bug that tore open a landmass band near the Arctic. My second attempt (real 3D triangulated geometry) was mathematically correct but I'd broken Three.js's own seam-vertex handling with a custom UV override, which tore the texture open along the antimeridian, right through Russia. I eventually stopped fighting the engine and used Three.js's default UV mapping untouched, which fixed both.

Rotation had its own journey: OrbitControls felt wrong for "spin a globe," a full arcball implementation added unwanted tilt on off-center drags, and I landed on a constrained yaw/pitch model, free spin left-right, clamped up-down so it can never flip past a pole.

Accomplishments that I'm proud of

Getting a genuinely smooth, intuitive 3D globe interaction running inside a Reddit webview, and building a scoring system that rewards precision without punishing a good regional guess, plus giving moderators real tools (the riddle-authoring form, community levels) instead of just a static game.

What I learned

A lot about how equirectangular textures actually map onto sphere geometry, why seam vertices get duplicated, and just how many ways there are to get 3D rotation subtly wrong before it feels right. Also learned the Devvit platform's specifics the hard way, like redis's cross-subreddit scope not being available to unpublished apps.

What's next for CityFinder

  • Image-to-search: guess the city from a photo instead of a clue.
  • Landmark-to-search: guess based on a famous landmark rather than the city itself.
  • More community-driven modes, and deeper per-subreddit stats so communities can build their own geography-game identity over time.
Share this project:

Updates

Submission history