Angular client for Kenya's Master Health Facility Registry (KMHFR): search, filter and inspect 12,394 health facilities across all 47 counties.
# Afya Atlas — Kenya health facility registry
A browser client for Kenya's Master Health Facility Registry: search, filter and
inspect 12,394 registered health facilities across all 47 counties.
The registry itself is built and maintained by **Savannah Informatics** for the
Ministry of Health (MasterFacilityList/mfl_api).
This is a client against that national registry.
**Live:**
mrlou1s.github.io
**Stack:** Angular 21 · TypeScript (strict) · SCSS · Jasmine/Karma · GitHub Actions
```bash
npm install
npm start # dev server on :4200
npm test # Jasmine/Karma, real browser
npm run test:ci # headless, with coverage
npm run build # production bundle
npm run snapshot # regenerate the facility data from the raw CSV
```
> **The data is a snapshot from 26 May 2020, not live.** The KMHFR API was
> unreachable throughout this build. That is the most interesting thing about
> this project, and the write-up below is the honest version.
---
## The API investigation
The full write-up is in docs/api-investigation.md.
It is the deliverable I would most want to be asked about. The short version:
I set out to call `
api.kmhfr.health.go.ke` from the browser. Every probe
timed out. Rather than record "it didn't work", I tried to establish how far the
failure went:
- DNS resolves. Other Kenyan government hosts (`www.health.go.ke`, `kenyalaw.org`)
return 200, so my network routes to Kenya fine.
- TCP connect to the API's address fails on **both** 80 and 443.
- A **different** host in the same address range — the legacy MFL sandbox —
accepts connections on both ports, so the block itself is reachable.
- A third-party proxy on unrelated infrastructure also fails to reach the origin,
returning 522. So the failure is not local to me.
- The public site `kmhfr.health.go.ke` resolves to the **same address** as the
API and is equally dead.
The whole KMHFR platform is down, not just its API. The Internet Archive's last
good capture …