GeberLMS
The Learning Management System used to sell the courses produced by Helveticore OÜ (Estonia): catalogue, enrollment, coupons, VAT/OSS invoicing, e-testing and LLM-generated quizzes — with admin, tutor and learner roles, in four interface languages.
Project card
- Developed by — Helveticore OÜ (Estonia)
- Repository —
helvetou/GeberLMS(private) - Stack — SvelteKit (adapter-cloudflare) · TypeScript strict
- Infrastructure — Cloudflare Workers/Pages · D1 (Drizzle) · R2 · Workers AI
- Payments — Payoneer + Revolut (no Stripe)
- Process — CMMI-DEV L3 (SPEC-001…003)
Architecture at a glance
- Runtime — the whole app runs on a single Cloudflare Worker; static assets served by Pages.
- Data — D1 (SQLite) via Drizzle ORM: 16 tables, migrations
0001_init→0005_quiz_questions. - Files — R2 bucket
geberlms-filesfor learner uploads and course resources. - Auth — sessions on Workers + accounts in D1; PBKDF2-SHA256 (Web Crypto).
- Money — integer cents only; discount on the net price, then VAT at the buyer's country (OSS).
Pure domain layer (src/lib/domain)
Framework-agnostic business logic, tested in isolation with Vitest — the TDD core of the platform.
Money & pricing
vat.ts— EU VAT rates, buyer-country rule, non-EU = 0.coupon.ts— % / fixed amount, 100 % free, expiry, usage cap.pricing.ts— discount on net, then VAT (OSS).invoice.ts·payment.ts— invoicing and Payoneer flow.
Access & roles
roles.ts·authz.ts— admin / learner / tutor permissions.user.ts·session.ts·password.ts— accounts, sessions, PBKDF2.guardianship.ts— tutor ↔ learner links and visibility.
Learning
catalog.ts·content.ts— course → modules → lessons → resources.enrollment.ts— single-payer enrollment resolution.progress.ts·quiz.ts·upload.ts— progress, e-testing, uploads.
Platform
activity.ts— audit journal (login, deposit, correction, payment).dashboard.ts— learner / tutor dashboards.i18n.ts— FR / EN / AR / DE, RTL for Arabic.
Actors & roles (FR-01…FR-07)
Admin
Operator. Manages courses, resources, coupons, accounts and payments. No public self-signup: learner and tutor accounts are created by the admin.
Learner (apprenant)
Takes courses; either financed by a tutor or
self-paying (self_payer flag). Follows progress and uploads documents.
Tutor (tuteur)
Finances one or more learners and follows their progress — sees only the learners it finances.
What is implemented
Functional areas
- Accounts & access — roles, guardianship, single-payer enrollment (FR-01…FR-07).
- Catalogue — course / module / lesson / resource CRUD, reversible hide (FR-10…FR-14).
- Progress — learner progress, dashboards, activity journal (FR-20…FR-23).
- Uploads — R2 document deposits (FR-24).
- E-testing — quiz, optional timing, auto-correction (FR-30); LLM quiz generation (FR-31).
Commerce & platform
- Payments — Payoneer + Revolut, access activation on confirmation (FR-40/FR-41).
- Coupons — % or fixed, 100 % free, expiry, usage cap (FR-42…FR-45).
- Invoicing — integer-cent pricing, VAT/OSS, invoice generation (FR-46/FR-47, BR-01…BR-05).
- i18n — FR / EN / AR / DE interface with RTL for Arabic.
- Deployment — Cloudflare Worker build + D1 migrations + seeds.
Next steps & compliance
Remaining build items
- Anti-copy — on-the-fly rendering, no mass export, watermark, quotas (NFR-10).
- Payoneer mode — semi-manual payment request vs checkout to be confirmed.
- Dependency hygiene — clear the 5 dev-dependency
npm auditfindings.
Compliance points
- TVA / OSS — re-validate rates against an official source; validate EU VAT registration with an Estonian accountant.
- RGPD — consent, minimisation, right to erasure.
- Token
HELVETO_PAT— expires 2026-10-21, to renew.