As a result of moving out of Zurich, new challenges have arisen when it comes to organising snowboarding days with my friends. Namely: we need to agree on where to go.

To solve this issue, I took a brief break from making Wanderli to build a webapp that lets you enter in the home locations of all your buddies, and get an easily-shareable list of the top ski slopes ordered by minimum time, fairness or a combination of the two.

It’s available here: SkiCompromise.

By far the hardest part was getting, cleaning and processing the data. I found an open dataset of ski fields which was a good start. However the lat/long values were completely wrong, and I needed the location of the closest public transport stop to the field so I could pre-build the routing graph.

My first attempt was to use an LLM with Web Search capabilities to look for public transit information on each website. This gave a good-ish first yield, but many websites don’t show it (or present it in a way that’s too hard for an LLM to grok). So, I built a little web app to help me manually process each of them:

This turned out to be a great idea. It had a few nifty little features:

  • Fully runs in the frontend, so I could upload the dataset then download the edited version without needing any backend tools
  • Autocomplete with fuzzy matching on the search bar with the data coming from the official swiss public transport dataset (23,000 public transport stops!)
  • Approximate location on Google Maps, so I could quickly zoom around and find the most relevant PT stop

The “most relevant” stop was actually a tricky problem. Sometimes the available data wasn’t enough - larger ski resorts have multiple stops, or I couldn’t find it on SBB, so I had to dig deeper. Thankfully the website Skimap.org has a pretty comprehensive collection of recent ski maps that can help. For example, take the most recent ski map for Hoch-ybrig:

You can see that there are two ways to get up to the ski resort. The Weglosen Talstation is the main one (and is slightly easier to get to with the bus), so I went with that as the PT stop. Rinse and repeat for nearly 350 other resorts :)

As you can see, this was quite an involved process. However, I had another trick up my sleeve… paying my little sister to do the rest for me. Modern problems don’t always require modern solutions.