Manitoba Métis Federation • In progress 2026
Homeland Map
A low-poly model of the Red River Métis Homeland for a museum display, from the Pacific to Hudson Bay. Scrub the years and 194 places rise out of the ground when they were founded, with cart brigades rolling between them. It started as a sepia relief map of Canada and went through three versions to get here. Three.js in TypeScript.
- Role
- Sole developer
- Timeline
- Started 2026. Third version, ready for the floor after review
- Team
- Solo
- Stack
- Three.js, TypeScript, Vite, d3-geo, Express, Docker
Context
The Manitoba Métis Federation wanted a map for a museum display that people can walk up to and touch. It covers the Red River Métis homeland, so the settlements, wintering camps, forts, and battle sites across what's now Manitoba, Saskatchewan, and Alberta, and how they connected to each other.
It has been through three versions this year. It started as a sepia relief map of Canada with 14 places typed in by hand. Then it took on the 194 places of Bayard de Vries' Red River Métis Homeland Map, after Barkwell's 2018 list. That's where the chart stopped working, so the third version is a low-poly model of the whole Homeland with a timeline, and that's the one going to the floor. All three are Three.js in TypeScript.
Problem
A kiosk is a different thing from a website.
- No keyboard, no mouse, no instructions. Everything has to work with one or two fingers and be obvious the first time.
- It runs unattended all day. If it freezes, nobody is there to reload it.
- It has to look like an artifact and not a web page. Museum lighting, a big screen, and people standing a metre away.
Then the atlas showed up and added three more.
- 194 dots on a continent is a chart, not a story. Half of them folded into cluster pins at the home view, and the biggest pin hid 27 places.
- The dates were the interesting part, and the chart had nowhere to put them.
- The founding dates are text like "Late 1800s" or "Ancient; 1804 (Post)". A timeline can't guess at those.
Approach
- Three.js
- TypeScript
- d3-geo
- Vite
- Express
- Docker
The chart. Canada's outline comes from Natural Earth, projected with d3-geo and extruded into a slab. Elevation comes from GMTED2010 tiles, and a post-processing pass adds the sepia and a vignette so it reads like an old map. Tap a place and the camera flies to it and starts a slow orbit while its connections draw in as great-circle arcs labelled with the distance in km.


The atlas. Version two put the 194 places on the same chart, with the plate widened to Canada and the US, the original site's 8 category filters along the bottom, and a label culler so the name tags stop piling up. It worked, and it looked like a chart.


The model. The Homeland is one low-poly island, from the Pacific to Hudson Bay. Heights come from the same GMTED2010 tiles, and the lakes and rivers from Natural Earth. I lift the heights with asinh instead of a flat multiplier, so the prairie shows without the Rockies swamping it. The rest of North America sits under the island as a muted plate, so it isn't floating on its own.

The places. Each place stands on a round dais with a low-poly model for its kind, so a parish gets a church and a fort gets a palisade. Places a few km apart fold into one dais with a count. Tap it and the camera drops in until they stand apart, and once zooming can't part them, each tap shows the next one.

The timeline. One year drives everything on the ground. A script turns each founding string into a year range and never invents a year, so the 48 places with nothing dateable stay standing all the time with a grey rim. Six chapters run from Frog Plain in 1816 to the displacements of the 20th century, condensed from sourced descriptions. Play runs at about 3 years a second and holds on each chapter for 5 seconds. Step moves a decade or to the next chapter start, and the camera flies to a chapter's places when one begins. The controller has no Three.js in it, so it and the date parser run under node --test.

The carts. Cart brigades roll from 1824, when the chapter sources say they began, and keep rolling as the exhibit's idle life. Bison graze until 1883, when the herds were gone. The cart follows the written accounts, so all wood and rawhide, twelve-spoke dished wheels five to six feet across, and one ox or pony between the shafts in a collar and never a yoke. Its wheel and harness are each built in one function, so a change from the MMF's reviewers lands in one place.

Touch. One finger pans, two fingers rotate, and pinch zooms toward your fingers. A two-finger rotate always has a bit of accidental pinch in it, so zoom waits behind a small dead zone until your fingers really spread or squeeze. Flights lock input until they land, so a drag mid-flight can't yank the camera off its path.
Running it. The exhibit is static files. One Docker image builds them and serves them from a small Express host, with no database, no volumes, and no environment variables. On the kiosk it runs under a process manager that brings it back after a crash or a reboot.
Decisions
- A model instead of a chart, since 194 dots on a continent was a chart and not a story.
- One year drives the whole scene, and the date parser never invents a year. Undated places stay standing with a grey rim instead of disappearing.
- Heights are lifted with asinh instead of a flat multiplier, so the prairie relief shows without the Rockies swamping it.
- The rest of the continent sits under the island as a muted plate at under half the relief, so it gives the Homeland its place without competing with it.
- The SQLite admin from version one is gone. The places come from a published dataset, so a rebuild script replaces the database and the kiosk serves static files.
- The cart's wheel and harness are each built in one function, so a reviewer's correction can't drift between the dais model and the rolling one.
Outcome
The model does the whole loop today on mouse and touch. Areas, places, clusters, the timeline, chapters, and carts. What's left before it goes on the floor is the MMF's review of the chapter text and the models, three places whose atlas coordinates don't match their own descriptions, and the install itself.