Skip to content
Home/ Work/ Mamlo
Web AppEdTechNext.jsSupabaseClaudeLoRA

Mamlo

Surayt, also called Turoyo or Oromoyo, is a living Neo-Aramaic language spoken by Syriac communities worldwide, and it is classified as endangered. Learners in the diaspora had academic textbooks and almost no modern digital tool to practise with day to day.

Build something similar →
Keeping a language alive Free to learn, live at mamlo.co
25 unitsacross 2 levels, 269 words and 70 phrases
5 languagesinterface in English, French, German, Dutch and Swedish
430k wordsof authentic Turoyo in the pretraining corpus
53k pairsof instruction data behind the fine-tuned model

The Challenge

Surayt, also called Turoyo or Oromoyo, is a living Neo-Aramaic language spoken by Syriac communities worldwide, and it is classified as endangered. Learners in the diaspora had academic textbooks and almost no modern digital tool to practise with day to day.

Our Solution

We built Mamlo, a free Duolingo-style web app for Surayt. It turns the Šlomo Surayt course into 25 bite-sized units, adds SM-2 spaced repetition so vocabulary actually sticks, and gives learners an AI conversation partner. Because no general-purpose model writes Turoyo well, we trained our own with LoRA on a corpus we assembled ourselves. Native speakers contribute audio and corrections directly in the app, so the course improves as the community uses it.

Training a language model for a language models don't know

Off-the-shelf models converse well but write Turoyo poorly, because there is very little of it on the web to have learned from. So we fine-tuned our own with LoRA, in two passes on MLX. Pass one is continued pretraining on raw authentic Turoyo — Prym & Socin tales, the Šlomo Surayt TEI corpus, textbook sentences, a Neo-Aramaic corpus and community-validated contributions — which we grew from 110,000 to 430,000 words. Pass two is instruction tuning on 53,000 generated pairs. We ran the same recipe on Qwen3-4B and Gemma-3-12B to see whether model size or more epochs won on data this scarce.

Measuring it honestly

We scored every round with chrF rather than BLEU: Turoyo is morphologically rich and low-resource, so a character-level metric tolerates legitimate spelling variation that exact n-gram matching would punish. Scores are broken down by reference length, because 63% of the eval set is one to three words and a single average would just measure vocabulary lookup rather than translation. Generations are saved next to every score — an earlier round reported a perfect 100 that turned out to be a truncated eval run, not a good model, and keeping the outputs is what caught it.

One corpus, two spellings

Partway through we found the corpus carried two incompatible transliterations: the academic notation in 89% of the text, and the textbook notation the app, its character bar and its contributors actually use. We normalised everything onto the textbook forms, which rewrote 25.8% of all Surayt tokens, then resumed training from the existing adapter rather than starting over — the change is orthographic, not semantic, so the grammar and vocabulary learned over previous rounds stayed valid.

Three backends, each doing what it is good at

The chat feature runs as a hybrid rather than on any single model. The fine-tuned 4B writes plausible Surayt but cannot hold a conversation, since its training pairs are all single-turn transformations. Claude converses and explains well but writes weak Turoyo unaided. So Claude drives the exchange while receiving matching corpus lexicon entries, the accumulated admin corrections, and the 4B's draft as a specialist suggestion to verify rather than trust. Corrections live in Supabase and are replayed as context instead of being trained into weights, which keeps them instantly editable. The fine-tuned model is served from Replicate with the LoRA fused in, scaled to zero between requests.

Results delivered

Bite-sized lessons based on the Šlomo Surayt course
SM-2 spaced repetition for vocabulary review
Sentence-building and listening exercises
AI conversation practice grounded in a 12,000-entry lexicon
Community audio and corrections, with moderation
Streaks, XP, badges and a contributor leaderboard
Daily reminders by push notification and email
Custom Surayt language model, LoRA fine-tuned in two passes
chrF evaluation harness with per-length breakdown
Free to use, funded by donations via Stripe

Technology stack

Next.js Supabase Clerk Claude API Stripe Resend MLX / LoRA Qwen3 & Gemma 3 Replicate

Want similar results?

Book a free call and we'll scope your project and give you a fixed quote within 48h.

Get a free quote →

Ready to build yours?

Every project starts with a free 30-minute call. We'll scope your idea, answer your questions, and give you a fixed quote.

Book a free call →