Replacing a church's manual WhatsApp attendance count with a tool the staff actually kept using.
Stack — Vanilla JS, Supabase (Postgres, Auth, Edge Functions), Resend, Cloudflare Turnstile, GitHub Pages
Hope Church Adelaide runs two Sunday services. Every week, someone had to add up attendance across both by hand and type the totals into a WhatsApp message so the rest of the team could see them. There was no history, no way to search for a name from a few weeks back, and no way for two people counting the same service to know if they'd double-counted a row.
The easiest way to get people to switch tools is to not make them learn a new one. Headcount's import parser matches the three WhatsApp message formats staff were already typing, so the switch from the old process was basically invisible — paste the message you'd normally send, and it's imported.
The rest is a multi-area form with live auto-calculating totals, a tap-to-count modal for the people on the door, and one-tap WhatsApp message generation so the output still looks like the message everyone was already used to reading.
Shipping it wasn't the end. Two counters working the same service kept independently losing track of who'd counted which row, so I added live paired-counting — both counters now see each other's tallies update in real time. A pastor asked for a way to spot who hadn't been in for a while, so I built a searchable attendance lookup. Someone else wanted a breakdown by week, month, and year instead of a running total, so that became its own stats view.
I also added Google SSO and a privileged-accounts system, so the people on the door can use the app day to day without being able to touch the settings that could break it for everyone else.
Vanilla JS, HTML, and CSS, with Supabase for the database, auth, and edge functions, deployed on GitHub Pages. No framework — the app is small enough that a build step would have cost more than it saved, and GitHub Pages' static hosting doesn't need one.