← All projects

Steward of Life

Client
Steward of Life
Industry
Nonprofit & ministry
Year
2026

A bilingual site for an Ethiopian non-profit developing servant leaders, empowering youth and strengthening Christian marriages: donations, events, books and resources, a blog and a gallery, over a 58-table content and membership schema.

Steward of Life dashboard map

58

Tables behind content, members and giving

2

Languages served from the database

3

Programmes under one platform

What it covers

  • Donations
  • Events & registration
  • Books & resources library
  • Blog
  • Gallery
  • Member accounts
  • Bilingual content (EN/AM)
  • Admin dashboard

An organisation with more than one job

Steward of Life runs leadership development, youth work and marriage ministry, publishes books and resources, holds events and takes donations. Each of those is a different content type with a different audience, and lumping them into one "pages" table would have made the site unmaintainable within a year.

Bilingual as a data problem

The audience reads Amharic and English. Translation lives in the database next to the content it translates rather than in files that need a deploy, so the organisation can publish in both languages without a developer.

Giving is the point

Donation is not a footer link. It is a first-class flow with its own page, and the rest of the site exists to earn the click.

How it was built

Svelte
TypeScript
MySQL
Drizzle
Framework

SvelteKit

Server load functions, form actions and endpoints; SSR by default.

Svelte 5

Runes for reactivity ($state, $derived, $effect).

Language

TypeScript

Strict mode across app and server code.

Data

MySQL

Primary datastore.

Drizzle Kit

Committed SQL migrations rather than push-to-prod diffing.

Drizzle ORM

Typed schema and queries, with migrations generated from the schema.

Auth

Better Auth

Session-based auth with server-side verification.

Forms

Superforms

Progressive-enhancement forms with server-side validation.

Zod

One schema validating both client and server.

UI

Tipex

Rich-text editor for CMS content.

Lucide

Icon set.

TanStack Table

Sorting, filtering and pagination for admin tables.

Bits UI

Headless primitives behind the component library.

Chart.js

Reporting charts.

Embla

Carousels.

Dark mode

System-aware theme switching.

Tailwind CSS

Utility-first styling with a project design token layer.

Reporting

jsPDF

Server-side PDF generation for reports and receipts.

jsPDF AutoTable

Tabular report export.

Payments

Chapa

Ethiopian payment gateway.

AI

Google Gemini

Shopping assistant answering against the live catalogue.

i18n

Paraglide i18n

Compiled translations, English and Amharic.

Infrastructure

Client image compression

Uploads compressed in the browser before hitting the server.

Nodemailer

Transactional email over SMTP.

Inside the system

Steward of Life dashboard map
Rather than a wall of links, the admin opens as a map: every section the organisation manages, laid out as one route.
Steward of Life donations table
Donations carry currency, bank, receiving account, cause and recurrence, with the next charge date computed for recurring gifts.
Steward of Life home page
The organisation runs three programmes; the home page has to introduce all of them without becoming a list.
Steward of Life giving page
Giving is a first-class flow with its own page rather than a link in the footer.
Back to all projects