What it solves
Two problems, and the second one is the dangerous one.
The first is ordinary discovery: there was no single place showing which product algorithms exist for which hazard, sensor and product, so asking for one meant knowing who to ask.
The second is that an event name can be wrong in a way that looks right. Names follow
YYYYMM_Hazard_Location, and upstream’s validation regex ends in .+ — which means the LOCATION
slot quietly swallows any extra underscores. 202501_Tropical_Cyclone_CA sails through. It is then
parsed as hazard = Tropical, location = Cyclone_CA, and that wrong hazard gets written into the
GeoTIFF’s HAZARD tag. Nothing errors. The product is simply mislabelled from then on, and the
mistake was made at the moment somebody typed an underscore.
So the rule here is deliberately stricter than upstream: the pattern ends _[^_]+$, making three
or more underscores a hard error the form refuses to submit. The divergence is one-directional and
safe — everything this accepts, DPS accepts too. And it is enforced in three places rather than
documented in one: the form as you type, validate_data.py over committed data, and a CI parity test
that fails if those two implementations ever disagree.
The failure on the left is silent, which is what makes it worth a hard error on the right. Being stricter than upstream is the safe direction: everything accepted here is also accepted by DPS.
What it does
A catalog of the NASA Disasters product algorithms, in three tabs:
- 📝 Submit — the activation request form, and the default landing tab.
- 🌀 Events — the event catalog: canonical
events.jsonplus submitted requests. - 🛰 Algorithms — filter by hazard / sensor / product / modality / date / event / AOI, through two entry modes (“start from hazard” vs “start from sensor & product”) that share one filter state.
The standard is enforced, not documented
The YYYYMM_Hazard_Location STAC event-name rule lives once in src/rules.ts — the regex is lifted
verbatim from upstream dps/_validate.sh — and is enforced in three places:
- the form, while you type (it won’t submit an invalid name),
scripts/validate_data.py, a 1:1 mirror of the rules,.github/workflows/algorithm-catalog-validate.yml, which re-checks every committed record on the PR and runsscripts/rules_parity_test.py— a test that pushes one fixture table through both implementations and fails if they disagree, so the two copies can never silently drift.
Multi-word hazards and locations are CamelCase (TropicalCyclone, WinterWx). The catalog
serializes hazard ids, never display labels.
Where the data comes from
Hand-curated data/{algorithms,events,hazards}.json, bundled at build, plus data/requests/*.json
overlaid via import.meta.glob. Submitting opens a prefilled new-file PR; on merge,
algorithm-catalog-compact.yml folds the request into the canonical data.
Run it locally
cd algorithm-catalog
npm install
npm run dev
# The standards gate, offline:
python3 algorithm-catalog/scripts/validate_data.py
python3 algorithm-catalog/scripts/rules_parity_test.py
Related
- Data model, the two entry modes, and the standards-enforcement chain:
docs/ALGORITHM_CATALOG.md