A full-stack language learning app for Basque, built during a year living in the Basque Country. The app combines spaced repetition, NLP-based writing evaluation, and an offline neural translator into a modular platform designed to be extended to other languages.
Stack: Flutter (desktop) · FastAPI · Python · Streamlit · HuggingFace Transformers
Flutter Desktop App (lib/)
│
▼
FastAPI Server (api/) ← REST API, auto-docs at /docs
│
▼
Python Backend (backend/) ← data loading, model logic, SM-2 algorithm
│
├── data/ ← declensions, conjugations, vocabulary, grammar explanations
└── Helsinki-NLP/opus-mt-eu-en ← offline Basque - English translation
The Flutter app is the primary interface for desktop use. The original Streamlit interface (frontend/) is still available for quick testing and development. Everything the frontend needs is exposed through the FastAPI layer, which keeps the backend fully decoupled and individually replaceable.
- Exercises for Basque noun declensions across all grammatical cases
- Verb conjugation drills
- Vocabulary flashcards with spaced repetition (SM-2 algorithm) for long-term retention
- Reading comprehension with similarity-based summary evaluation
- Writing practice with automated translation and scoring
- Plain-English explanations of Basque grammatical concepts
- Examples for each case and structure
- Designed for English speakers with no prior Basque exposure
- Bidirectional Basque - English translation
- Runs on Helsinki-NLP/opus-mt-eu-en downloaded locally, so no internet or API key required at runtime
- Integrated into writing practice for automated answer evaluation
Requirements: Flutter SDK, Python 3.10+, and a virtual environment with the dependencies installed.
pip install -r requirements.txtStart both processes in separate terminals:
# Terminal 1 — API server
source venv/bin/activate
uvicorn api.main:app --host 0.0.0.0 --port 8000
# Terminal 2 — Flutter app
flutter run -d linuxAPI docs are available at http://localhost:8000/docs once the server is running.
To use the Streamlit interface instead:
streamlit run frontend/app.pyThis is an active personal project. Currently working on:
- Android support via Flutter's mobile build
- Expanded sentence-building and listening practice modes
- Improved translation pipeline and writing evaluation
- Standardized linguistic data format to support additional languages
The long-term goal is a framework flexible enough to support other low-resource or morphologically complex languages beyond Basque.
I spent a year living in the Basque Country as an English language assistant, which is what prompted me to start learning Basque (Euskara), which is a language isolate unrelated to any other known language, with a highly agglutinative morphology and a complex case system that makes it difficult for English speakers.
Building this was partly about learning Basque and partly about working through the practical problems of building NLP tooling for a low-resource language: limited training data, limited pre-trained model availability, and morphological complexity that breaks assumptions baked into tools designed for Indo-European languages. Those are exactly the kinds of problems I want to keep working on.





