Wortschaft

German Vocabulary Learning App

2024 - Present · Solo Developer & Designer

LearningMemoryFrictionSupabaseReactLLMTailwind

Learning

Designed for progressive mastery and retention.

Memory

Optimized for long-term recall through spaced repetition.

Friction

Minimized unnecessary steps to keep users in flow.

Language learners face a cold-start problem — most apps require manual vocabulary input, creating friction before any learning begins.

Target users: German language learners (B1–C1 level) who want contextual, adaptive vocabulary practice.

  • Must work without manual vocabulary curation
  • Serverless to minimize infrastructure cost
  • Type-safe across the full stack

LLM-powered cold start

Integrated OpenAI API to auto-generate contextual flashcards from topic prompts, eliminating the blank-slate problem new users face.

Adaptive mastery model

Built a data model that tracks per-word mastery scores with spaced repetition intervals that adjust based on individual performance patterns.

Serverless architecture

Chose Supabase for auth, database, and RLS policies. SWR for client-side caching. Zero server management overhead.

A fully functional web app with adaptive learning, LLM flashcard generation, mastery tracking dashboards, and learning velocity charts.

Architecture Snapshot

Input

German language learners (B1–C1 level) who want contextual, adaptive vocabulary practice.

Core Decision

Spaced repetition intervals tuned to individual mastery curves

Output

Users retain vocabulary 2× longer between review sessions

Stack

  • React
  • Supabase
  • Tailwind CSS
  • SWR
  • OpenAI API
  • Eliminated cold-start friction — users begin learning within 30 seconds
  • Mastery model shows measurable retention improvement across sessions
  • LLM-generated content needs quality guardrails — added post-generation validation
  • Spaced repetition intervals require careful tuning per proficiency level
  • Add collaborative word lists for classroom use
  • Implement offline mode with service worker caching