Platform overview
Every Man A Warrior (EMAW) is a men's discipleship ministry (a ministry of TWR) built around a four-book Bible study curriculum: daily quiet times, Scripture memory, weekly discussion questions and small groups. The technology platform supports both the men going through the study and the staff who run the ministry.
What the platform does
| Capability | Who uses it | Where |
|---|---|---|
| Daily quiet-time journal, memory verses with practice modes, offline Bible reader with notes and highlights, book questions and progress | Men in the study | Mobile app, web app |
| AI verse finder and meaning-based Bible search | Men in the study | Mobile app, web app (backend: OpenAI + Qdrant) |
| Public website: ministry information, book store, conference registration, giving, resources and training videos, user accounts | Everyone | Website |
| Contacts (CRM), groups, tags, regions and areas, interactive map, email campaigns, event management, store orders and inventory, resource publishing | Staff and ambassadors | Admin CRM |
| Payments for the store, events and donations | Customers and donors | Website → Stripe → backend |
| Warehouse fulfilment of book orders | Fulfilment partner (United Fulfillment Solutions) | Backend → Deposco |
Why it was built this way
The platform is the outcome of the EMAW Technology Modernization Initiative, which consolidates functions that used to live in separate paid services into one system the ministry owns:
| Was | Now |
|---|---|
| UltraCart (store) | Website store + Stripe + Deposco |
| Planning Center (contacts, registrations) | Admin CRM + events in the backend |
| Mailchimp (email) | Campaigns in the Admin CRM via Azure Communication Services |
| Firebase hosting | Cloudflare Pages / Workers (static apps), Azure (backend) |
| Separate donation processors | Stripe donations on the website |
Two design consequences follow from this and show up everywhere in the code:
- The CRM is the system of record for people. Every purchase, registration and donation on the website creates or updates a CRM contact (after payment, never before), so staff see one history per person.
- Contacts are not app users. The mobile and web apps have their own accounts, stored with hashed emails. A contact can be linked to an app user, but the two are separate records with separate privacy rules.
The initiative's roadmap targets controlled production testing in early 2027 and a public launch in May 2027, with legacy services kept as a fallback until then.
The six repositories
All live in the GitHub organisation Every-Man-A-Warrior and are private.
| Repository | What it is | Stack |
|---|---|---|
| emaw-django-app | The backend: REST API, background jobs, integrations | Django 5 + DRF, Celery, Redis, Qdrant, PostgreSQL, Docker Compose |
| emaw-website | Public marketing site, store, events, donations, accounts | React 19, Vite, TypeScript, Tailwind 4, Sanity CMS (partial), Stripe |
| emaw-web-app | Browser version of the study app | React 18, Vite, JavaScript, Tailwind 4 |
| emaw-crm-app | Staff admin app ("EMAW Admin") | React 19, Vite, TypeScript, TanStack Query, Leaflet, Recharts |
| emaw-mobile-app | iOS and Android study app | React Native 0.88, Expo 58, EAS |
| emaw-documentation | This site | Docusaurus 3 |
See Repositories for branches, package names and deploy targets, and Architecture for how they talk to each other.
Where things run
- Azure hosts the backend and the PostgreSQL databases (nonprofit credits cover the cost). Dev and prod are separate resource groups.
- Cloudflare hosts every static app (Pages and Workers), the R2 bucket for resource media, the tunnels that expose the backend, DNS, and the Access policies that protect internal sites.
- Tailscale is the only way to reach the dev database or SSH into the VMs.
Details: Environments.