About SG Haze Watch

SG Haze Watch is a free, open science project. It forecasts the PM2.5 and the PSI in Singapore for the next 7 days, so that friends, families and schools can plan ahead. It also shows how the forecast works, step by step.

This is not an official forecast. For the official readings, the official haze outlook and health advice, use haze.gov.sg from the National Environment Agency (NEA). If you feel unwell in the haze, see a doctor.

📲 Get the app

🔬 The model in 5 lines

  1. The air over Singapore is one box. The box goes from the ground up to the mixing height (the lid).
  2. Each hour, the box gets PM2.5 from Singapore's own emissions and from the air that the wind brings in. The wind, rain and settling take PM2.5 out.
  3. The air that comes in carries a background (about 8 µg/m³), ship exhaust, fresh smoke from fires under its path in the last 4 days, and older smoke that hangs over the region.
  4. Smoke fades with time (240 hours), rain on the path washes it out, and dry peat makes more smoke from each fire.
  5. The model has 12 constants, found from NEA hourly data from April 2014 to 2025. Each forecast starts from the NEA reading at 11 pm, and corrects with the model's recent errors.

Read the full lesson →

🎯 How good is the forecast?

Test 1: hidden years

We found the 12 constants without one year. Then we forecast each day of that year at 11 pm the night before, with the weather and fires as they really were. We compare with the simple guess "tomorrow is the same as today".

23 of 31unhealthy days caught in 2015, the big haze year, with 2 false warnings in the year. "Same as today": 21 caught, 10 false.
0.87R² of the next-day forecast in 2015 (0.78 in 2019, 0.73 in 2023). "Same as today": 0.75, 0.62 and 0.60.

Unhealthy day: day-mean PM2.5 above 55.5 µg/m³ (about PSI 100). R²: the part of the day-to-day change (of log PM2.5) that the forecast explains; 1 is perfect.

Test 2: this haze season, as a real forecast

The nightly job was run again for each day of this season, with only the data that was known at that time: the ECMWF weather forecast (not the real weather), and fires only up to the day before. This is the same test as a real forecast.

Loading…

Error: the forecast is too high (+) or too low (−), as a mean over the days. Typical miss: the mean difference from the measured day-mean PM2.5. In range: the measured value was inside the forecast range (the range is set to hold 8 of 10 days). Caught: days with PSI above 100 that had the flag. False: clear days (PSI 100 or less) that had the flag by mistake.

How we correct the forecast

The physics model is not perfect. When it was too low yesterday, it is often too low tomorrow too. So each forecast uses two corrections, both found from past data:

  • Recent error: the mean error of the model in the last 28 days. In the 2026 test the model alone was about one third too low, so this term raised the forecast.
  • Error memory: part of yesterday's extra error stays: 46% for the next day, and less (37% to 16%) for the days after.

The chance of PSI above 100 comes from 400 runs with errors of the same size as in the tests. The error is larger on haze days and for days far ahead, so the range is wider there.

⚠️ Warnings

  • Haze warning ⚠️: the chance of PSI above 100 is 50% or more.
  • Haze watch 👀: the chance is 15% or more. We chose the line that catches 9 of 10 days with PSI above 100 in the 2026 test.
  • PSI here is the highest 24-hour PSI of the day, as the mean of the five NEA regions. One region can be higher.

🧱 Limits

  • One box: one value for all of Singapore.
  • When the haze arrives after a clear day, the warning often comes late.
  • Nobody knows next week's fires. The outlook guesses that the fires stay as in the last 3 days.
  • The mixing height is the average for the month and the hour, not a forecast.
  • The hourly shape is less sure than the day mean.
  • If a data source is late or down, the forecast can be old. The page then shows a notice.

📚 Data and credits

DataSourceUse
PM2.5 and PSI readingsNational Environment Agency, via data.gov.sg (Singapore Open Data Licence)start of each forecast, error correction, tests
FiresNASA FIRMS / LANCE, VIIRS 375 m active fires (Suomi NPP, NOAA-20, NOAA-21), through NASA GIBSfire power under the air path
Weather forecastECMWF open data, IFS (CC BY 4.0)wind at 3 heights, rain
Rain on peatCHIRPS v2.0 (Climate Hazards Center, UC Santa Barbara)peat dryness
Mixing height, soil type, landERA5 (Copernicus Climate Change Service), via NSF NCARheight of the lid, peatland, land and sea
EmissionsEDGAR v8.1, European Commission JRC (CC BY 4.0)ship exhaust, emission maps
BordersNatural Earth (public domain)names of places
MapLeaflet, Esri base map tilesmaps

Contains modified Copernicus Climate Change Service information. Neither the European Commission nor ECMWF is responsible for any use of this information.

🔒 Privacy

This site has no cookies, no tracking and no ads. Your browser remembers only two things: your light or dark mode choice, and if you close the "Get the app" card, the date when you closed it. To work with no network, the app keeps a copy of these pages and of the last forecast on your device. The "Right now" box asks data.gov.sg for the latest NEA readings directly from your browser.

The code is open: github.com/kychanbp/sg-haze-watch. You can report a problem there.