Anticipatory action framework · 2026 version · Monitoring

Trigger monitoring: storms and hurricanes in Haiti

What the monitoring system computed for each National Hurricane Center (NHC) advisory and each day of observed rainfall, with the data behind every value. The page updates after each run of the system: every 6 hours, after each NHC advisory, and when each new rainfall forecast (CHIRPS-GEFS) and observation (IMERG) arrives. The trigger is defined on the 2026 framework page (in French).

This page and its data are for information only. Official notices of activation are sent by email from the OCHA Centre for Humanitarian Data, as set out in the framework’s monitoring and activation protocol.

Current status

Data as of 5 Nov 2026, 10:23 UTC. The page and its files are refreshed after each run of the monitoring system, about every 6 hours.

Machine-readable: data/index.json (current state) · data/datapackage.json (the tables and their fields) · llms.txt (guide for scripts and AI assistants).

Trigger status, 2026 season

Once a trigger is reached for a storm, it stays reached until the end of that storm, even if later advisories no longer meet the conditions. The framework, written in French, names the three stages Mobilisation, Action and Réponse précoce; this page calls the last one Early response.

The two Action conditions based on DGPC alerts (orange in at least 6 departments; red confirmed by an NHC Hurricane Warning) are not monitored here: there is no feed of DGPC alerts. See Method and limitations.

Monitored storms

Every North Atlantic storm the NHC has issued advisories for since 1 Aug 2026. Information emails only go out for storms within 1,000 km of Haiti.

StormAdvisoriesFirst advisoryLast advisory Min. distanceMobilisationAction Early response

Advisory by advisory

Pick a storm, then an NHC advisory. The map shows what the advisory forecast; the cards on the right show how each trigger condition was evaluated.

—

Forecast rainfall used for this advisory

—

Advisory (UTC)Closest pass Cutoff Rain ≤ 120 hPeople 64 kt ≤ 120 h Mobilisation Rain ≤ 72 hPeople 64 kt ≤ 72 h ActionData

Observed rainfall and winds for this storm

—

IMERG through2-day rain (window max.) Rain countsPeople 64 kt observed Early response

Rainfall: latest data

These series arrive even when there is no storm. Rainfall only counts for the trigger on the days a storm is forecast (or observed) within 230 km of Haiti: from the first to the last such day, plus the day after (the shaded days). Under each chart, each storm’s closest distance to Haiti that day shows which days those are.

Latest CHIRPS-GEFS forecast

—

IMERG observed rainfall, last 45 days

Getting the data

All the data on this page are public static files, updated at every run of the system. There is no account and no key: each file has a fixed address that a browser, curl, Python or R can read directly. Paths below are relative to https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/.

For scripts and AI assistants, llms.txt describes these files on one plain-text page, with the current status and the most common ways to misread them.

FileContents
data/index.json Entry point: thresholds, freshness of each source, list of storms with their latest advisory and triggers, latest CHIRPS-GEFS forecast and the last 45 days of IMERG.
data/storms/{ATCF}.json One storm (e.g. AL052026): each advisory with its values and the path of its file, the observed track and swath, the IMERG days and the observed rainfall window.
data/advisories/{ATCF}/{YYYY-MM-DDTHHMMZ}.geojson One NHC advisory, as GeoJSON (opens in QGIS): forecast track points, 64 kt wind zones capped at 120 h and 72 h (already observed area removed), observed swath; the advisory block gives the cutoff, the rainfall windows, the CHIRPS-GEFS series used and the result of each condition. Geometries are simplified for display (≈ 100 m): the exact geometries are in data/buffers/.
data/buffers/fcast_64kt.parquet Exact 64 kt wind zones (GeoParquet, EPSG:4326, full precision), as the system computed them. For each advisory and each stage, three layers (layer): the forecast zone capped at 120 h or 72 h, the observed swath removed from it, and the difference, in which the exposed population (exp_fcast_120h, exp_fcast_72h) is counted within the boundary geo/hti_adm0.parquet.
data/buffers/obsv_64kt_swaths.parquet Every cumulative observed 64 kt swath of the season’s storms, exact, as the storms database holds it, with the population counted in it.
data/fcast_monitoring.csv One row per advisory: every forecast value and result.
data/obsv_monitoring.csv One row per storm and IMERG day: observed rainfall and winds.
data/fcast_monitoring.parquet, data/obsv_monitoring.parquet The same two tables in Parquet, typed (UTC dates, numbers, booleans), for scripts.
data/rain/chirps_gefs.csv, data/rain/imerg.csv Daily national mean rainfall and 2-day total, for every CHIRPS-GEFS forecast and every IMERG day.
data/geo/hti.geojson Outline of Haiti and the 230 km and 1,000 km zones (simplified).
data/geo/hti_adm0.parquet The exact boundary within which exposed population is counted (FieldMaps).
data/datapackage.json Every file with a description of each of its fields, its size and its checksum (Frictionless Data Package format).
data/manifest.json SHA-256 checksum and size of every file, and generation time.

