Platform Blueprint · 2025

ChurchConnect

A full development blueprint — phases, modules, screens, schema, and exactly how to start building the frontend today.

8Phases
20+Modules
30+Screens
Phase 1Start Here

How to Start Building

Your Stack

Framework
Expo SDK 53+
React Native, Expo Router v4, New Architecture ON
Backend
Supabase
Auth, Postgres, Storage, Realtime, RLS
Styling
NativeWind v4
Tailwind CSS for React Native via Metro
Language
TypeScript
Strict mode, generated Supabase types
State
Zustand
Minimal global state — auth, user session
Video
expo-video
expo-av is deprecated in SDK 53+
Payments
Paystack
Phase 2 — church donations
Push
Firebase FCM
Phase 1 Module 9 — requires dev build

Step-by-Step Setup

01

Bootstrap the Expo Project

Create the app with a blank TypeScript template, then install all Phase 1 dependencies at once.

# Create project npx create-expo-app@latest ChurchConnect --template blank-typescript cd ChurchConnect # Core deps npx expo install expo-router @supabase/supabase-js npx expo install nativewind tailwindcss npx expo install expo-secure-store @react-native-async-storage/async-storage npx expo install react-native-url-polyfill expo-sqlite npx expo install react-native-reanimated react-native-safe-area-context npx expo install react-native-gesture-handler zustand # Video (not expo-av — deprecated) npx expo install expo-video # Image picker for avatar upload npx expo install expo-image-picker
02

Configure NativeWind v4

Three config files required — tailwind.config.js, metro.config.js, and global.css at root.

// tailwind.config.js module.exports = { content: ["./app/**/*.{js,jsx,ts,tsx}", "./components/**/*.{js,jsx,ts,tsx}"], presets: [require("nativewind/preset")], theme: { extend: { colors: { brand: { gold: "#C9A84C", dark: "#0F0D0A", cream: "#FAF6EE" } } } }, }; // global.css (root level) @tailwind base; @tailwind components; @tailwind utilities;
03

Connect Supabase

Create a Supabase project, grab the URL + publishable key, set env vars.

# .env (never commit this) EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=sb_publishable_xxx // lib/supabase.ts import 'expo-sqlite/localStorage/install'; import { createClient } from '@supabase/supabase-js'; export const supabase = createClient( process.env.EXPO_PUBLIC_SUPABASE_URL!, process.env.EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY!, { auth: { storage: localStorage, autoRefreshToken: true, persistSession: true, detectSessionInUrl: false, } } );
04

Set Up Folder Structure

Build this exact structure before writing any screen code. The architecture is what makes the project scalable.

ChurchConnect/ ├── app/ │ ├── (auth)/ ← unauthenticated screens │ │ ├── login.tsx │ │ └── register.tsx │ ├── (app)/ ← protected screens (tab navigator) │ │ ├── (tabs)/ │ │ │ ├── index.tsx ← Feed │ │ │ ├── explore.tsx ← Discover churches/pastors │ │ │ ├── create.tsx ← New post │ │ │ └── profile.tsx ← My profile │ │ ├── sermon/[id].tsx ← Sermon player │ │ ├── church/[id].tsx ← Church profile │ │ ├── pastor/[id].tsx ← Pastor profile │ │ └── user/[id].tsx ← User profile │ ├── _layout.tsx ← Auth guard lives here │ └── index.tsx ← Redirect to feed or login ├── components/ │ ├── ui/ ← Button, Input, Avatar, Card │ ├── feed/ ← FeedItem, SermonCard, PostCard │ └── shared/ ← Header, TabBar, LoadingSpinner ├── lib/ │ └── supabase.ts ├── hooks/ ← useFeed, useProfile, useFollows ├── store/ │ └── authStore.ts ├── types/ │ └── database.ts ← npx supabase gen types └── constants/ └── colors.ts
05

Build Module 1 First: Auth Screens

Register + Login are your entry point. Nothing else matters until a user can get in. Use Supabase Auth directly — no custom auth tables needed for Phase 1.

