CASE STUDY — WEB DEVELOPMENT

Building CFOLD: a web app from a blank page.

Most of what we build starts with a client's brief. CFOLD started with ours: a church management system that keeps a church's people, families, serve-team rosters, services, attendance, giving and prayer requests in one place, and works on any phone. We took it from an empty repository to a live, multi-church product in about two months.

Client MurFx (our own product)
Services GUI Design, Web Development
Timeline Aug – Oct 2026
Live site cfold.org ↗
CFOLD's Today dashboard on a dark background CFOLD's roster grid with serve teams across six Sundays CFOLD's attendance register and shared roster on two phones
THE BRIEF

Church admin lives in spreadsheets, group chats and one person's memory.

Rosters get lost in WhatsApp groups, nobody notices a family drifting away until it's been three months, and prayer requests written on cards are never followed up. We set out to replace all of that with one shared system for pastors, administrators, ministry leaders, door greeters and finance and prayer teams, while volunteers and the congregation use the parts they need without ever creating an account.

Two decisions came first. We would build it from scratch rather than adapt an existing church platform, and it would be a paid, multi-church product from week one: every church its own tenant, with four roles and email invites built in from the start.

CFOLD roster grid showing worship, media, ushering and pastoral teams, with double bookings flagged
BUILT AROUND SUNDAY

One event hub, from Tuesday's plan to Monday's review.

The first weeks built the core records: people, households, small groups and serve teams. From there, features landed in quick succession, then came together around the way a church actually runs a week:

  • An order of service with times and who leads each part.
  • A roster grid, rebuilt to match a Figma wireframe, that flags double bookings.
  • Day-before reminder emails with a one-tap calendar file.
  • A register greeters take at the door, and an evaluation that feeds the next plan.
CFOLD attendance register on a phone
PHONE-FIRST

A dense admin tool that genuinely works in one hand.

Greeters take the register on their phones, so "works on mobile" had to mean the real thing. We rebuilt the app route by route, and each page joined the phone version only once it genuinely worked there: a labelled bottom tab bar, bottom sheets instead of dropdowns, one date at a time on the roster, 44px tap targets, and fixes for iOS zoom and double date pickers, all measured at real phone widths. Every everyday screen now works on a phone. Only CSV import and the provider control centre are left to a laptop.

UNDER THE HOOD

A modern stack, tuned to run on shared hosting.

  • Front end — Next.js 16 (App Router) with React 19 in TypeScript, and Tailwind CSS for the app. The marketing site and help centre live inside the same app, so links churches had already shared never broke.
  • Back end — server components and Server Actions with no separate API server, Prisma over MariaDB, and every query scoped to the signed-in church through one session helper, with access rules in one permissions file.
  • Accounts and email — Auth.js email-and-password sign-in, plus invites, receipts, reminders and password resets sent from hello@cfold.org.
  • Deployment — a push to main builds and deploys automatically, and hourly jobs (reminders, small-group check-ins, trial expiry) run from an external scheduler calling a protected URL, because the hosting plan has no cron.
  • Three languages — English, Sinhala and Tamil. The church picks the language, so everyone in one church sees the same screens.
THE HARD PARTS

The problems worth writing down.

  • Next.js on shared hosting — production builds kept crashing under the host's limits. We pinned the build to a single CPU worker, switched it to webpack, capped the database connection pool and cached the database client properly.
  • Sign-in that survives a busy server — authentication used to look up the database on every request, so a struggling server could sign everyone out. We removed that lookup so sign-in only verifies the session, and errors now say what actually went wrong.
  • Keeping every church's data apart — many churches share one database, so church scoping and permissions each live in exactly one place rather than being repeated query by query.
  • Time zones — the server runs on UTC but churches don't, so every "which day is it?" question is answered in the church's own time zone.
  • Duplicates and guessable links — the app refuses to create a second record for someone already on file and lets admins merge existing pairs safely, and shared public links moved to short random codes while old links keep working.
WHAT WE LEFT OUT

A first version that knows what it isn't.

Shipping fast meant saying no on purpose. There's no native app, because it's a phone-friendly web app instead. There's no online billing yet, no WhatsApp API (click-to-chat links do the job for now) and no AI features. Pricing is one monthly plan with no per-member fees, and a yearly plan was offered and deliberately withdrawn. Some features were built and then removed after feedback from the pilot church, including a pastoral notes area, a separate Pastor role and a QR code for the register.

CFOLD insights page with attendance trends and newcomer retention
LAUNCH

476 commits, about two months.

  • Aug 2026 — first commit on 9 August, live on its production host within days.
  • Sep 2026 — moved to cfold.org, renamed from its working name to CFOLD, and opened a public website with pricing and a help centre.
  • Oct 2026 — a 14-day free trial, Sinhala and Tamil, day-before reminder emails and the official logo.
THE RESULT

A MurFx product, live at cfold.org and still growing.

Next up: online payments and subscriptions, the rest of the app in Sinhala and Tamil, notifications beyond email, and event registration.

MORE CASE STUDIES

Explore more work.

GET IN TOUCH

Need a web app built from scratch?

Tell us what you're building and we'll get back to you.