Client Project
Hereafter Ghana: Nonprofit Website, Donations & Admin CMS
The public website and admin CMS for a Ghanaian nonprofit: online donations and recurring giving, a Zakat calculator, blog, newsletters, careers, and a full back-office for non-technical staff.

Overview
Hereafter Ghana is a full-stack platform for a Ghanaian nonprofit: a fast, SEO-friendly public website for supporters and a complete content-management dashboard for staff to run the organisation, all from one codebase. I built it end to end as two services, a Next.js 16 / React 19 frontend and a TypeScript + Express REST API, backed by PostgreSQL. The public site covers programs, impact, a blog, reports, cases, a photo gallery, careers and volunteering, a newsletter, and one-time and recurring donations, plus a Zakat and Tithe calculator to help supporters work out their giving. Behind a login, non-technical staff manage every piece of content on the site without touching code.
The Problem
The organisation needed more than a brochure website. It needed to accept donations online (including recurring, mobile-money giving), grow and communicate with an audience, publish stories and reports, recruit staff and volunteers, and give Muslim supporters a trustworthy way to calculate their Zakat, all managed by a small non-technical team. Off-the-shelf tools couldn't tie those pieces together, keep content fresh, or send newsletters reliably at scale, and hand-editing the site for every update was not sustainable.
The Solution
The solution I designed the platform as two cooperating services. The Next.js frontend serves server-rendered public pages with on-demand revalidation so content goes live the moment staff publish, and a /dashboard back-office built with shadcn/ui, Redux Toolkit, and TanStack Table for managing every content type: posts, programs, reports, team, gallery, hero slides, FAQs, testimonials, impact stats, and more. Editors write articles in a rich-text editor and build newsletter campaigns with a drag-and-drop email builder. The Express API owns content, auth, and communications. It uses JWT access and refresh tokens with httpOnly cookies and role-based access control, Prisma over PostgreSQL, and Cloudinary for media. Heavy work runs off the request path on a pg-boss background worker: transactional email, bulk newsletter delivery with per-recipient logging and a suppression list, and a scheduled job that refreshes live gold and silver prices (via GoldAPI) so the Zakat Nisab threshold is always current. Donations and donor records are delegated to a separate Donor Management System, with mobile-money channels (e.g. Hubtel) detected automatically at checkout. Contact and application forms are hardened with rate limiting, Cloudflare Turnstile, profanity filtering, and honeypot checks.
