Congregation directory
Districts and assemblies with leaders, contacts and coordinates, searchable and plotted on an interactive map so someone can find the nearest congregation.
Platform · Infrastructure
Not just a church website. A digital platform for a national denomination in Mozambique — thousands of assemblies across districts, a shop, recruitment, pastoral care and a full admin console, running on infrastructure we provision and maintain.
Visit ada.org.mzThe brief
A denomination this size runs on knowledge that mostly lives in people's heads: which assemblies exist in which district, who leads them, how to reach them, what is happening this month, who has applied to serve, who has asked for prayer or called the helpline.
They needed one system that members and the public could use and that administrators could actually run — fully bilingual in Portuguese and English, on connections and devices that are not a fibre line and a new laptop.
What we built
Districts and assemblies with leaders, contacts and coordinates, searchable and plotted on an interactive map so someone can find the nearest congregation.
Product listings, cart, checkout and order history — a full commerce path inside the platform rather than bolted on elsewhere.
Registration, login, one-time-password verification and recovery, built for people whose most reliable channel is a phone number.
Applications for roles, reviewed and progressed by administrators through to a formal offer, tracked in-platform.
Confidential requests routed to the right people, with the access control that sensitivity implies.
News with individual pages, a maintained FAQ and a media library — all editable without a deploy.
Fifteen areas covering the whole operation — users, candidates, messages, live chat, prayers, helpline, updates, FAQ, decisions, media and media approval, analytics, activity logs, history, API health and site configuration. The console is the actual product; the public site is what it renders.
Media goes through an approval queue rather than publishing directly. When contributors across many assemblies can upload, the question stops being “can they publish?” and becomes “who signed off on this appearing under the denomination's name?”
Architecture
The database and application servers are never exposed to the internet. nginx terminates TLS and everything else talks over the internal network.
ada ▸ stack
Internet
│ 443 / 80
▼
nginx TLS termination · static & media volumes
│ ▲
│ └── certbot Let's Encrypt renewal
┌───────┴────────┐
▼ ▼
frontend backend
Next.js Django + DRF
:3000 internal gunicorn :8000 internal
│ │
│ ▼
│ PostgreSQL 15 bound to 127.0.0.1 only
│
└── server-side proxy credentials attached server-side,
target checked against a domain allowlistThe browser never calls the API directly. Requests go to Next.js server routes that attach credentials and forward on — and the proxy validates the target against an explicit allowlist before it will fetch anything, so a crafted url parameter cannot turn the server into an open relay.
The harder parts
Both application containers carry explicit CPU and memory limits — half a core each, 512MB for Django, 1GB for Next.js — and the server needed a swap file before Next.js would build at all. Deploying to a constrained VPS teaches you exactly what each process costs.
Certbot runs alongside nginx sharing the challenge and certificate volumes, so TLS renews without anyone remembering. On a self-hosted stack an expired certificate is a total outage, and it happens on the day nobody is watching.
One scripted path: commit, push, pull, rebuild the affected containers, migrate, collect static, restart. Scripting it is what makes a fix at 11pm safe — the risky step is never the code, it is the half-remembered command sequence.
The platform runs fully in Portuguese and English — over a thousand translated strings behind a language switcher, covering the public site and the admin console alike. Retrofitting a second language is where most projects come unstuck; building the layer in from the start made the switch total rather than cosmetic.
Stack