Sudan and Neighbouring Countries HSPs
# HSP Dashboard — Sudan Crisis Operations
Interactive map dashboard of Humanitarian Service Points (HSPs) along the mixed
migration routes of the Sudan crisis (Sudan, Ethiopia, South Sudan and
neighbouring operational countries). IFRC / DRC partnership.
Built as a fully static site (MapLibre GL + vanilla JS) so it can be published
free on **GitHub Pages**. All dashboard content — HSP records, filters, stats,
map boundary layers — is generated from the source files in `source/`, so
updating the dashboard is just *replace file → push*.
## How it works
```
source/HSP_Structured_Directory.xlsx ──┐
source/shapefiles/*.shp ──┤── scripts/build_*.py ──> data/*.json
source/remote-cache/ (geoBoundaries) ──┘ │
▼
index.html + css/ + js/app.js ── fetches ──────────────────> rendered dashboard
```
| Path | Role |
|---|---|
| `source/HSP_Structured_Directory.xlsx` | **The editable HSP directory.** The build reads the master `HSP Directory` sheet. |
| `source/shapefiles/` | Geometry-only admin boundary shapefiles (`{iso}_admin{level}.shp`). |
| `source/remote-cache/` | Cached geoBoundaries downloads (named regions + LBY/CAF outlines). Committed so builds don't depend on the remote. |
| `scripts/build_hsps.py` | Excel → `data/hsps.json` + `data/metadata.json` |
| `scripts/build_boundaries.py` | Shapefiles → `data/boundaries/*.geojson` (simplified for the web) |
| `data/` | Generated output the dashboard fetches at runtime. Don't edit by hand. |
| `.github/workflows/deploy.yml` | Rebuilds `data/` and deploys to GitHub Pages on every push to `main`. |
## Updating the dashboard
1. **HSP data changed?** Replace `source/HSP_Structured_Directory.xlsx` with the
new version (keep the `HSP Directory` sheet name and column headers — column
*order* can change freely; new Yes/No service columns are picked up
automatically, as are new countries, which get their own colour and filter
button).
2. **Boundaries changed?** Drop the updated `.shp` …