Side product · Church CRM
Flock
Every child known. Every absence followed up.
A phone-first CRM that runs a church’s Sunday school: attendance, home visits, follow-ups and moving kids up a class each year. It covers about 650 people across 29 classes.
Built solo: product, design and engineering.



- Children, servants and leaders
- ~650
- Classes, every week
- 29
- Roles, each with its own access
- 6
- Automated test files
- 260
The journey.
01
Idea
Everything lived in a Google Sheet. Nobody could take attendance at a busy door, visits weren’t recorded, and kids who stopped coming went unnoticed.
02
Spec
Mapped six roles, from child to priest, and wrote 16 short specs. Each one says the problem, the decision, and what’s left out.
03
Build
An Arabic-first Angular app with offline QR attendance, home visits with approvals, reports for servants, and passkey sign-in.
04
Migrate
Moved thousands of real attendance and visit records off Google Sheets without stopping the weekly service.
05
Iterate
98+ pull requests driven by servants' feedback, like one-tap WhatsApp messages for absent kids, offline visit logging and a health dashboard.
Product decisions.
- Security shouldn’t lock out real users
- Tying each account to one phone blocked more real members than strangers, and admins spent their time on recovery. I removed it and kept passkey sign-in.
- Sign-up that works with messy names
- Names on file rarely matched how people typed them, so a strict check sent members to an admin. I relaxed it and the bottleneck went away.
- The person who can check is the one who approves
- Family admins approve home visits because they actually know the families. Leaders further away could only rubber-stamp them.
- No automatic actions that can’t be undone
- Moving every child up a class can’t be reversed. A scheduled job ran before leaders had decided, so now someone reviews and confirms it.
- Monitoring without personal data
- Free hosting gives no logs, so I built a small health dashboard to catch failures. It never stores request bodies or personal IDs.
How I think about it.
- Design for the moment it’s used
- A servant at a church door with forty kids arriving can’t type names into a list, so Flock’s QR attendance works offline. Masroof had to log an item in under 10 seconds, in a store with weak signal.
- Remove what gets in the way
- In Flock I removed phone binding and a strict name check. Both sent real members to an admin instead of into the app. My Rashi skips sign-up entirely: a private link takes a couple straight to editing.
- Let the right person approve
- In Flock, only family admins approve home visits. They’re the ones who know the families.
Built with
- Angular
- PrimeNG
- PWA
- Node.js
- Express
- Prisma
- MongoDB
- Passkeys (WebAuthn)
- Cypress
How I build: I write the spec and the plan, AI coding agents write code against them, and nothing ships unless the tests pass.