A Memrise-Style Language Learning App
I've been learning Dutch, and got frustrated enough with existing apps that I built my own — a Django app with the same spaced-repetition backbone as Memrise or Anki, but tailored to how I actually wanted to study: one Learn button that feeds me new vocabulary, grammar, phrase frames and sentences in the right order, and one Review button that drills everything due, interleaved, in a single session.
Four content types, one spaced-repetition ladder
Most SRS apps only drill vocabulary. This one treats four different kinds of content the same way, each sitting on the same 8-rung interval ladder (a fixed Memrise-style schedule, not SM-2/Anki's per-card ease factor):
- Vocabulary — single words with example sentences.
- Grammar topics — an explanation page plus a set of exercises (multiple choice, gap-fill, reorder, transform, translate, listen-and-type), tracked at topic granularity rather than per exercise.
- Chunks — reusable phrase frames with a blank, like "Ik heet ___." The blank value is derived automatically from one filled-in example sentence, so authoring a chunk is as simple as authoring a vocabulary word.
- Sentences — complete, fixed utterances like "Hoe laat is het?" with no blank to fill.
A CEFR level (A1 through C1) gates the whole thing: the unified Learn flow always works on the lowest level that still has unplanted content, mixing new words, chunks and sentences round by round, and detouring into a grammar topic's explanation page whenever grammar has quietly fallen behind the other three curricula at that level. Review is level-agnostic — everything due, across every level, merged earliest-due-first into one interleaved session.
Building a demo that needed no signup
Every real view in the app is login-gated — it's a personal tool, not a public product, so there's no signup flow. But a portfolio project you can't actually touch isn't much of a demonstration. Rather than provision throwaway accounts for visitors (and clean up after them forever), the demo keeps each visitor's spaced-repetition progress in their browser session instead of the database — it lives exactly as long as the session does, and simply disappears when it expires.
The trick that made this cheap to build: almost all of the SRS engine is already pure functions operating on plain values — ladder math, exercise generation, the answer mutators. Only a thin "selection" layer at the edges ever touches the database, filtered by a logged-in user. Forking just that layer to read from a session dictionary instead — while reusing every pure function completely unchanged — meant the demo could be built as a small, additive module sitting next to the real code, with zero risk of regressing the app I actually use every day.
What's next
I'm slowly working up through the CEFR levels as I learn more Dutch — the curriculum plan currently reaches all the way to C1. Grammar and vocabulary content is hand-authored and reviewed as I go; audio pronunciation is generated in batches via Azure's text-to-speech.