// app/(auth)/register.tsx — stripped pattern import { supabase } from '@/lib/supabase'; const handleRegister = async () => { const { error } = await supabase.auth.signUp({ email, password, options: { data: { name } } ← stored in auth.users metadata }); if (error) setErrMsg(error.message); }; // profiles table auto-created via Supabase trigger: CREATE OR REPLACE FUNCTION handle_new_user() RETURNS TRIGGER AS $$ BEGIN INSERT INTO profiles (id, name, email) VALUES (NEW.id, NEW.raw_user_meta_data->>'name', NEW.email); RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION handle_new_user();
06

The Build Order for Phase 1 (Strict)

Follow this exact module order. Each one unblocks the next.

Module 1 → Auth screens (Register, Login, Logout) Module 2 → Profile screen + edit (depends on auth users) Module 3 → Church & Pastor profiles (admin-seeded data) Module 4 → Sermon upload + video player (depends on Module 3) Module 5 → User post creation (depends on Module 2) Module 6 → Feed = sermons + posts merged, sorted by date Module 7 → Likes + Comments (depends on Module 6) Module 8 → Follow system (depends on Modules 2, 3) Module 9 → Push notifications (depends on all above)
07

Design System — Church Aesthetic

Define your brand tokens once in tailwind.config.js and use them everywhere. ChurchConnect should feel premium, warm, and trustworthy — not a generic social app.

// constants/colors.ts — reference these in className export const Colors = { gold: '#C9A84C', ← primary accent ink: '#0F0D0A', ← deep background cream: '#FAF6EE', ← primary text on dark surface: '#1A1714', ← card background border: '#2E2A24', ← subtle dividers muted: '#6B6560', ← secondary text }; // Example: Feed card <View className="bg-surface border border-border rounded-sm p-4"> <Text className="text-cream font-semibold">Sermon Title</Text> <Text className="text-muted text-sm">Pastor Name · Church</Text> </View>

Phase Roadmap

Click any phase to expand modules. Build only one phase at a time.

1
🟢 Start Here — MVP
Core Social & Content Foundation
Launch a fast, content-driven Christian platform users return to
9 modules
+
Phase Goal: A fully usable app with content, interaction, and a working retention loop. Real users can test it.
Module 01
User Access
Allow users to enter and secure their accounts
  • Register (name, email, password)
  • Login / Logout
  • Token-based auth (Supabase Auth)
🚀 "Users can access the platform securely"
Module 02
User Identity
Give users a personal presence inside the app
  • Profile page (name, bio, avatar)
  • Edit profile screen
  • Avatar upload (Supabase Storage)
🚀 "Users have identity in the system"
Module 03
Church & Pastor System
Introduce trusted, verified content sources
  • Admin creates churches (via Supabase Studio)
  • Admin assigns pastors to churches
  • Church profile page
  • Pastor profile page
🚀 "Platform has structured, trusted sources"
Module 04
Sermon Content
Deliver real value through video teachings
  • Admin uploads sermons
  • Video stored in Supabase Storage
  • Sermon listing screen
  • Video player (expo-video)
🚀 "App provides real value to users"
Module 05
Community Posts
Enable users to contribute content
  • Create text post screen
  • Post stored in Supabase (posts table)
  • My posts visible on profile
🚀 "Users participate, not just consume"
Module 06
Feed System
Create a central, engaging experience
  • Feed API endpoint / Supabase view
  • Merge sermons + user posts
  • Sort by latest (created_at DESC)
🚀 "App feels alive and engaging"
Module 07
Engagement
Enable interaction between users and content
  • Like system (likes table, polymorphic)
  • Comment system (comments table)
  • Like/comment counts on feed
🚀 "Users actively interact with content"
Module 08
Follow System
Personalize user experience
  • Follow/unfollow users, churches, pastors
  • Followers / Following lists
  • Follow-based feed filter (Phase 2)
🚀 "User experience becomes personalized"
Module 09
Notifications (Basic)
Bring users back to the app
  • Notification triggers (DB or edge function)
  • Firebase FCM push (requires dev build)
  • Notification screen (in-app list)
