A web platform for Mawu (MVDC, Malawi Voice Data Commons). Mawu is the Chichewa word for voice; the project is named in the language it exists to serve, and the full form is carried at first mention (see RESEARCH-REPORT.md §2.4). Mawu is a shared, community-governed repository of spoken-language data, starting with Chichewa, being built so Malawian languages have a place in the AI systems designed around us. Its purpose is a community response system: someone calls a toll-free line, reports an incident in their own language, and the system understands it, triages it, and routes it to a trusted responder.
This app is the Crisis Emergency Dashboard, thematic analysis of violent conflicts and human-rights violations across Malawi. Today it is powered by news and monitoring sources; in future it can be powered by MVDC voice reports.
| Link | Who can open it | What it shows | |
|---|---|---|---|
| The platform | https://mawu-mvdc-dashboard.netlify.app | username + password | The full platform, with internal field-research contacts redacted |
| Internal site | https://mawu-support.netlify.app | password | Everything, unredacted. Serving a July 2026 build; on a different Netlify account |
| — | Retired 2026-08-19. Serves a notice pointing to the site above |
Access is enforced by netlify/edge-functions/auth.ts, which runs at the edge
before any file is served, so pages, assets and data files are all covered — a
client-side gate would ship the content and then hide it. Credentials live in the
SITE_USER and SITE_PASSWORD environment variables on the Netlify site and are
never committed.
⚠️ IfSITE_PASSWORDis unset the site serves to anyone, and logs an error. That is deliberate — a config mistake should not brick the site — but it means an unset password is an open site, not a locked one. Verify with:curl -I https://mawu-mvdc-dashboard.netlify.app # expect: 401
⚠️ The repository is public, so the source is readable by anyone, includingsrc/data/fieldwork.tswith partner focal points and contact details, and the whole git history. Authentication on the site does not change that.
The build is still redacted even behind the password. Defence in depth: the redaction is what protects the material if the password leaks, is shared, or is unset by mistake.
Start with the one that matches what you need.
| Document | For | Length |
|---|---|---|
| USER-GUIDE.md | Using the platform, assuming no prior knowledge. What the three working screens do, how to filter and share a view, and what the numbers do and do not mean | short |
| TECHNICAL-SPEC.md | How it is built: architecture, stack, data model, the build and check scripts, deployment and its traps, and an honest list of what is not built | medium |
| GUIDE.md | Working on it day to day: every tab in detail, the two certainty scales, adding data, running the checks | long |
| RESEARCH-REPORT.md | The academic report: the problem, the method, the taxonomy, the frameworks, governance and ethics | long |
| CODING-MANUAL.md | Turning a news article into a coded record: categories, tie-breaks, severity, the compromised-authority criteria, de-duplication | medium |
| LIMITATIONS.md | Everything the platform cannot do, graded by how much it bounds the claims | medium |
| THESIS-DEFENSE.md | Viva preparation: the argument in brief, the variable catalogue, and the questions an examiner would ask | long |
| BACKLOG.md | What is done, what is open, and why | long |
| CITATIONS.md | The bibliography | reference |
- Crisis Emergency Dashboard (map), interactive Leaflet map of Malawi with reports plotted by district, coloured by issue category, sized by severity of harm.
- Satellite and Map basemaps, high-resolution ESRI World Imagery satellite layer (Malawi-focused, zoomable to street level) with a one-tap Satellite ⇄ Map toggle.
- Waterways (Fika WaterNet), optional overlay of modelled rivers and streams. Off by default; toggle it in the map's layer panel.
- Rain & wind (Open-Meteo), optional live overlay: rainfall expected today per district, wind arrows, and a 7-day threshold screen naming districts headed for flood- or gale-force conditions. Off by default; toggle it in the layer panel.
- Time slider (2022 → 2026), move across months; view a single month or all reports up to a date. Coverage is weighted to 2025 to 2026.
- Analysis, thematic dashboards: primary issues and violations, specific sub-issues, monitoring channels, most-affected districts, and reports by year.
- Conflicts, browsable list + detail for each report: sub-issue, district, city, source, recommended responder, and a "local authority compromised" flag.
- Filters, by issue category, district, and city and town.
- About and Team, MVDC mission, partners, and governance.
Where a river runs decides who can reach help, and Malawi's mapped hydrography is thin outside the Shire and the lakeshore. WaterNet is a machine-learning model Fika (formerly Bridges to Prosperity) ran over satellite imagery to predict waterways worldwide; it roughly tripled the mapped extent, and most of what it added is the small rural drainage that separates a village from a clinic in the rains.
Served as PMTiles from Fika's public bucket under CC-BY 4.0. The global file is 51 GB, but HTTP range requests mean the browser pulls only the tiles covering the current view, so nothing is vendored into this repo. The layer is off by default on purpose: the default view should not depend on a third-party bucket being reachable.
Read it as prediction, not survey:
- Streams already present in TDX-Hydro draw in blue; streams the model added draw in amber. One confident web would hide which half is inference.
- A drawn stream may be seasonal, fordable, or absent, and the layer says nothing about whether it is bridged.
- Lines the model routes across lake surfaces are dropped, drawn, they turn Lake Malawi into a hatched mat that reads as dozens of rivers.
- Streams thin by Strahler order as you zoom out; zoom in for the small ones.
No trail-bridge layer. Fika also publishes its register of 962 built pedestrian crossings, which would pair naturally with the blockages layer, none of them are in Malawi. Its nearest work is Zambia (13) and Mozambique (1). An empty layer would read as "no crossings here", which is false, so it is not drawn.
Almost every road and bridge cut in the blockages layer was put there by rain or by a cyclone. Weather is therefore an access variable in this platform, not a weather report: what the sky is doing this week is part of whether a survivor can reach the nearest facility at all.
Open-Meteo is a free, key-less, CORS-enabled forecast API (an ECMWF and GFS and ICON blend, CC-BY 4.0), which is what makes it usable from a static export with no server and no secret. One request carries all 28 district centres; nothing is fetched until the layer is switched on, and it re-pulls every 15 minutes while open.
What is drawn:
- A circle per district, shaded on a single-hue blue ramp by the rainfall expected today (<1 / 1 / 10 / 25 / 50 / 100+ mm). Circle size repeats the same magnitude, so the layer still reads without colour.
- Wind arrows pointing downwind, length by speed, red at ≥50 km/h.
- A 7-day hazard screen listing districts that cross a threshold, worst day first, each with the day that triggered it.
Thresholds are calibrated against this platform's own blockage record by
npm run build:weather, which reads ERA5 reanalysis for every district-month
carrying a recorded road or bridge cut and compares it against the wet-season
distribution for all 28 districts since 2000. The evidence and its limits are
written into src/data/weatherCalibration.ts.
- Rain: 25 / 50 / 100 mm in a day, which are the p96.5, p99.5 and p99.93 of Malawi's own wet season. All nine recorded cut district-months had a day above 65 mm and six had a day above 100 mm, so rain alone flags every one of them at alert or worse. The borrowed WMO bands survived the check unchanged.
- Gusts: 50 / 55 / 65 km/h, the p97, p99 and p99.9 of Malawi's wet-season gusts. These replaced the South-West Indian Ocean cyclone marks (62 and 89 km/h), which describe storms at sea. Cyclones weaken over land: 89 km/h sits above the entire 26-year wet-season record in six of the eight districts Freddy cut, so on wind alone it fired for one of the nine known cuts. It now reaches six.
- Alert burden: roughly 7.7 watch, 1.7 alert and 0.3 severe days per district per wet season.
- What the calibration cannot say: nine cut months clustered in three weather events, dated to the month rather than the day, is a small and dependent sample, and because blockages come from media reporting a district-month with no recorded cut is not a district-month with no cut. This measures sensitivity and alert burden, never a false-positive rate.
- These are point forecasts sampled at each district centroid on a ~11 km model grid. They describe a district the way one rain gauge would, not an areal average.
- Nothing here is an official warning. Malawi's DCCMS issues those. This is a threshold screen over a public model: good for "look harder at Nsanje this week", never for "a cyclone will hit Nsanje".
- A failed fetch keeps the last snapshot on screen and says so. A forecast that quietly stops updating must never look like calm weather.
Reports are classified with the MPP taxonomy, eight primary issue and violation categories, each with specific sub-issues:
- Violation of right to physical integrity (violent attacks)
- Political and electoral misconduct
- Violation of right to mental integrity
- Violation of right to liberty and security (law-enforcement misconduct)
- Discrimination against women and GBV
- Restrictions on civil and political rights
- Discrimination against disadvantaged groups
- Attacks against Persons with Albinism (PWA)
Media Monitoring (electronic & print) · Social Media (Facebook, X, TikTok, Instagram) · UNDSS reports · Public Affairs Committee (PAC) · UNDP and UN Women Violence-Against-Women reports · Malawi Police Service (MPS) reports.
Note: The incident records in
src/data/reports.tsare real, publicly-reported events (2025 to 2026), each linked to a published source (media monitoring, human-rights bodies, UN Women and UNDP, MISA and others). They are summarised from public reporting; the set is initial and grows as more channels are integrated. Some non-public channels (UNDSS, MPS, PAC) are represented via published coverage.
Next.js (App Router) · TypeScript · Tailwind CSS · React-Leaflet + OpenStreetMap.
npm install
npm run dev # http://localhost:3000
npm run build # production buildDeploys are blocked until 8 August 2026, the Netlify account has exhausted its usage credits (
403 — Account credit usage exceeded). The live site serves the 28 July build; everything since is committed and pushed. See GUIDE.md.
Live site: https://mawu-support.netlify.app
The site is a fully static export (output: "export" in next.config.ts),
emitted to out/. It is hosted on Netlify, which keeps the source repo
private while serving the site publicly.
npm run build # static export → out/ (root-relative assets)
npx netlify-cli deploy --prod --dir=outNetlify serves from the site root, so no base path is needed, a plain
npm run build produces a fully clickable and interactive site. Build config lives
in netlify.toml (command = npm run build, publish = out).
A gh-pages branch used to serve a second, open copy of the platform at
carolina-moron.github.io/MVDC/. It was retired on 19 August 2026 when
authentication was added: an unauthenticated public copy of the same platform
makes the password on the Netlify site decorative.
GitHub does not permit deactivating Pages on a public repository, so the branch now holds a single notice page pointing at the access-controlled site. Do not republish the build there — restoring it reopens the hole it was closed for.
⚠️ Authentication gates the site, not the source. The repository is public, sosrc/data/fieldwork.tsand the entire git history are readable at raw.githubusercontent.com by anyone who looks. Making the repository private is the only fix, and it has other consequences, so it is recorded as an open decision in BACKLOG.md rather than assumed here.
Drop the official MVDC logo at public/logo.png and it is used everywhere
automatically. Until then, an on-brand inline SVG mark
(src/components/Logo.tsx) is shown as a fallback.
src/
app/ # Next.js app router (layout, home page → <Platform/>)
components/
Platform.tsx # shell: tabs, time slider, filters, shared state
MapView.tsx # Leaflet map (client-only)
AnalysisTab.tsx # thematic bar charts + stat tiles
ConflictsTab.tsx # list + detail view
AboutTab.tsx # MVDC mission, partners, governance
TeamTab.tsx # team / partner organisations
Logo.tsx # logo (public/logo.png with SVG fallback)
data/reports.ts # districts + classified sample reports
lib/
types.ts # taxonomy, categories, sources, Report model
time.ts # monthly timeline helpers