Inspiration

Inspiration

When people smell smoke, they can't tell whether it's a real fire near them or smoke drifting from a fire more than 100 km away. So they either call 911 to find out, or risk ignoring a real fire.

This happened here in August 2025. Smoke from wildfires in Nova Scotia and other parts of New Brunswick drifted over Fredericton and led to widespread 911 calls. On the morning of August 25, fire departments in Moncton, Dieppe and Riverview received about 300 calls, and dispatchers had to screen each one with questions. Moncton's deputy fire chief pointed out that 911 lines can get jammed with calls about smoke they already know about, while someone with a real emergency waits. The smoke came from the Long Lake fire in Nova Scotia, about 159 km away.

Firefighters face a real dilemma: they need people to report new fires, but not hundreds of calls about a fire they're already fighting. Today the only advice is to judge the smoke by eye. At 7 a.m., worried, most people can't.

Why I chose this problem: I live in Fredericton and work with air-quality data in my co-op, so I've seen how scattered the information is. Active fires, satellite detections, wind, smoke and air-quality advice all live on different sites. Nobody combines them to answer the one question people actually have: is the smoke I smell from a known fire?

What it does

Smoke or Fire? / Fumée ou feu ? answers that question in about 60 seconds, in English or French.

Scenario 1: smoke from far away (Moncton, Aug 25, 2025)

  • One question: Do you see flames or a smoke column? No → where are you → answer.
  • Drifting smoke, likely from the Long Lake fire, 159 km away. The map traces the air reaching you backward through real wind, and the fire's smoke forward. They meet.
  • An honest High / Medium / Low confidence. For Moncton it says low, because the air at three heights passed 19, 32 and 46 km from the fire.
  • Official air-quality advice (Environment and Climate Change Canada), Health Canada's advice to take a break in places with filtered air (one tap finds the nearest library), and the 811 nurse line.
  • 911 is one tap away on every screen. The app never tells anyone not to call.

Scenario 2: fire near you (Bridgetown, N.S.)

  • Yes (flames or a smoke column) → Call 911 now, with what to tell the dispatcher.
  • Told to leave? The app shows the reception centre Annapolis County actually opened during the Long Lake evacuation (NSCC Middleton), register first, directions in your phone's Maps app, the officials' own grab list, and a one-tap text to family with your location. It only shows this to people near that fire; someone in Moncton is told it doesn't apply to them.

Built for seniors: large text and buttons, tested down to iPhone SE size, a Listen button that reads each screen aloud and guides the person, and nothing to install: open a link, or add it to the home screen in two taps.

How we built it

  • Engine (Python, FastAPI, on Render): back-trajectories from the user in hourly steps (Heun integration) through a 693-point wind grid at three heights (100 m, 925 hPa, 850 hPa), the same trajectory method NOAA's HYSPLIT uses. Forward trajectories from the fire act as an independent check. Verdict and confidence rules were fixed before testing.
  • Data fusion: NASA FIRMS satellite detections (VIIRS and MODIS) plus Natural Resources Canada fires and hotspots, de-duplicated by position, time, satellite and fire intensity. ECCC air quality (AQHI), Open-Meteo wind (GFS), NRCan place names, Natural Earth outlines.
  • Web app (React, TypeScript, Vite, d3-geo, on Vercel): our own maps, full English/French, and a replay of the real Aug 25, 2025 event bundled so the demo works even offline.
  • Snowflake data room: we loaded the whole 2025 Maritimes fire season (4,563 NASA detections). SQL re-checked our engine's de-duplication (the same 148 merges, same pairs), H3 geospatial analysis ranked persistent industrial heat sources, and a Streamlit app inside Snowflake shows the Long Lake timeline: 93 satellite passes, 1,718 detections. The live app doesn't call Snowflake; it's where we validate the data behind it.

Challenges we ran into

  • The default wind model was about 19° off at Moncton, so we switched to GFS and cross-checked it against ECMWF.
  • Nova Scotia was missing from the 2025 national active-fire list, so we rebuilt the Long Lake fire from satellite detections.
  • One agency republishes another's satellite detections with a report time, not the observation time, so a 10-hour-old sighting looked 5 hours old. We trace every detection back to the moment the satellite actually saw it.
  • A single height missed the fire by 44 km, so we trace three heights, and when they disagree the app says low confidence.
  • A fire downwind of the user was counted as the source. We fixed it so a fire counts only if the air actually passed it.
  • Validation caught a real flaw: satellites see the Saint John refinery's heat. Snowflake found it on 71 days between June and September. It's documented, and filtering it with NASA's own labels is our next fix.

Accomplishments that we're proud of

  • Two independent physics checks agree on the real event: the air reaching Moncton passed 19 km from the fire, and the fire's smoke passed 2 km from Moncton.
  • Six satellites (US and European) saw the Long Lake fire in the 24 hours before the smoke calls.
  • Tested on five real 2025 smoke events plus two control days, with the rules committed before running (see VALIDATION.md). When the app misses, it falls back to "look outside, call 911 if you see flames." It fails toward caution.
  • 88 engine, 108 web unit and 208 browser tests, all passing (TECH-FACTS.md).

What we learned

Building a trajectory engine from scratch on public data; a production mobile interface (frontend is my weak side); map projection; NASA satellite products; the difference between a report time and an observation time; Snowflake SQL and H3; French typography and accessibility; deploying a full stack alone; and writing emergency guidance that never overpromises.

What's next

  • Filter industrial heat sources using NASA's labels.
  • Pilot with a municipality or EMO, and connect to official live evacuation announcements.
  • An embeddable version for city and fire department websites during fire season.
  • Pre-recorded, natural voices for Listen, and voice questions once they understand every accent. ## What it does

How we built it

Challenges we ran into

Accomplishments that we're proud of

What we learned

What's next for Smoke or Fire? / Fumée ou feu ?

Built With

Share this project:

Updates

Submission history