Skip to main content

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​

CapabilityWho uses itWhere
Daily quiet-time journal, memory verses with practice modes, offline Bible reader with notes and highlights, book questions and progressMen in the studyMobile app, web app
AI verse finder and meaning-based Bible searchMen in the studyMobile app, web app (backend: OpenAI + Qdrant)
Public website: ministry information, book store, conference registration, giving, resources and training videos, user accountsEveryoneWebsite
Contacts (CRM), groups, tags, regions and areas, interactive map, email campaigns, event management, store orders and inventory, resource publishingStaff and ambassadorsAdmin CRM
Payments for the store, events and donationsCustomers and donorsWebsite → Stripe → backend
Warehouse fulfilment of book ordersFulfilment 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:

WasNow
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 hostingCloudflare Pages / Workers (static apps), Azure (backend)
Separate donation processorsStripe donations on the website

Two design consequences follow from this and show up everywhere in the code:

  1. 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.
  2. 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.

RepositoryWhat it isStack
emaw-django-appThe backend: REST API, background jobs, integrationsDjango 5 + DRF, Celery, Redis, Qdrant, PostgreSQL, Docker Compose
emaw-websitePublic marketing site, store, events, donations, accountsReact 19, Vite, TypeScript, Tailwind 4, Sanity CMS (partial), Stripe
emaw-web-appBrowser version of the study appReact 18, Vite, JavaScript, Tailwind 4
emaw-crm-appStaff admin app ("EMAW Admin")React 19, Vite, TypeScript, TanStack Query, Leaflet, Recharts
emaw-mobile-appiOS and Android study appReact Native 0.88, Expo 58, EAS
emaw-documentationThis siteDocusaurus 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.