TL;DR. Equip is a free, open-source LMS built for Bible schools and small ministries. MIT-licensed. Bilingual Russian↔English out of the box — the same course renders in either language depending on who's reading. Self-hostable end-to-end on free tiers. 4 weeks in production: 14 real users, 3 published courses, 3 issued certificates. This post is what's in it, what's wired in, and how it's built.
Why this exists
Small Bible schools, home-church training programs, and missionary-prep tracks around the world run their coursework on paper, WhatsApp groups, or shared Google Sheets. The commercial LMSes either price out small ministries (Canvas, Blackboard), require an IT department to run (Moodle, Open edX), or fight the use case at every step. Most are built for K–12 or universities, not 30 students reading through Romans together.
I wanted an LMS that:
- Costs zero to run for a 20–100 student school
- Has no vendor lock-in (your data, your hosting)
- Handles scripture correctly — more on this below, it turned out to be the most interesting constraint
- Works in Russian and English without manual per-string translation
- Is small enough that one nontechnical ministry admin can run it end-to-end
That's Equip. Live at equipbible.com.
Bilingual content, end-to-end
This is the feature that does the most work, so it goes first.
Russian and English UI ship together, but the more interesting decision is content. A teacher writes a course in their own language. When a student of the other language enrolls, every text field on every entity (course name, module title, chapter content, quiz question, quiz option, quiz explanation, assignment prompt) is auto-translated via Gemini Flash Lite and cached per (entity_type, entity_id, field, locale). The translation runs once per field and reads from cache thereafter. Cost per course is measured in cents.
The author always sees their own source-language content. The student always sees their target-language content. No "switch language to see English" toggle. No leaking source-locale strings. No [translation missing] placeholders.
Same /register page, two locales, rendered live by Equip:
The Cyrillic side isn't a different file or a different route. It's the same React tree with useTranslation(), plus the scripture passage in the left rail swapped from KJV (1769) to Synodal (1876) by a server-side substitution layer — see next section.
The scripture-preservation constraint
Most translation APIs (Gemini, GPT-4, DeepL) will happily paraphrase a Bible verse if you feed it into them as part of a longer paragraph. For a course where the exact wording of John 3:16 matters, that's a non-starter. "For God so loved the world" and "Because God loved the world this much" are not interchangeable in a Bible-study context, no matter how close the meaning.
Equip solves this outside the LLM:
- Pre-process incoming HTML, detect
<blockquote>+ scripture-reference pairs. - Swap the verse text for an opaque ASCII placeholder (
VERSE_<hex>). - Send the prose-with-placeholders to Gemini Flash Lite with a system prompt that lists "preserve placeholders verbatim" as a hard rule.
- After the model returns, restore each placeholder with the canonical text from bundled translations: KJV 1769 for English, Synodal 1876 for Russian.
The model never sees the verse text. The translation never paraphrases scripture. Implementation lives in app/services/bible/substitution.py and is about 200 lines.
There's a fallback in the system prompt for paraphrased quotes that the substitution layer can't confidently match (similarity < 0.80 to canonical) — "leave the original verse text untouched." That covers content where the substitution layer can't reliably do its job.
What's wired in
Equip is small in scope but talks to a few external services where it makes sense to. Each one is a deliberate choice, not a default:
| Service | What it does in Equip |
|---|---|
| YouVersion Platform API | Verse-of-the-Day card on the home dashboard. Reads the YV verse-of-the-day endpoint, caches the result per (locale, date). YV registration is on the non-commercial track, which is what shipped with our values from day one. |
| Gemini Flash Lite (Google AI) | Bilingual content translation pipeline (above). Flash Lite is overkill on quality and underkill on cost for surface translation; this is the sweet spot. |
| KJV 1769 + Synodal 1876 | Bundled in the backend as JSON, served as the canonical scripture for the substitution layer. Public-domain, no API call. |
| Supabase Auth | Google OAuth + email/password. JWT verification server-side. The auth.uid() value flows through every RLS policy. |
| Datadog | Browser-RUM on the SPA, log intake from the FastAPI backend, four synthetics on the public surfaces. Free tier. |
| Resend | Transactional email (verify, password reset, certificate-ready notifications) from a verified equipbible.com domain. Free tier. |
| Sentry-class error attribution | Not Sentry itself — Datadog's RUM + log correlation does the same job for our scale, single vendor. |
The pattern across all of these: pick a single best-fit service per layer, stay on free tiers as long as possible, never hide the integration behind a paywall.
What it does (the standard LMS surface)
Courses → modules → chapters, rich content via TipTap (callouts, audio, embedded YouTube, images), quizzes (multiple choice, true/false, short-answer, essay), assignments with a teacher grading queue, certificates with teacher approval, gradebook, cohorts, calendar, announcements.
The architecture, briefly
| Layer | Stack |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind, shadcn/ui, TipTap, motion |
| Backend | FastAPI, Python 3.12, SQLAlchemy 2, Pydantic 2 |
| Database | PostgreSQL on Supabase, RLS on every public table |
| Storage | Supabase Storage (avatars, course materials) |
| Deploy | Vercel — static SPA at equipbible.com, Python serverless at api.equipbible.com |
| CI/CD | GitHub Actions: lint, typecheck, 700+ backend tests, 220+ frontend tests, npm audit, pip-audit, Postgres schema smoke, CodeQL, OpenSSF Scorecard, Dependabot auto-merge for patch/minor |
| Monitoring | Datadog (RUM, logs, synthetics) |
Total infra cost at current usage: $0. Vercel, Supabase, Datadog, and Resend free tiers carry the whole thing.
Mobile, too
No native app; responsive web from 360px wide. A native app is months of work that buys little at this scale.
State of production, 4 weeks in
Real numbers from the database as of this morning, not aspirations:
- 14 users (11 students, 2 teachers, 1 admin)
- 3 published courses, 1 in draft
- 10 modules, 28 chapters of actual content
- 21 enrollments across the 3 courses
- 6 chapters completed by active students
- 3 certificates issued (teacher-approved, full course completion)
- 9 quiz attempts submitted and graded
Each user signed up with a real email, enrolled in a real course, and in three cases finished one and received a teacher-signed certificate. End-to-end flow runs.
What's intentionally NOT there
- No "Discover" feed or social layer. Students enroll because a teacher invited them, not because an algorithm recommended a course.
- No live video conferencing. Use Zoom or Jitsi separately. Equip stores course-event entries with a meeting-URL field. That's the integration surface.
- No mobile app. Responsive web works.
- No monetization features. No paywalls, no premium tier, no "powered by" splash. MIT-licensed. Use it, fork it, deploy it.
- No "AI assistant" widget. AI is in the translation pipeline as infrastructure, not in the UI as a feature. Bible-study students aren't asking for a chatbot.
How to actually use it
Two paths, depending on what you want:
Hosted at equipbible.com. Free. Sign up, you're in. Works for independent teachers, single-classroom contexts, students looking for Bible courses to enroll in. No credit card.
Self-host your own instance. Clone the repo, point at your own Supabase project, deploy to Vercel. Bible schools that want their own URL, full data sovereignty, and isolation from other tenants get this. Total cost still $0 on the free tiers.
If you're a Bible school or ministry running coursework on Google Sheets and WhatsApp groups, this is for you. Either path works. Pick the one that matches how much technical setup you want to do.
What's next
Near-term on the published roadmap: teacher onboarding flow (the first-login /teacher page is too quiet right now), a completion-celebration moment (students don't know clearly when they finish a course), and a 15-minute self-host walkthrough for schools without a dev on staff.
Longer-term: more language pairs (Spanish + Portuguese for missionary contexts) via api.bible, in-platform certificate verification via signed JSON-LD, and a contribution path for translators to refine AI-translated content where wording matters most.
What I want to hear back
Especially from three groups:
- Anyone running a small Bible school or ministry training program: what's blocking you from moving off your current setup? Particularly curious about Russian-speaking schools in CIS countries where the Synodal canonical-text handling matters.
- Anyone who has built or contributed to a niche-domain LMS: what's the one constraint you wish you'd designed for from day one? I'd rather steal your lessons than learn them again.
- Anyone considering forking Equip for a different niche (Sunday-school curriculum, a different religious tradition, secular adult-ed): tell me what'd need to change. Easier to plan the abstractions now than retrofit them later.
ArVaViT
/
equip
Free, open-source LMS for Bible schools, ministries, and nonprofit educational programs. React + FastAPI + Supabase.
Equip
A free, open-source learning management system built for Bible schools church ministries, and nonprofit educational programs
Live demo · Roadmap · Contributing · Support · Changelog
Screenshots
Live at equipbible.com. Teacher and admin views (gradebook, course editor, analytics) are behind sign-in — create a free account to explore.
Why this project?
Hundreds of small Bible schools, home churches, and missionary training programs around the world still manage courses on paper, WhatsApp, or spreadsheets. Commercial LMS platforms are expensive, overkill, or require technical expertise that volunteer-run organizations simply don't have.
Equip is designed to change that:
- Free forever — MIT-licensed, no paywalls, no "premium" tiers.
- Simple to deploy — one-click Vercel deploy with a free Supabase database. No Docker, no servers to manage.
- Built for small scale — optimized for 20-100 students, not…







Top comments (0)