A reproducible Anki deck pipeline for learning German from A1 to B2. Markdown source files compile into .apkg decks with TTS audio for every sentence — no manual card creation.
Built for self-study, but anyone can use it. If you just want to study, jump to Quickstart. If you want to edit content or fork the kit, see Building from source.
Six Anki decks, ~4 700 cards total, all with neural TTS audio (de-DE-KatjaNeural via Microsoft Edge).
| Deck | Topics | Cards | Description |
|---|---|---|---|
A1.apkg |
16 grammar | ~960 | Personalpronomen, modals, Akkusativ, trennbare Verben, Perfekt, … |
A2.apkg |
18 grammar | ~1 080 | Dativ, Wechselpräpositionen, Adjektivdeklination, Nebensätze, Konjunktiv II höflich |
B1.apkg |
18 grammar | ~1 080 | Konjunktiv II, Passiv, Genitiv, Relativsätze, Plusquamperfekt, Konnektoren |
B2.apkg |
18 grammar | ~1 080 | Konjunktiv I, Partizipien, Doppelinfinitiv, Funktionsverbgefüge, Nebensätze (vertieft) |
verbs.apkg |
80 verbs | 80 | Top irregular verbs with all three principal parts + helper |
themen.apkg |
12 packs | ~430 | Survival German + 11 daily-life situations (restaurant, hotel, doctor, …) |
Plus markdown reference docs (no Anki): connectors cheat sheet, Goethe exam prep at every level, curated learning resources.
If you just want to study:
- Install Anki (free desktop app, also iOS/Android).
- Download the
.apkgfiles fromanki/out/in this repo. - In Anki: File → Import → pick the
.apkg. Done.
Each .apkg imports as a hierarchy: German::<level>::<NN topic>. So A1 expands into 16 subdecks (German::A1::01 Personalpronomen + sein, German::A1::02 haben, …). You can study one topic at a time — read its .md file in grammar/ for the rule, then study just that subdeck in Anki.
Every grammar sentence produces three card types for thorough learning:
| Card type | Front | Back |
|---|---|---|
| Cloze drill | German with one word blanked + audio | full German sentence + English + grammar note |
| EN → DE production | English sentence | German + audio + grammar note |
| Audio-only listening | just plays the audio | German text + English + grammar note |
The verbs deck has one card per verb: infinitive on front, three principal parts (with helper) on back.
The themen deck has two cards per sentence: EN→DE and DE→EN, no cloze.
- Sentence-based, not vocabulary-based — you learn grammar through 20 example sentences per topic, not by drilling rules in isolation.
- Audio for every sentence — neural TTS, not robotic. Listening cards train comprehension explicitly.
- Markdown source-of-truth — edit a
.mdfile, runmake, get an updated.apkg. Stable card GUIDs preserve your Anki review schedule across rebuilds. - Goethe-aligned curriculum — topics map to Grammatik aktiv A1-B1 (Cornelsen) and standard B2 syllabus. Exam prep schedules included.
- Free — no subscription, no API keys.
edge-ttsis free.
If you want to edit content or rebuild from scratch:
git clone https://github.com/salmanmohebi/german-study-kit.git
cd german-study-kit
make install # one-time: .venv + dependencies
make a1 # build one level
make all # build everything (A1 + A2 + B1 + B2 + verbs + themen)Audio is cached in anki/audio/ (gitignored). Only changed sentences hit the TTS API on rebuild — the rest is instant.
Requirements: Python 3.11+, make, internet (for first audio fetch).
german-study-kit/
├── grammar/ # markdown source for grammar decks
│ ├── A1/ # 16 topic files
│ ├── A2/ # 18 topic files
│ ├── B1/ # 18 topic files
│ └── B2/ # 18 topic files
├── themen/ # 12 thematic packs (survival, restaurant, hotel, …)
├── reference/
│ ├── irregular-verbs.md # source for verbs deck + lookup table
│ └── konnektoren.md # connector cheat sheet (A2-B2)
├── exam/
│ ├── A2.md # Goethe-Zertifikat A2 format & prep schedule
│ ├── B1.md # B1 format & prep
│ └── B2.md # B2 format & prep
├── anki/
│ ├── build.py # grammar deck builder
│ ├── build_verbs.py # verbs deck builder
│ ├── build_themen.py # thematic deck builder
│ ├── tts.py # edge-tts wrapper with on-disk caching
│ ├── audio/ # cached mp3s (gitignored)
│ └── out/ # built .apkg files (committed)
├── resources.md # curated apps, podcasts, YouTube, tutoring platforms
├── roadmap.md # study plan, daily routines, scope
├── listening.md # podcast curriculum by level
├── Makefile
└── requirements.txt
Each topic is a single markdown file:
---
title: Personalpronomen + sein (Präsens)
level: A1
topic_id: a1-01-sein
tags: [a1, sein, personalpronomen]
---
## Erklärung
(Short grammar explanation. Rendered as HTML on the back of every card.)
## Sätze
- Ich {{c1::bin}} müde. | I am tired.
- Du {{c1::bist}} sehr nett. | You are very nice.Format rules:
## Erklärung→ grammar note shown on the back of every card from this file.## Sätze→ list of- <German> | <English>pairs.- Cloze markup
{{c1::word}}produces a fill-in-the-blank card. - Multi-cloze (
{{c1::}}+{{c2::}}in the same sentence) generates separate cards per blank.
Run make a1 (or a2/b1/b2) to rebuild.
Drop a new file in themen/ with the same markdown format. Cloze markup is optional. Each sentence becomes 2 cards (EN→DE + DE→EN).
Edit DEFAULT_VOICE in anki/tts.py. Other German voices:
de-DE-KatjaNeural(default, female)de-DE-ConradNeural(male)de-DE-AmalaNeural(female, younger)de-DE-BerndNeural(male, older)
Delete anki/audio/ to force regeneration with the new voice.
| File | What's there |
|---|---|
roadmap.md |
Overall plan, daily routine, deck status |
resources.md |
Curated apps, podcasts, YouTube, tutors, dictionaries (per level) |
exam/A2.md, exam/B1.md, exam/B2.md |
Goethe-Zertifikat format + week-by-week prep schedules |
reference/konnektoren.md |
Every connector across A2-B2 with word-order rules |
reference/irregular-verbs.md |
80 verbs principal parts |
edge-tts— free neural TTS via Microsoft Edge's voice service (no API key)genanki— programmatic.apkggenerationPyYAML+markdown— frontmatter parsing + grammar note rendering- Python 3.11+
- Grammar curriculum based on Grammatik aktiv A1-B1 (Cornelsen) plus standard Goethe-Zertifikat B2 syllabus.
- TTS by Microsoft Edge neural voices (Katja).
- Inspired by Refold-style sentence mining + spaced repetition.
Found a German error, awkward sentence, or grammar inaccuracy? PRs welcome — edit the relevant markdown file in grammar/, themen/, or reference/, run make to verify the build, and submit.