A personal, ad-free Flutter app for drilling German vocabulary — noun articles (der / die / das) and verb conjugation (Präsens · Präteritum · Perfekt).
- Noun drill — tap the correct article (der / die / das)
- Verb conjugation drill — type the correct conjugated form
- Spaced repetition — SM-2 algorithm schedules cards by difficulty
- CEFR level filter — practice A1 through C2 words independently
- Category filter — focus on Nouns, Präsens, Präteritum, or Perfekt
- Gamification — earn XP per correct answer, level up, unlock achievement badges
- Adaptive shell — bottom nav on phone, navigation rail on tablet/desktop
- Offline & ad-free — all data stored locally with SQLite (Drift)
| Level | Nouns | Verbs |
|---|---|---|
| A1 | 60 | 30 |
| A2 | 71 | 30+ |
| B1 | 61 | 15+ |
Thematic groups include: everyday objects, family, travel, birthday, relationships, and abstract vocabulary.
Full word list with conjugation tables: docs/VOCABULARY.md
| Platform | CI build | Release artifact |
|---|---|---|
| Android | ✓ debug APK | signed APK (if keystore secret set) |
| Linux | ✓ .deb | .deb package |
| macOS | ✓ .app.zip | ad-hoc signed .zip |
- Flutter SDK stable channel
- Dart SDK ≥ 3.3.0
cd src
flutter pub get
dart run build_runner build --delete-conflicting-outputs
flutter runcd src
flutter testPush to main, develop, feature/**, or claude/** triggers:
flutter analyze --fatal-infos+flutter test- Debug builds for Android, Linux, macOS (artifacts uploaded for 14 days)
- SBOM (CycloneDX JSON)
Pushing a tag v*.*.* triggers the release workflow and creates a GitHub Release with all three platform artifacts.
Set these four repository secrets to enable signed release APKs:
| Secret | Value |
|---|---|
ANDROID_RELEASE_KEYSTORE_B64 |
base64 -w0 release.keystore |
ANDROID_KEYSTORE_PASSWORD |
keystore password |
ANDROID_KEY_ALIAS |
key alias (e.g. languagetrainer) |
ANDROID_KEY_PASSWORD |
key password |
| Secret | Value |
|---|---|
MACOS_CERTIFICATE |
base64 -w0 signing_cert.p12 |
MACOS_CERTIFICATE_PWD |
.p12 certificate password |
Without these secrets, the macOS build is produced without code signing (ad-hoc re-sign only).
src/lib/
├── app.dart # AppServices container + MaterialApp
├── main.dart
├── data/
│ ├── nouns.dart # ~215 nouns A1–B1
│ └── verbs.dart # ~95 verbs A1–B1
├── models/ # pure data classes + sealed QuizItem
├── services/
│ ├── database.dart # Drift SQLite (3 tables)
│ ├── review_scheduler.dart # SM-2 scheduling + level/category filters
│ ├── gamification_service.dart # XP, levels, achievements
│ └── sm2.dart # pure SM-2 algorithm
├── shell/ # adaptive navigation shell (mobile / desktop)
└── screens/ # Home · Quiz · Stats · Achievements · Settings · About
Full docs: docs/ARCHITECTURE.md · docs/REQUIREMENTS.md · docs/CLASS_DIAGRAM.md · docs/WIREFRAMES.md
See LICENSE.