For the whole season at once, read the Parquet files; for the advisory issued at a specific date and time, read data/storms/{ATCF}.json: each advisory is listed there with its issue_time and the path of its file. For example:

# Whole season: recorded values and exact wind zones
import io, requests, pandas as pd, geopandas as gpd
base = "https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/data/"
rows = pd.read_parquet(base + "fcast_monitoring.parquet")
get = lambda f: io.BytesIO(requests.get(base + f).content)
zones = gpd.read_parquet(get("buffers/fcast_64kt.parquet"))
action = zones[(zones.stage == "action") & (zones.layer == "fcastonly")]

# Every advisory of one storm, then the one issued at a given time
curl -s https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/data/storms/AL042026.json | jq '.advisories[] | {issue_time, file}'

import requests
base = "https://ocha-dap.github.io/ds-aa-hti-hurricanes/2026/suivi/data/"
storm = requests.get(base + "storms/AL042026.json").json()
adv = next(a for a in storm["advisories"] if a["issue_time"] == "2026-08-28T15:00:00Z")
fc = requests.get(base + adv["file"]).json()      # GeoJSON
print(fc["advisory"]["stages"]["action"])         # rainfall, winds, result
import geopandas as gpd                           # the wind zones
gdf = gpd.GeoDataFrame.from_features(fc["features"], crs=4326)
What the main fields mean
FieldMeaning
issue_timeIssue time of the NHC advisory (UTC).
hours_to_closest_passHours between the advisory and the closest pass to Haiti that this advisory forecasts.
past_cutoffTrue if that pass is forecast less than 48 h away: the advisory can no longer trigger (cutoff).
rain_window_start, rain_window_endDays the storm is forecast within 230 km of Haiti within the stage’s limit (120 h or 72 h), plus the following day. Empty if the storm is not forecast there.
rain_eligibleTrue if a window exists: forecast rainfall can then count for the trigger. Empty (null) for the few advisories whose window could not be rebuilt.
rain_120h, rain_72h / rain_2day_max_mmHighest 2-day total of national mean rainfall (CHIRPS-GEFS) over the window, in mm. Empty without a window.
sum_2day_mm2-day total assigned to the second day: rainfall on day D−1 + rainfall on day D.
in_window_mobilisation, in_window_action, in_windowTrue if that day is in the window where rainfall counts.
exp_fcast_120h, exp_fcast_72hPeople in Haiti inside the forecast ≥ 64 kt wind zone up to 120 h / 72 h, excluding the area already observed (WorldPop 2026).
exp_obsv, obsv_expPeople in Haiti inside the ≥ 64 kt wind swath already observed.
exp_total_120h, exp_total_72hSum of the two: the wind condition is met if it is above 0.
rain_trigger_*, exp_trigger_*Rainfall or wind condition met, before the cutoff.
mobilisation_trigger, action_trigger, obsv_triggerStage triggered by this advisory (or this day), cutoff included. obsv is Early response.
rainfall_relevantObservations: true while the IMERG day is in the window when the storm was within 230 km.
layerExact zones: fcast_capped, the ≥ 64 kt wind zone of the forecast points up to 120 h or 72 h; obsv_swath_subtracted, the observed swath at the exact advisory time, removed from that zone (empty if there was none); fcastonly, the difference, in which population is counted.
sourceevaluated: zone saved by the system when it evaluated the advisory. rebuilt: advisory evaluated before the system saved its zones, recomputed once with the same function. none: can no longer be rebuilt (advisories evaluated before 22 September 2026 whose time changed in the database); no geometry.
pop_exposed_hti, pop_exposed_recordedPeople counted in the fcastonly zone, and the value recorded by the monitoring; identical when source is evaluated.
dist_daysThe storm’s closest distance to Haiti (km) on each UTC day, from the same 30-minute track as the trigger: in each advisory file (forecast track up to 120 h; older files may not have it), in storms/{ATCF}.json under obsv (observed track), and in index.json under chirps_gefs_latest.storms (latest advisory of each active storm, with its rainfall windows) and imerg_recent_storms. A rainfall window runs from the first to the last day closer than 230 km, plus the day after.
rebuilt.differencesTracks and rainfall windows are recomputed for the page with the same function as the monitoring; any difference from the recorded values is listed here (normally empty). geometry_identical_to_evaluated says whether the recomputed zone is identical, coordinate for coordinate, to the saved one.

Method and limitations