← Back
Next →
✕
Paused. The map is yours: pan, tilt, click a fire.
About the data
Historical record. The Canadian National Fire Database (CNFDB, Natural Resources Canada), filtered to fires reported by Saskatchewan (SRC_AGENCY = 'SK'): ignition date, size, location and cause for every recorded wildfire. Load scripts put it, and optionally an SPSA CSV export, into a local SQLite database.
Live layers. Community locations are fetched live from SPSA's public ArcGIS server (gis.saskatchewan.ca/arcgis/rest/services/SPSA/Communities). Active incidents come from an SPSA layer when one is published, then from the CWFIS national feed, and otherwise from a clearly labelled simulation.
True spread replay. Final burned-area perimeters come from NRCan's National Burned Area Composite (NBAC). Satellite hotspots (MODIS 1 km, VIIRS 375 m) come from the CWFIS archive. Each detection inside a perimeter seeds an arrival-time grid, and the glowing front is the line where that arrival time equals the moment shown. Between detections the shape is interpolated. Ember drift follows the wind recorded with each day's hotspots. Load it with npm run load:spread.
Lightning storms. Each lightning-caused fire in the record gets a bolt where it started. Ignitions within 1 day and 60 km are grouped into a storm with a drifting cell. Dates and places are recorded; the hour of each strike and the cell's shape are illustrative. Live mode loops the last 3 hours of Canadian Lightning Detection Network flash density from ECCC MSC GeoMet.
Search. Searches the loaded record by its own fields: name, report date, cause, size and location, plus what follows directly from them: size class (A ≤ 0.1 ha, B to 4, C to 40, D to 200, E above), days burning (out date minus report date; fires without an out date are left out of that filter) and distance from a community in SPSA's live layer. Plain words become filters; anything else searches fire names. The same query runs on the server at /api/search, and exports carry exactly what you see.
Terrain and sky. Elevation from public Terrarium tiles (AWS Open Data). Shading and the day/night line follow the real sun position for the date shown, in Saskatchewan time (CST, no daylight saving). The cycle clock is accelerated.
Hear the season. Each ignition plays a note: pitch from size (bigger is lower), timbre from cause (lightning is a bell, human a wooden mallet), stereo position from longitude. The crackle and rumble follow how much is burning.
Burn circles have the same area as the reported fire size; they are not perimeters. Synthetic "mock" data, when selected, is generated by scripts/generate-mock.mjs.
Emberline Presents. The narrated film (▶ Watch ) plays the guided story inside the live app. Every spoken figure is computed from the loaded data. The narration is a synthetic voice : Kokoro (af_heart), generated locally by npm run make:voice, or the browser's speech voice when no matching clips exist. The spread chapter's front is interpolated between real detections. Underneath, a quiet wood fire crackles, synthesized in the browser from noise (no recordings). It burns livelier in the big chapters, and its louder pops are the chapter's largest real fires in the order they started (bigger fires knock deeper, west on the left). The flame button mutes it.
Read the rings: every source, request and licence
Keyboard: Space play/pause · ← /→ step a week · 1 –5 modes · / search · W watch the film · M sound · S sources · Esc close