Work / Good Eggs

Good Eggs

One multi-tenant platform that gives a small charity its public website, a casework CRM, volunteer rotas and funder reporting.

Role
Product, design and engineering
Status
Live
Stack
Next.js, Postgres, Drizzle, Row-level security
The Good Eggs website

The problem

A volunteer-run family-support charity had a static website and its casework in a separate charity CRM, so enquiries, cases and the figures funders ask for lived in different places. Most small charities have the same gap, so the platform was built to host more than one.

What I did

  • •A block-based website editor with live preview that replaced the old static site, with every old address redirected to its new page.
  • •A staff CRM covering people, families, volunteers, cases, interactions, partners, referrals, donations and donated stock, fed directly by the website enquiry forms.
  • •Volunteer rotas and calendars, tasks with due dates, and case files kept in a private storage bucket with every download audited.
  • •Funder reporting on case outcomes, reach, income and volunteer time, plus one-use survey links and QR codes that let members score their own outcomes on a phone.
  • •An optional AI draft of the report narrative, written from the rounded figures only and never from member data.

How it works

One Next.js app on Postgres through Drizzle, deployed to Vercel in London, with images and case files in Google Cloud Storage. Each charity is a tenant, resolved from its own domain. Tenant tables use forced row-level security, and the app connects as a role that cannot bypass it. Staff sign in with Better Auth, and anyone with access to the CRM has to use an authenticator app. Vitest and Playwright run against real databases in CI.

Decisions and trade-offs

  • •Every test connects as the same non-superuser role as production, so a tenant-isolation mistake fails a test instead of passing silently.
  • •Children's names and birthdates are never stored, only counts per age band, and the form builder refuses a question that asks for them.
  • •Form submissions only fill empty fields on a matched person and never overwrite them, because anyone can type someone else's email address.
  • •The audit log records which fields changed and never their values, and sensitive notes are visible only to leads and the staff member who wrote them.

Where it stands

Built in October 2026 across close to 900 commits. Running in production for its first charity, ahead of moving to the charity's own domain.

Need this on your team?

I take contract roles as a senior product engineer. Tell me about the team and the work.