connect.gracechurch.org and
riverside.connect.app are the same build with different
identities.
Configurable per church: Features live in one registry — Events, Announcements, Sermons, Prayer, Leadership, Small Groups, and Meals. A church turns features on by listing their keys and can rename any of them (e.g. "Meals" → "Potlucks"). Nothing is hard-coded to one congregation.
How it was built: React 19 + Vite. The active tenant is resolved at mount time (explicit override → subdomain → query param → default). The data layer is swappable: it runs on local storage out of the box, and the same interface can be pointed at a real API/Supabase backend without changing the app. It ships two entry points — a standalone SPA and an embeddable widget.