Field monitoring dashboard for the Kwara State Integrated Supportive Supervision (ISS) programme, linked to the KoboToolbox data collection form.
# Kwara State ISS — Field Monitoring Dashboard
A field monitoring dashboard for the **Kwara State Integrated Supportive
Supervision (ISS)** programme. It shows where supervision visits have been
conducted — State → LGA → Ward → Health facility — highlights the six
thematic performance domains and tracer KPIs from the checklist, flags
data-quality issues, and tracks corrective actions to closure.
**Live site:** enable GitHub Pages on this repo (Settings → Pages → Deploy
from branch `main`, folder `/`) and it will be served at
`https:// .github.io/ /`.
**Data collection form:**
ee.kobotoolbox.org
**KoboToolbox asset:** `a3px58eSfDuyg3PLUdNBpR` on `kf.kobotoolbox.org`
## How it's put together
```
index.html the dashboard page
assets/
style.css design system + layout
app.js all scoring, filtering, charts and interactions
schema.json form structure: domains, checklist items, tracer
KPIs, LGA/ward/facility hierarchy — mirrors the
deployed XLSForm exactly
data/
live_submissions.json flattened real submissions (refreshed on a schedule)
live_meta.json when the live snapshot was last fetched
sample_submissions.json realistic demo data for the "Sample preview" toggle
scripts/
fetch_kobo_data.py pulls submissions from the Kobo API and writes data/
.github/workflows/
refresh-data.yml scheduled job that keeps live_submissions.json current
```
All scoring (domain scores, overall weighted score, GREEN/AMBER/RED/CRITICAL
classification, critical red-flag detection) is computed **in the browser**
from raw item-level responses, using the exact same rules as the XLSForm's
`calculate` fields. There is no separate scoring logic to keep in sync — the
dashboard reads whatever the form produces.
## Why the data refreshes on a schedule instead of "live"
KoboToolbox's API does not send the CORS headers a static site would need to
call it directly from the browser, and — more importantly …