Allen Padilla

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.

Press Play and the years run from 1680. Places rise out of the ground the year they were founded, and the camera flies to each chapter as it starts. The first 190 years, up to Red River in 1869, recorded from the app at four times the real speed.

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.

3D relief map of Canada in sepia with labelled Red River Métis places across the prairies
Version one. Canada extruded and shaded from real elevation data, toned sepia, with the 14 hand-entered places labelled.
Batoche selected on the map, with lines to five connected places labelled by distance and an info panel
Batoche selected. Five connections drawn as great-circle arcs with distances, and the write-up on the right.

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.

Sepia relief map of Canada and the US with 194 Métis places, most folded into numbered cluster pins
Version two, the home view. Most of the 194 places are folded into cluster pins, and the one over the Red River holds 27.
Upper Fort Garry selected on the sepia chart, with its write-up and sources in a side panel
Upper Fort Garry on the chart. The write-up and sources come from the atlas.

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.

Low-poly island model of the Métis Homeland from the Rockies to Hudson Bay, with place daises and cluster counts, area buttons on the left and a timeline bar along the bottom
Version three, the home view. The Homeland as one island, with the rest of the continent muted underneath. Area buttons on the left, the timeline along the bottom.

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.

Fort Rouge selected at the Forks, with its card open, a green ring on its dais and carts crossing the river
Fort Rouge at the Forks, founded 1738. The card has the kind of place, its date, the write-up, and its sources. Tapping a place sends a few carts out from it.

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 timeline at 1816 with the Victory at Frog Plain chapter open and the Red River settlements standing on the model
1816, the Victory at Frog Plain. 99 of 194 places are standing, 51 of them founded by then and 48 undated.

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.

Lac Ste. Anne and Edmonton House on the model, with a cart brigade rolling down a trail
Lac Ste. Anne and Edmonton House, with a brigade on the trail south.

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.