All projects
minds-cover

MINDS Alumni Network

MINDS Alumni Network

01

Overview

Project name

MINDS Alumni Network

MINDS Alumni Network

One-line description

A pan-African, CMS-driven community platform connecting MINDS scholars and alumni across Africa and the diaspora, complete with an AI assistant that answers questions grounded in MINDS' own content.

My role

Sole product designer & full-stack engineer (design, frontend, backend, CMS modelling, AI integration, deployment)

Timeline

2026 (~3 months, ongoing iterations)

Category

Platform · Community & AI

Platforms

Web · Vercel (Edge + Serverless)

Tech stack

React 18TypeScriptViteTailwind CSS v4Sanity CMSVercel EdgeStripeGoogle GeminiAI SDK v6Upstash VectorRAG

02

The Problem

The MINDS (Mandela Institute for Development Studies) Scholarship Programme has produced a growing network of alumni spread across the African continent and beyond, but they lacked a shared digital home. There was no central place for alumni to discover one another, surface opportunities, celebrate achievements, follow news and events, or engage new prospective scholars. Information about MINDS Africa and the scholarship was scattered across documents and web pages, making it hard for visitors to get quick, reliable answers. The organisation also needed to update all of this content themselves, without depending on a developer for every copy or image change.

03

The Solution

I designed and built a modern, content-managed marketing and community website that acts as the network's digital hub. Every meaningful piece of content, page copy, images, regions, events, gallery, alumni ventures, modals, and even SEO metadata, is editable by non-technical staff through Sanity Studio. To solve the scattered information problem, I added a Retrieval-Augmented Generation (RAG) chatbot, an Alumni Assistant trained on MINDS' own content (CMS entries, curated knowledge documents/PDFs, and selected pages from minds-africa.org). It gives visitors instant, grounded answers about the programme, regions, events, and how to get involved, instead of forcing them to hunt through pages.

04

Key Features

  • Fully CMS-driven site

    All pages, imagery, and content blocks are editable in Sanity with sensible code fallbacks.

  • AI Alumni Assistant (RAG chatbot)

    Streaming, source-grounded answers scoped strictly to MINDS topics, with suggested prompts and graceful guardrails.

  • Interactive Africa scholars map

    SVG map of Africa with per-country hover tooltips showing alumni counts, driven by CMS data.

  • Stripe donations

    In-app embedded checkout modal, no full-page redirect.

  • Newsletter capture

    Scroll-triggered subscribe modal timed to the Stories From Our Alumni section.

  • Alumni ventures & employers

    Toggleable, editable showcase of companies alumni founded vs. companies they work at.

  • Regions, events, gallery, news

    Structured, filterable content sections.

  • SEO & discoverability

    Per-page meta/Open Graph/Twitter tags, JSON-LD, sitemap, and robots.txt.

  • Polished UI

    Glassmorphism, theme-aware navigation, and motion-based micro-interactions.

05

Technical Implementation

Architecture

Single-page React application (Vite + TypeScript) deployed on Vercel, with headless Sanity CMS as the content backend and serverless/edge functions handling server-side concerns (payments, chat, knowledge ingestion). Content is fetched client-side via GROQ queries with a caching/prefetch layer.

Backend

Vercel functions: /api/chat (Edge RAG pipeline with streaming answers), /api/ingest (protected Node function with weekly Vercel Cron for re-indexing), Stripe checkout session endpoint for donations. A local Vite dev plugin proxies /api routes for development parity.

Frontend

React 18 + TypeScript with React Router. Tailwind CSS v4; Motion for animations. Reusable data hooks wrap Sanity queries; snapshot cache and prefetch keep navigation fast. Custom components include the Africa map wrapper (DOM tooltips over react-africa-map SVG) and the chat widget.

Database

Sanity CMS is the source of truth for all editorial content, with custom schema types and a tailored Studio desk (including a Chatbot knowledge section). Upstash Vector stores embeddings for the chatbot knowledge base; Upstash Redis backs optional rate limiting.

APIs / Integrations

Google Gemini via AI SDK v6 (@ai-sdk/google), gemini-2.5-flash for chat and gemini-embedding-001 for embeddings. Stripe embedded checkout for donations. cheerio + pdf-parse for crawling web pages and extracting PDF text during knowledge ingestion.

Infrastructure

Hosted on Vercel (static frontend + Edge/Serverless functions), auto-deployed from GitHub on push to master. Environment-based secrets for Gemini, Upstash, Stripe, and Sanity. Vercel Cron keeps the chatbot index in sync with CMS updates.

06

Challenges & Solutions

  • Grounding the chatbot in MINDS-only knowledge

    Built an ingestion pipeline pulling from Sanity, editor-uploaded PDFs/knowledge docs, and selected external pages, chunk, embed, and upsert into Upstash Vector. At query time retrieve relevant chunks and constrain the model with a scoped system prompt; tuned the prompt to strip unwanted in-text citation markers.

  • Provider migration mid-build

    The chatbot originally ran on OpenAI but hit quota limits. Because it was built on the AI SDK's provider-agnostic abstraction, migrated the entire chat + embeddings stack to Google Gemini with minimal changes, keeping embedding dimensions compatible with the existing vector index.

  • Serverless functions in local dev

    Vite doesn't natively serve Vercel's /api routes, so the chatbot 404'd locally. Wrote a custom Vite dev plugin that intercepts /api requests, loads env vars, and executes the actual function handlers, true parity between local and production.

  • Production-only outage after adding env vars

    Live chatbot failed with a generic error even though keys were set in Vercel. Diagnosed that Vercel bakes env vars in at build time, so the running deployment predated the new keys. Triggering a fresh deploy resolved it; verified by hitting the live streaming endpoint directly.

  • Empowering non-technical editors

    Modelled everything in Sanity with fallbacks so staff can safely edit copy, imagery, toggles, and even the chatbot knowledge base without touching code.

07

Results

Shipped a live production platform at alumni.minds-africa.org serving as the MINDS Alumni Network's central hub. Delivered a working, source-grounded AI assistant that streams answers about MINDS in real time. Handed the organisation full content autonomy, virtually every element is CMS-editable, with a self-updating chatbot knowledge base via scheduled re-indexing. Made the site search-discoverable with complete SEO metadata, sitemap, and structured data.

08

What I Learned

  1. 1.Provider-agnostic abstractions pay off. Building the AI layer on the AI SDK made swapping OpenAI for Gemini a low-risk change instead of a rewrite, design around interfaces, not vendors.
  2. 2.RAG quality is mostly a data + prompt problem. The hardest parts weren't the model calls but curating sources, chunking sensibly, and tightening the system prompt to keep answers grounded and on-brand.
  3. 3."Works locally" needs deliberate parity. Investing in a dev plugin for serverless routes and understanding build-time vs. runtime env vars prevented an entire class of confusing production-only bugs.
  4. 4.Content modelling is a product decision. Thinking through what editors need to change, and providing fallbacks, turned the site from a static build into a tool the organisation actually owns.

09

Links

LET'S WORKTOGETHER

I design and ship production-ready systems at the intersection of cloud infrastructure, full-stack engineering, and human-centred product thinking.

Send email · kuzagbechristopher@gmail.com