This is a submission for the DEV Weekend Challenge: Community
The Community
It is 11 PM in Bépanda, a working-class neighborhood in Douala, Cameroon.
A mother's 4-year-old son has a fever that won't break. She needs to find a pharmacy — one that is open right now, that has pediatric medication, and that accepts MTN Mobile Money, because she has no cash at home.
She has no app to check. No website to search. She starts calling neighbors. Her first neighbor doesn't know. Her second neighbor gives her the name of a pharmacy two kilometers away. She walks there in the dark. It's closed. She walks to another one. Also closed. On her third attempt, 45 minutes later, she finds an open pharmacy — but it doesn't accept Mobile Money. She doesn't have cash. She walks home.
This is not a hypothetical story. This is Tuesday night in Douala.
HealthNearby was built to end that walk.
The Problem It Solves
Cameroon is a country of 28 million people. Here are the numbers that shaped every decision I made building this app:
7.9% — the percentage of Cameroonians with health insurance, according to a nationally representative survey published in 2024 (Afrobarometer / University of Yaoundé 1). That means 92.1% navigate the healthcare system entirely on their own, paying out of pocket, every single time.
70% of all healthcare spending in Cameroon comes directly from households — not the government, not insurance. When you get sick, you pay. Every time.
64% of Cameroonian households cannot access healthcare at all because of cost, according to World Obesity Federation data citing national health system reports.
Cameroon has 19.5 million active mobile money accounts and processes over 2.2 billion transactions per year (BEAC, 2023). MTN MoMo and Orange Money together account for more than 80% of all electronic transactions in the country. Yet there is no way to filter healthcare facilities by which payment method they accept.
Mobile money usage grew from 29.9% in 2017 to 42.7% in 2022 among Cameroonians aged 15 and over (National Institute of Statistics, Ecam 5, 2024). It is the dominant financial tool — not banks, not cards.
The consequences of this information gap are not abstract:
People delay seeking care because they don't know where to go, making conditions worse and more expensive to treat.
Families travel across the city to reach a facility, only to find it closed, doesn't accept their payment method, or doesn't offer the service they need.
Healthcare workers at smaller clinics and health centers are underutilized because people simply don't know they exist.
People pay in cash even when they have Mobile Money, because they don't know which facilities accept it — leading to situations where they can't pay at all.
Pharmacies de garde (on-duty pharmacies) rotate weekly in Cameroon, but this information is only published in local newspapers — inaccessible to most people at 11 PM.
This is a solvable problem. The facilities exist. The payment infrastructure exists. What's missing is the information layer connecting people to care.
HealthNearby is that information layer.
What I Built
HealthNearby is a mobile-first web directory that helps people in Cameroon instantly find nearby healthcare facilities with:
✅ Real-time open/closed status — computed from current local time, no manual updates needed
💛 MTN MoMo filter — find facilities that accept Mobile Money right now
🟠 Orange Money filter — same for Orange Money users
🌙 On-duty filter — surface pharmacies open late at night
📞 One-tap call button — native
tel:link, works on any Android phone📱 Fully responsive — designed for low-end Android phones first, because that is what most people in Douala use
🔍 Combined filters — search by city + type + payment + duty status simultaneously
🔗 Live demo: https://healthnearby-8kw8.vercel.app
💻 GitHub: https://github.com/joanayissindong/healthnearby
The short-term impact: someone in Douala at 11 PM can open this app, tap "Pharmacy" + "MTN MoMo" + "On duty", and find an open pharmacy that accepts their payment method in under 10 seconds. That walk in the dark becomes a phone call.
The long-term vision: HealthNearby is the first building block of a healthcare infrastructure platform for Central and West Africa — a platform where facilities self-register, update their own data, and where patients leave reviews. A platform that makes the invisible visible.
Demo
Try it live: https://healthnearby-8kw8.vercel.app
- Select Douala + Pharmacy → click Search
- Toggle the MTN MoMo filter
- See which pharmacies accept Mobile Money and are open right now
- Click on a facility → see full details, opening hours, services, payment methods
- Tap Call now to call directly from your phone
The app currently covers 20 healthcare facilities across:
Douala (15): hospitals, clinics, pharmacies, laboratories, community health centers
Yaoundé (5): same categories, Cameroon's capital city
Code
joanayissindong
/
healthnearby
Find healthcare facilities in Cameroon
🏥 HealthNearby
Find healthcare facilities in Cameroon — with real-time open/closed status and Mobile Money filters.
It is 11 PM in Bépanda, Douala. A mother's child has a fever that won't break. She needs a pharmacy — open right now, that accepts MTN MoMo. She has no app to check. She starts calling neighbors.
HealthNearby was built to end that walk.
🔗 Live demo: https://healthnearby-8kw8.vercel.app 💻 API: https://healthnearby.vercel.app/api/v1/facilities 📝 DEV.to article: https://dev.to/joanayissindong/healthnearby-find-healthcare-facilities-in-cameroon
The Problem
- 7.9% of Cameroonians have health insurance — 92.1% navigate the system entirely on their own
- 70% of all healthcare spending comes directly from households
- 19.5 million active Mobile Money accounts — yet no way to filter facilities by payment method
- On-duty pharmacy rotations are published only in local newspapers — inaccessible at 11 PM
The facilities exist. The payment infrastructure exists. What's missing is the information layer.
HealthNearby is that information layer.
Features
| Feature | Description |
|---|---|
| 🔍 |
How I Built It
Tech Stack
| Layer | Technology | Hosting |
|---|---|---|
| Frontend | React + TailwindCSS (Vite) | Vercel |
| Backend | Node.js + Express REST API | Vercel (serverless) |
| Database | PostgreSQL (20 seeded facilities) | Neon |
Architecture: Clean Architecture + DDD
I built this with Clean Architecture combined with Domain-Driven Design (DDD). Under competition pressure, it's tempting to write fast spaghetti code. I refused to. Here's why it mattered: when bugs appeared, I isolated them in minutes because each layer had a single responsibility.
The 4 layers, with strict dependency rules:
Presentation → Controllers, Routes, Middleware
Application → Use Cases, DTOs, Mappers, Filters
Domain → Entities, Value Objects, Repository Interfaces
Infrastructure → PostgreSQL, Repository Implementations, Seeders
Golden rule: the Domain layer has zero external dependencies. It does not know about PostgreSQL, Express, or React. It contains only pure business logic.
Key Design Patterns
Repository Pattern — IFacilityRepository is a pure interface in the Domain layer. PostgresFacilityRepository in Infrastructure implements it. The Domain never touches PostgreSQL directly. Swapping the database tomorrow requires changing exactly one file.
Use Case Pattern — one class = one business action, fully testable in isolation:
class SearchFacilitiesUseCase {
constructor(facilityRepository) {
this.facilityRepository = facilityRepository;
}
async execute(searchQueryDTO) {
const facilities = await this.facilityRepository.search(searchQueryDTO);
return facilities.map(FacilityMapper.toResponseDTO);
}
}
Value Objects — OpeningHours is an immutable Value Object that encapsulates the real-time open/closed logic. No cron job. No stale boolean in the database. Status is computed at request time from the current local time:
class OpeningHours {
constructor({ weekdays, saturday, sunday, is_24h, is_on_duty }) {
Object.freeze(this); // immutable
}
isOpenNow() {
if (this.is_24h || this.is_on_duty) return true;
const now = new Date();
const day = now.getDay();
const time = now.getHours() * 60 + now.getMinutes();
const range = day === 0 ? this.sunday
: day === 6 ? this.saturday
: this.weekdays;
if (!range || range.toLowerCase().includes('emergency')) return false;
const [open, close] = range.split('-').map(t => {
const [h, m] = t.trim().split(':').map(Number);
return h * 60 + m;
});
return time >= open && time < close;
}
}
Strategy Pattern — filters are composable strategies. Any combination works:
FilterChain.buildFrom({ city, type, mtn_momo, orange_money, on_duty })
Mobile Money Was Not an Afterthought
In most countries, you'd add "accepts Visa" as a minor detail. In Cameroon, Mobile Money is infrastructure. Cameroon has 19.5 million active mobile money accounts (BEAC, 2023) and processed 2.2 billion transactions in 2023 alone — a 3.6x increase since 2019. MTN MoMo and Orange Money together control over 80% of all electronic transactions in the country.
Only 7% of young Cameroonians have a bank account (FinMark Trust). Mobile Money is not a payment option. It is the payment option.
Designing the payment filter as a first-class feature — indexed in PostgreSQL, exposed as a primary UI filter, displayed prominently on every facility card — was not a product decision. It was a decision rooted in how this community actually lives.
The Database
PostgreSQL on Neon, with indexes designed for the most common query patterns:
CREATE INDEX idx_facilities_city ON facilities(city);
CREATE INDEX idx_facilities_momo ON facilities(payment_mtn_momo);
CREATE INDEX idx_facilities_orange ON facilities(payment_orange_money);
CREATE INDEX idx_facilities_duty ON facilities(is_on_duty);
Every filter combination hits an index. Search is fast even on a slow mobile connection.
Real-time Status Without a Cron Job
Instead of storing is_open in the database and updating it with a scheduled job, I compute the status at request time in the OpeningHours Value Object. No cron job, no stale data, no extra infrastructure.
Mobile Money First
MTN MoMo and Orange Money are the primary payment methods for most Cameroonians — not credit cards. Designing the data model and filters around this reality was a core architectural decision, not an afterthought.
What's Next
Short term:
📍 GPS-based geolocation — "show me what's closest to me right now"
🏙️ Expand to Bafoussam, Bamenda, Garoua and 5 more Cameroonian cities
🔔 On-duty pharmacy weekly notifications via WhatsApp or SMS
Long term:
🏥 Facility self-registration portal — let clinics and pharmacies manage their own data
⭐ Patient reviews and ratings
🌍 Expand to neighboring countries: Gabon, Congo, Côte d'Ivoire
📊 Health access analytics dashboard for NGOs and government health agencies
🤝 API for integration with national health information systems
HealthNearby is not just a weekend project. It is the first building block of something much larger: a healthcare information infrastructure for Africa that has never existed. We're starting with 20 facilities in two cities. The vision is every facility, every city, every country in the region.
The mother in Bépanda shouldn't have to walk in the dark. She shouldn't have to call five neighbors. She shouldn't arrive at a closed pharmacy at midnight with a sick child.
She just needs to open an app.
That's what HealthNearby is for.
Built with ❤️ from Yaoundé, Cameroon.
Joan Wilfried AYISSI NDONG — DEV Weekend Challenge, March 2026



Top comments (2)
This is such a meaningful project. Real problems need real solutions — and this is exactly that. Hats off to you!.
Thank you so much, Harsh! That really means a lot. This project comes from a real frustration I've witnessed living in Douala — and building it felt like the most meaningful thing I could do with a weekend. I hope it grows into something much bigger for the whole region. 🇨🇲