Ibeji Foundation website - Direct help, lasting impact. Supporting families and communities across Nigeria through school feeding, renovations, scholarships, and urgent aid.
# Ibeji Foundation (Next.js + TypeScript + Tailwind)
Production-ready nonprofit site with a donate-first UX.
## Tech
- Next.js 15.5.0 (App Router), React 18, TypeScript
- Tailwind CSS, Vercel Analytics
- Jest for utils
- Payments: Paystack (hosted checkout)
## Requirements
- Node 18/20+, Bun ≥ 1.1
## Setup
1. Install deps
- `bun i`
2. Env vars
- Copy `.env.example` to `.env.local` and set as needed:
- `NEXT_PUBLIC_SITE_URL` (
localhost for local)
- `PAYSTACK_PUBLIC_KEY` (optional for local)
- `PAYSTACK_SECRET_KEY` (required for payments)
- `PAYSTACK_MONTHLY_PLAN_CODE` (for monthly subscriptions)
- `RESEND_API_KEY` (optional; enables receipts + contact email)
- `CONTACT_TO_EMAIL` (optional; default contact@ibejifoundation.org)
- `NEXT_PUBLIC_PLAUSIBLE_DOMAIN` (reserved)
## Run
- Dev: `bun dev`
- Typecheck: `bun run typecheck`
- Lint: `bun run lint`
- Tests: `bun test`
## Payments (Paystack)
- Flow:
- Client POSTs to `/api/payments/paystack/init` with `{ amount, email, monthly }`.
- Server initializes transaction and returns `authorization_url`.
- Browser redirects to Paystack hosted checkout.
- Paystack redirects back to `/donate/thanks?amount=...&reference=...`.
- Thanks page calls `/api/payments/paystack/verify?reference=...` to confirm.
- On success, server logs and (if `RESEND_API_KEY`) emails a receipt.
- Optional webhook: configure Paystack to POST events to `/api/payments/paystack/webhook` for an additional backstop on receipts.
## Pages
- `/` Home (hero, stat bar, why‑give, stories, projects, CTA)
- `/donate` Donate (presets, custom, one-time/monthly)
- `/donate/thanks` Receipt page
- `/projects` Projects and collaborations (curated previews)
- `/galleries` Full photo galleries by category (from CSV/manifest)
- `/impact` Impact metrics + methodology
- `/news` list and `/news/[slug]` article (MDX in `content/news/`)
- `/about`, `/contact` (+ `/api/contact`)
- `/privacy`, `/terms`
## SEO & Images
- robots disallows `/api/*`, `/admin/*` …