All apps

Explore every ski area in Canada in 3D with unmap

How the unmap Ski Area Explorer is put together: every Canadian ski area from OpenStreetMap on the winter style in 3D, with search, a province filter, area facts, lift cables in 3D and shareable links.

The Ski Area Explorer puts every ski area in Canada on the winter style over 3D terrain. Search by name, filter by province or territory and by downhill or nordic, and pick an area: the camera flies to it and tilts onto its terrain, and the panel shows its vertical, top and base, runs, lifts, which way its runs face and the drive time from the nearest city. Turn on 3D lifts and the area's lift cables are drawn on the terrain at their real heights. It runs at apps.unmap.dev/winter, and its source is a standalone Next.js project you can clone and run with your own key.

The data is from OpenStreetMap, served by the Ski add-on under the Open Database Licence, and the panel credits it wherever it is on screen. It is terrain information only, not avalanche or safety advice: there is no live lift, run or grooming status. Check the area's own conditions and the avalanche forecast before you go.

What it does

  • All of Canada in 3D: the winter style on 3D terrain, with the ski overlay of runs and lifts.
  • Search and filter: by name (accents and case ignored), by province or territory, and by downhill or nordic.
  • Area page: vertical, top and base, run count and downhill and nordic kilometres, lift count, an eight-direction aspect readout, the drive time from the nearest city of 100,000 or more, and the area's websites.
  • 3D lifts: the header's switch draws the picked area's lift cables with deck.gl, in the map's own WebGL context, at heights baked from the same terrain release the map draws. deck.gl is downloaded only when you turn it on.
  • Share: the link holds the area and the switch, such as ?area=sunshine-village&lifts=3d, and ?lang=fr for French.

What it costs in API calls

Loading the app calls /ski/areas once, and each filter change calls it again (the search waits for a pause in typing). Picking an area makes no call: the list already holds it. With 3D lifts on, each area you pick calls /ski/areas/{id}/lifts-3d once. The map's own style, tile and terrain requests are counted like any map's.

The key it needs

A browser key with the Ski add-on. Without it the app still draws the winter map in 3D, and the panel says why the ski areas are missing and links the pricing. On the dev plan the add-on works from localhost and preview origins.

Built from the registry, unmodified

The whole page is the ski-resort-explorer block, with the map item under it, copied in unmodified; the app adds the header, the 3D lifts switch and the link. Installing the same block into your project is one command:

npx @unmap/cli add ski-resort-explorer

What it does not do

  • Live status: lifts, runs and grooming are as mapped, not as they are today.
  • Safety: no avalanche danger, ATES rating or route advice of any kind.
  • 3D lift models: the lifts are drawn as cables, without pylons or chairs.
  • Outside Canada: only Canadian ski areas are in the data.

Run it yourself

You need Git, Node.js 24, pnpm and a browser key with the Ski add-on from the dashboard that allows http://localhost:3209.

git clone --depth 1 https://github.com/unmap-dev/winter.git
cd winter
pnpm install --frozen-lockfile
cp .env.example .env.local

Set NEXT_PUBLIC_UNMAP_KEY in .env.local to your key, run pnpm dev, and open localhost:3209. The Ski areas reference covers the API, the overlay and the 3D lift files, and the Maps API reference covers the basemaps and terrain.