🚀 "Retention loop is activated"
Phase Outcome
Fully usable app. Content + interaction working. Ready for real users.
Phase Milestone
"Product is LIVE and usable"
2
🟦 After Phase 1 Validation
Utility & Real-Life Value
Extend the platform beyond content into real-world usefulness
3 modules
+
Phase Goal: Make the platform practically useful — donations, jobs, and events connect users to real-world church life.
Module 01
Donations
Allow users to financially support churches
  • Paystack / Flutterwave integration
  • Donation flow (select church + amount)
  • Transaction records in Supabase
🚀 "Platform enables financial support"
Module 02
Job Listings
Provide career opportunities in the Christian community
  • Job posting (admin/church)
  • Job listing screen
  • External application links
🚀 "Platform provides career value"
Module 03
Events
Connect users to real-world church activities
  • Event creation (admin)
  • Event listing screen
  • "Interested" / RSVP feature
🚀 "Platform connects online → offline"
Phase Outcome
Platform becomes useful beyond content consumption.
Phase Milestone
"Platform delivers real-life value"
3
🟩 Church Self-Service
Church Self-Service Platform
Allow churches to manage their presence independently
3 modules
+
Phase Goal: Remove the admin bottleneck. Churches get their own dashboard to upload sermons, post content, manage events and jobs.
Module 01
Church Dashboard
Give churches control over their account
  • Church login system (web portal or in-app)
  • Church profile management
  • Role: church_admin in profiles
🚀 "Churches are onboarded digitally"
Module 02
Content Management
Enable churches to create and manage content
  • Church uploads sermons directly
  • Church creates posts
  • Content tied to church profile
🚀 "Content supply becomes scalable"
Module 03
Activity Management
Allow churches to manage activities and opportunities
  • Manage their events
  • Manage their job listings
  • View donation history
🚀 "Platform becomes self-sustaining"
Phase Outcome
Reduced dependency on admin. Content flow scales independently.
Phase Milestone
"System scales without manual effort"
4
🟨 Revenue Engine
Monetization System — Ads
Create a structured revenue engine
2 modules
+
Phase Goal: Revenue generation — sponsored posts, featured placements, and content boost tools.
Module 01
Ads Engine
Enable paid visibility on the platform
  • Sponsored posts in feed
  • Featured church/pastor placements
🚀 "Visibility becomes monetizable"
Module 02
Promotion Tools
Allow users to boost their reach
  • Boost content feature
  • Highlight job/event listings
🚀 "Platform supports growth via payment"
Milestone
"Platform generates consistent income"
Key Tech
Paystack, sponsored_posts table, ad auction logic
5
🟥 Deepen Relationships
Community Expansion
Deepen user relationships and engagement
2 modules
+
Module 01
Messaging
Enable private communication
  • 1-on-1 chat (Supabase Realtime)
  • Message notifications
🚀 "Private interaction enabled"
Module 02
Groups
Create shared communities
  • Group creation
  • Group messaging + feed
🚀 "Network effects strengthen"
Milestone
"Platform becomes socially sticky"
Key Tech
Supabase Realtime channels, group_members table
6
🟪 Empower Creators
Creator Ecosystem
Empower creators to grow and monetize
2 modules
+
Module 01
Creator Analytics
Provide insights into content performance
  • Views tracking
  • Engagement stats dashboard
🚀 "Creators become data-driven"
Module 02
Monetization
Allow creators to earn from content
  • Paid/exclusive content
  • Support / tipping system
🚀 "Creator economy begins"
Milestone
"Creators see platform as opportunity"
7
🟫 Commerce
Marketplace & Services
Expand into commerce and services
2 modules
+
Module 01
Marketplace
Enable buying/selling of Christian resources
  • Product listings
  • Purchase system (Paystack)
🚀 "Platform supports commerce"
Module 02
Services
Provide access to counseling & mentorship
  • Service listings
  • Booking system
🚀 "Platform supports life services"
Milestone
"Platform becomes multi-functional"
8
⚫ Full Vision
Music Streaming Platform
Become a full Christian content hub
2 modules
+
Module 01
Artist System
Introduce music creators
  • Artist profiles (like pastor profiles)
  • Artist follow system
🚀 "Music ecosystem begins"
Module 02
Music Streaming
Enable music consumption
  • Music upload (Supabase Storage)
  • Audio player (expo-audio)
  • Playlists
