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