🪟 Windows TippsThe Gemini desktop app is now available for Windows(11.09.2026 um 17:06 Uhr)
🪟 Windows TippsHeader and Footer not showing in Excel(14.09.2026 um 22:43 Uhr)
🕵️ SicherheitslückenBurn Out, Or Fade Away(14.09.2026 um 14:25 Uhr)
🪟 Windows TippsKB5129194 Windows 11 26H1 Out of Band Update - Deskmodder.de(14.09.2026 um 19:25 Uhr)
🪟 Windows TippsThe Gemini desktop app is now available for Windows(11.09.2026 um 17:06 Uhr)
🪟 Windows TippsHeader and Footer not showing in Excel(14.09.2026 um 22:43 Uhr)
🕵️ SicherheitslückenBurn Out, Or Fade Away(14.09.2026 um 14:25 Uhr)
🪟 Windows TippsKB5129194 Windows 11 26H1 Out of Band Update - Deskmodder.de(14.09.2026 um 19:25 Uhr)

🔧 Programmierung 🕛 vor 3 Monaten 8 Min Lesezeit
0

Equip: an open-source LMS for Bible schools — bilingual, scripture-aware, 4 weeks of real users

↗ Quelle (dev.to)
🗣️ Stimme:
📑 Inhaltsübersicht

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.




. Live at



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:




  1. Pre-process incoming HTML, detect <blockquote> + scripture-reference pairs.

  2. Swap the verse text for an opaque ASCII placeholder (VERSE_<hex>).

  3. Send the prose-with-placeholders to Gemini Flash Lite with a system prompt that lists "preserve placeholders verbatim" as a hard rule.

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



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







GitHub logo



Free, open-source LMS for Bible schools, ministries, and nonprofit educational programs. React + FastAPI + Supabase.










·
·







Screenshots






































Sign in (dark)







Mobile (390px)




Live at


Vollständiger Original-Bericht
Ausführliche Details, Code-Beispiele & Hersteller-Stellungnahme auf dev.to.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
1 Quelle
The Gemini desktop app is now available for Windows
1 Quelle
Header and Footer not showing in Excel
1 Quelle
Burn Out, Or Fade Away
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Equip: an open-source LMS for Bible schools — bilingual, scripture-aware, 4 weeks of real users

Thematisch verwandte Begriffe: Equip, opensource, Bible, schools · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...