Grace Hub
Church youth ministry SaaS for Android, iOS, and Web PWA. 24+ screens covering Bible reader (with TTS), real-time chat, events with QR check-in, gamification, POS with barcode scanner, and multi-org architecture. Active build — multiple features shipped, some still in progress.
What it is
Church youth ministry SaaS for Android, iOS, and Web PWA — built in Flutter / Dart with Supabase. 24+ screens covering Bible reader (with TTS), real-time chat, events with QR check-in, gamification (points / levels / badges), POS with barcode scanner, and multi-org architecture. Active build for House of Grace & Favour International Ministries (HGF) as the founding church on the Enterprise tier.
The problem
Church platforms are either too generic ("any community") or built for the megachurch in mind (per-seat licensing that excludes everyone else). A youth ministry needs the bible, events, prayer requests, finance, AND a cool-enough UX that teenagers actually open it on their phones.
What I built
Multi-org architecture
Each church is a tenant with its own Supabase RLS scope; users can belong to multiple orgs (e.g., a youth pastor at two campuses). HGF auto-provisions on the Enterprise tier via a DB trigger.
Real-time + offline
Supabase Realtime for chat, events RSVPs, and live leaderboard updates. Hive for the Bible cache so the reader works offline (you need scripture in church even when WiFi is congested).
Gamification done seriously
Points, levels, badges, leaderboards — but tied to genuine engagement (attended events, completed Bible readings, prayer streaks), not vanity metrics. Designed with the youth pastors so it reinforces the ministry's actual goals.
POS module
Cart, barcode scanner via mobile_scanner, PDF receipts. Lets churches sell merch and ministry materials at events without a separate Square/Shopify subscription.
Engineering decisions
Why Flutter over React Native
Flutter's rendering pipeline and Dart's typing made the 24+ screens consistent across Android and iOS without per-platform tweaks. Riverpod plus go_router gave a state + navigation story I could reason about as the surface grew.
Why Supabase over Firebase
Postgres + RLS lets me reason about multi-tenant access at the data layer, not in app code. RLS bugs are visible in tests; Firestore rule bugs are easier to ship.
Per-org Enterprise tier via DB trigger
HGF gets the enterprise feature set as soon as their org is created — no manual flag-flipping. The trigger lives in migrations so the entitlement is reproducible across environments.
What I'd do differently
Lock the navigation depth earlier. Flutter's go_router shines with a flat structure but I have a few four-level-deep paths that should have stayed at three. Refactoring is on the backlog before App / Play Store submission.