← Back to StrollCraft

Method

How it works

The short version: we ask OpenStreetMap what's nearby, score each sight by how interesting it is, and greedily pick a loop that fits your time budget.

The budget

You give us minutes. We pair that with your chosen pace — leisurely (4 km/h), normal (5 km/h), or brisk (6 km/h) — to get a target distance. 30 minutes at normal pace is a 2.5 km loop. 60 minutes brisk is 6 km.

If you turn on calorie estimates in Settings, they use published MET values for walking: calories = MET × weight × time. Default weight is 75 kg; adjustable alongside the toggle.

The sights

We query OpenStreetMap (via the Overpass API) for everything tagged as sightseeing around your location — monuments, museums, viewpoints, artworks, castles, peaks, waterfalls, parks, fountains, lighthouses, and so on. Cafés, bakeries, and shops are out of scope by design; StrollCraft is for seeing, not for errands.

Each sight gets an interestingness score. Things that tick more boxes score higher:

  • Has a Wikipedia article? +5.
  • Has a Wikidata entry? +3.
  • Has a photograph? +2.
  • Is a historic castle or archaeological site? +5.
  • Is a viewpoint, peak, or waterfall? +5.
  • Is an artwork? +3.
  • Is a park, garden, or nature reserve? +5.
  • Is a spring, rock arch, or geyser? +3.
  • Is a fountain? +2.
  • Has a proper name? +1 (and no name = dropped entirely).

A bronze statue of a local poet with a Wikipedia article and a photo scores higher than a generic park bench marked as "public art." Sights scoring below 3 are filtered out.

The loop

From the top 25 scored sights near you, we walk a simple algorithm:

  • Start at your location. The remaining budget is your target distance.
  • From every unvisited sight, find the nearest few that fit the budget. Pick one at random, weighted toward the closest — so nearby sights are favoured but not guaranteed.
  • Repeat until no sight fits.
  • If you asked for a round-trip, close the loop back to your start.

Scores get a small random nudge (±2 points) each time you generate, so similarly-scored sights trade places across runs. Together with the weighted selection, this means tapping Again produces a genuinely different walk — not just a minor re-order.

It's not the "optimal" route in any mathematical sense — that's the travelling salesman problem and it's hard to solve. But for a walk, weighted-nearest-neighbor is fast, runs in under 50 ms in a Worker, and produces routes that feel right.

One-way walks

Toggle One-way walk to a landmark and the algorithm changes strategy. Instead of building a loop, it picks a high-scoring destination landmark a comfortable walking distance away — roughly 30-70% of your budget — and charts a path toward it.

Intermediate sights are selected from a corridor between your starting point and the destination, so the route feels like a purposeful journey rather than a zigzag. The result card tells you where you'll end up, and Google Maps takes it from there.

The handoff

StrollCraft doesn't do turn-by-turn navigation. Instead, once you've got a loop you like, tap Full route in Google Maps — we hand up to 9 waypoints to Google Maps in walking mode, which knows the streets better than we do and will guide you properly.

The map you see in StrollCraft is a preview. It draws straight lines between sights, not the actual walking paths. The external navigator fills that in.

What's under the hood

If you're curious about the stack: the site is Astro on Cloudflare Pages, with the algorithm running in small Cloudflare Workers. The map is MapLibre GL with Protomaps vector tiles, self-hosted. Overpass queries are cached for 24 hours so the same neighborhood doesn't keep poking the OpenStreetMap servers.