DEV Community

Cover image for HealthNearby — Find Healthcare Facilities in Cameroon
Joan Ayissi Ndong
Joan Ayissi Ndong

Posted on

HealthNearby — Find Healthcare Facilities in Cameroon

DEV Weekend Challenge: Community

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

  1. Select Douala + Pharmacy → click Search
  2. Toggle the MTN MoMo filter
  3. See which pharmacies accept Mobile Money and are open right now
  4. Click on a facility → see full details, opening hours, services, payment methods
  5. 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

GitHub logo 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);
  }
}
Enter fullscreen mode Exit fullscreen mode

Value ObjectsOpeningHours 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;
  }
}
Enter fullscreen mode Exit fullscreen mode

Strategy Pattern — filters are composable strategies. Any combination works:

FilterChain.buildFrom({ city, type, mtn_momo, orange_money, on_duty })
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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)

Collapse
 
harsh2644 profile image
Harsh

This is such a meaningful project. Real problems need real solutions — and this is exactly that. Hats off to you!.

Collapse
 
sudojayn profile image
Joan Ayissi Ndong

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. 🇨🇲