Skip to content
GODJI TECH
All products

Platform · Infrastructure

Ada

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.mz
Type
Client platform
Frontend
Next.js · React
Backend
Django · DRF
Hosting
Self-hosted Docker

The brief

An organisation running on information nobody had written down.

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

Public platform, and the console that runs it.

  • Congregation directory

    Districts and assemblies with leaders, contacts and coordinates, searchable and plotted on an interactive map so someone can find the nearest congregation.

  • Shop & orders

    Product listings, cart, checkout and order history — a full commerce path inside the platform rather than bolted on elsewhere.

  • Accounts with OTP

    Registration, login, one-time-password verification and recovery, built for people whose most reliable channel is a phone number.

  • Careers & offers

    Applications for roles, reviewed and progressed by administrators through to a formal offer, tracked in-platform.

  • Prayer & helpline

    Confidential requests routed to the right people, with the access control that sensitivity implies.

  • Updates, FAQ, media

    News with individual pages, a maintained FAQ and a media library — all editable without a deploy.

The admin console

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

Four containers, one modest server.

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 allowlist

The 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

Where the real work went.

A real stack on a small box

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.

Certificates that renew themselves

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.

A deploy you can trust at speed

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.

Bilingual, not translated

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

What it runs on.

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • Leaflet
  • Django
  • Django REST Framework
  • Python
  • PostgreSQL 15
  • gunicorn
  • Docker Compose
  • nginx
  • Certbot