🚀 "Platform becomes full content hub"
Milestone
"Platform reaches full vision"
Key Tech
expo-audio, tracks table, playlists table

Screen Map

Every screen you need to build, mapped to its phase and module. Phase 1 is your entire scope for now.

Phase 1
Register
Module 1 · Auth
Phase 1
Login
Module 1 · Auth
Phase 1
My Profile
Module 2 · Identity
Phase 1
Edit Profile
Module 2 · Identity
Phase 1
Church Profile
Module 3 · Churches
Phase 1
Pastor Profile
Module 3 · Pastors
Phase 1
Sermons List
Module 4 · Content
Phase 1
Sermon Player
Module 4 · Content
Phase 1
Create Post
Module 5 · Posts
Phase 1
Feed (Home)
Module 6 · Feed
Phase 1
Post Detail
Module 7 · Engagement
Phase 1
Comments Sheet
Module 7 · Engagement
Phase 1
Followers List
Module 8 · Follows
Phase 1
Following List
Module 8 · Follows
Phase 1
Notifications
Module 9 · Notifs
Phase 1
Discover / Search
Module 3+8 · Explore
Phase 2
Donate
Module 1 · Donations
Phase 2
Job Listings
Module 2 · Jobs
Phase 2
Job Detail
Module 2 · Jobs
Phase 2
Events List
Module 3 · Events
Phase 2
Event Detail
Module 3 · Events
Phase 5
Messages List
Module 1 · Chat
Phase 5
Chat Thread
Module 1 · Chat
Phase 5
Groups List
Module 2 · Groups
Phase 8
Music Player
Module 2 · Music
Phase 8
Artist Profile
Module 1 · Artists

Phase 1 — Bottom Tab Navigator

Tab 1
Home
Feed — sermons + posts merged, sorted by latest
Tab 2
Explore
Search churches, pastors, and users. Browse sermons.
Tab 3
Create
Quick post creation — text + optional image
Tab 4
Profile
My posts, my follows, edit profile

Database Schema

Phase 1 Supabase schema. Build this before writing screen code — it's the foundation everything sits on.

👤profiles
idPK · FK auth.users
nametext
biotext
avatar_urltext
roleenum: user/admin/church_admin
created_attimestamptz
churches
idPK · uuid
nametext
biotext
cover_urltext
locationtext
created_attimestamptz
🎤pastors
idPK · uuid
nametext
biotext
avatar_urltext
church_idFK churches.id
created_attimestamptz
🎬sermons
idPK · uuid
titletext
descriptiontext
video_urltext
thumbnail_urltext
church_idFK churches.id
pastor_idFK pastors.id
created_attimestamptz
📝posts
idPK · uuid
user_idFK profiles.id
bodytext
image_urltext · nullable
created_attimestamptz
❤️likes
idPK · uuid
user_idFK profiles.id
target_iduuid · polymorphic
target_typeenum: post/sermon
created_attimestamptz
💬comments
idPK · uuid
user_idFK profiles.id
target_iduuid · polymorphic
target_typeenum: post/sermon
bodytext
created_attimestamptz
follows
idPK · uuid
follower_idFK profiles.id
target_iduuid · polymorphic
target_typeenum: user/church/pastor
created_attimestamptz
🔔notifications
idPK · uuid
user_idFK profiles.id
typeenum: like/comment/follow/sermon
actor_idFK profiles.id
target_iduuid · nullable
readboolean · default false
created_attimestamptz
📱push_tokens
idPK · uuid
user_idFK profiles.id
tokentext · unique
platformenum: ios/android
created_attimestamptz
Key: Feed Merge View

The feed requires a Postgres view or edge function that merges sermons + posts into a single timeline sorted by created_at DESC. Create this as a Supabase view:

CREATE VIEW feed_items AS SELECT id, 'sermon' AS item_type, title AS content, thumbnail_url AS image, created_at, church_id AS source_id FROM sermons UNION ALL SELECT id, 'post' AS item_type, body AS content, image_url AS image, created_at, user_id AS source_id FROM posts ORDER BY created_at DESC;