A digital platform for a Nigerian healthcare NGO — built pro bono, serving real users.

Overview
OUNUU Health Alliance is a Nigerian non-profit delivering community health services. They had no digital presence, no way to receive online donations, and no system for managing their operations. I built their entire web platform pro bono — from zero to deployed.
The Problem
The organisation was running entirely on manual processes. No website meant no visibility, no credibility with potential donors, and no way to accept donations outside of direct bank transfers. For an NGO dependent on public trust and donor funding, this was a serious barrier to impact.
My Role
Solo developer for the full engagement. I handled frontend, backend, payment integration, admin dashboard, SEO, and Google Ads — everything from first commit to Google indexing.
Technical Decisions
Next.js 15 (for SEO)
An NGO lives or dies by its ability to appear credible online. Next.js 15's server-side rendering ensures every page is fully indexable by Google — critical for appearing in search when donors look for health-focused Nigerian NGOs to support.
MongoDB (for content flexibility)
The platform needed to manage health programme listings, blog posts, and team profiles — content types that vary in shape and grow over time. MongoDB's document model made it straightforward to add new content types without schema migrations.
Paystack (for donations)
Paystack is the most trusted and widely integrated payment provider in Nigeria. Using it for the donation flow — rather than redirecting to a third-party fundraising page — kept donors on the platform and gave the organisation full ownership of donor data.
shadcn/ui + Framer Motion (for credibility)
An NGO's website must look trustworthy. Donors and partners make split-second judgments. shadcn/ui provided accessible, polished components and Framer Motion added subtle animations that elevated the interface beyond a basic template.
Challenges
Next.js 15 dynamic route param typing
Next.js 15 changed how dynamic route params are typed — from synchronous to asynchronous — and the documentation hadn't fully caught up when I was building. I debugged this by reading the Next.js GitHub changelog and release notes directly, then updated every dynamic route handler in the codebase.
Auth bug on /api/admin/me
The admin authentication route was silently failing in production — returning 401s on valid sessions. I traced it to a JWT validation issue where the token secret was being read before environment variables were fully initialised in the serverless context. Fixed by ensuring the secret was read inside the handler function, not at module level.
Hydration mismatches with Framer Motion
Framer Motion animations triggered hydration errors because animation states initialised differently on the server versus the client. Solved by wrapping animated components in a useEffect-gated conditional that only renders the animated version after hydration.
Production SEO setup from scratch
My first full SEO implementation on a production site. I set up Google Search Console, generated a dynamic sitemap.ts, configured robots.ts, and created Open Graph images for social sharing — all from scratch. I also wrote and deployed Google Ads copy for the NGO's campaigns.
Results
Platform live on Vercel. Accepting real Paystack donations. Admin dashboard operational. Site indexed on Google with proper SEO structure — sitemap, robots, and OG tags. Google Ads live and running.
Retrospective
I'd run a content-readiness checklist with the client before development starts. Several pages launched with placeholder text because the NGO's written content wasn't ready — and retrofitting copy into a live site is messier than building with final content from the start. I now treat content as a deliverable with its own deadline.