# Firms — harmonized MODIS/VIIRS fire calendar One fire record from 2001 to now: NASA MODIS and VIIRS active-fire detections harmonized into a single monthly calendar of Aqua-equivalent fire-days. Site: https://firms.apps.feeef.dev/ · Guide: https://firms.apps.feeef.dev/guide · Source: https://github.com/feeefapp/firms (MIT) · Data: NASA FIRMS ## The problem MODIS (Terra since 2000, Aqua since 2002, ~1 km pixels) and VIIRS (S-NPP since 2012, NOAA-20, NOAA-21, 375 m pixels) both detect active fires, but VIIRS reports 2–4 times as many. Joining the two records creates a false increase in 2012 (163–355% monthly error). Terra and Aqua also drift from 2022 (Aqua now passes near 15:15 instead of 13:30), so MODIS alone is no longer self-consistent. ## The method 1. Clean: drop low-confidence detections (MODIS < 30, VIIRS `low`) and every 2 km cell that ever held a static heat source (FIRMS type 1–3). 2. Count fairly: fire-days = 0.02° (~2 km) cells with at least one detection on a local solar day. 3. Reference chain: Terra converted until June 2002, Aqua July 2002–2021, VIIRS converted to Aqua-equivalent from 2022. 4. Convert: the average of (a) VIIRS × the Aqua/VIIRS ratio for that calendar month and (b) a seasonal isotonic curve of P(Aqua sees the cell | VIIRS FRP), summed over cells, plus a monthly correction. 5. Adaptive weights: 2012–2021 calibration with each year's weight halving every two years back. ## Results - Direct join: 163–355% monthly error. One fixed multiplier: ~18.6%. Monthly ratio alone: ~12%. Adaptive ensemble: ~10.0% (forward test). - Floor: two identical VIIRS satellites predicting each other miss by ~7% (2.9–12.6% by region), so ~3 points remain above it. - Ideas that did not help: fire energy instead of counts, cloud correction, GOES diurnal correction, dual-VIIRS reference; gradient boosting gained ~0.3 points (inside the noise). - In regions where fire size swings from year to year (northern Algeria), the FRP curve alone is best (~12.8% forward). ## Limits - Few-fire regions are noisy (Lebanon ~43% monthly); use seasonal or yearly totals there. - The calendar measures 13:30-equivalent activity. - Calibrated on a handful of fire regimes; boreal forests untested. - The newest months are provisional (near-real-time data). ## Regions - Punjab, India (البنجاب، الهند), bbox W,S,E,N = [73.8, 29.5, 77.0, 32.6], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=punjab - South Sudan (جنوب السودان), bbox W,S,E,N = [24.0, 7.0, 27.0, 10.0], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=ssudan - Portugal (البرتغال), bbox W,S,E,N = [-9.6, 36.9, -6.1, 42.2], calendar 2001-01 to 2026-10: https://firms.apps.feeef.dev/?region=portugal - Bolivia, Chiquitania (بوليفيا، تشيكيتانيا), bbox W,S,E,N = [-63.0, -18.0, -59.0, -15.0], calendar 2001-01 to 2026-10: https://firms.apps.feeef.dev/?region=bolivia - Lebanon (لبنان), bbox W,S,E,N = [35.1, 33.0, 36.7, 34.7], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=lebanon - Algeria (الجزائر), bbox W,S,E,N = [-8.7, 18.9, 12.0, 37.1], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=algeria - France (فرنسا), bbox W,S,E,N = [-5.2, 41.3, 9.6, 51.1], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=france - Italy (إيطاليا), bbox W,S,E,N = [6.6, 36.6, 18.6, 47.1], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=italy - Morocco (المغرب), bbox W,S,E,N = [-13.2, 27.6, -1.0, 35.95], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=morocco - Spain (إسبانيا), bbox W,S,E,N = [-9.4, 35.9, 3.4, 43.8], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=spain - Tunisia (تونس), bbox W,S,E,N = [7.5, 30.2, 11.6, 37.6], calendar 2001-01 to 2026-11: https://firms.apps.feeef.dev/?region=tunisia ## Questions ### Why can't MODIS and VIIRS fire counts be joined directly? VIIRS has 375 m pixels against MODIS's 1 km, so it reports 2–4 times as many detections. Joining the records makes fire activity appear to jump in 2012, when VIIRS starts; the error of a direct join is 163–355% per month. ### What is a fire-day? A 2 km × 2 km square with at least one fire detection on a given local day, counted once no matter how many rows, passes or satellites saw it. It removes most of the pixel-size difference between the sensors. ### How are VIIRS counts converted to MODIS units? For each region, the average of two estimates: a per-month Aqua/VIIRS ratio and a seasonal curve of the chance Aqua also sees a square given the fire radiative power (FRP) VIIRS measured, learned from 2012–2021 with recent years weighted more. ### How accurate is the harmonized calendar? About 10% average monthly error (WAPE) when Aqua is hidden and predicted from VIIRS, against about 7% between two identical VIIRS satellites, the floor this data allows. A fixed multiplier gives about 19%. ### Why does the calendar use VIIRS after 2022? Terra and Aqua began drifting in 2022: Aqua now passes near 15:15 instead of 13:30, when fires burn more, so its counts are no longer comparable with its own past. VIIRS stayed at about 13:20. ### Where does the data come from? NASA FIRMS (Fire Information for Resource Management System): the yearly archives for MODIS and VIIRS, and the FIRMS API for recent days. ## API Base https://firms.apps.feeef.dev/api — JSON unless noted: - GET /api/regions — calibrated regions - GET /api/calendar?region&from=YYYY-MM&to=YYYY-MM&algorithm — monthly calendar, anomalies, summary - GET /api/compare?region&from&to&algorithms — methods side by side with evaluations - GET /api/hotspots?bbox=W,S,E,N&date&days=1..5 — FIRMS rows (json or csv) - GET /api/live?bbox&date — one day's VIIRS fire-days converted to Aqua-equivalent - GET /api/range?country|bbox&from&to — every detection in an area over any range - GET /api/export/calendar.csv — calendar CSV ## MCP https://firms.apps.feeef.dev/mcp — Model Context Protocol over Streamable HTTP (2025-03-26 to 2026-07-28), OAuth 2.1 sign-in (dynamic registration and client ID metadata documents) or a personal API key. Tools include find_region, get_calendar, get_anomalies, get_trend, seasonal_profile, rank_regions, compare_algorithms, search_hotspots, hotspot_stats, range_summary, live_convert, export_calendar_csv and explain_method.