Anki flashcard decks for German (A1–C2, CEFR) and Mandarin Chinese (HSK 1–6), generated
with AI assistance and packaged as ready-to-import .apkg files, plus the underlying
CSV/JSON data for anyone who wants to build their own tooling on top of it.
language-flashcards/
├── german/
│ ├── csv/ German_A1.csv ... German_C2.csv
│ ├── json/ same data, one JSON file per level
│ ├── raw/ optional source material, if included
│ ├── build_deck.py csv -> german_vocab_decks.apkg
│ └── german_vocab_decks.apkg
├── chinese/
│ ├── csv/ HSK_1.csv ... HSK_6.csv
│ ├── json/ same data, one JSON file per level
│ ├── raw/ optional source material, if included
│ ├── build_deck.py csv -> hsk_vocab_decks.apkg
│ └── hsk_vocab_decks.apkg
└── README.md
Each .apkg imports into Anki as six independent top-level decks (German::A1 ...
German::C2, Chinese::HSK 1 ... Chinese::HSK 6), grouped under a collapsible
parent so the two languages don't mix together in your deck list.
Structure: word, pos, english_translation, example_sentence_de, example_sentence_en, sentence_breakdown — each row is one word with its part of speech, English meaning, a
German example sentence, that sentence's English translation, and a word-by-word
breakdown of the example.
Total entries: counted automatically when you run setup_repo.py or build_deck.py
— printed per level and as a running total. (An earlier count mid-project came out to
roughly 13,500 across all six levels; if your current CSVs have grown since, the script
output is the number to trust, not this note.)
Card design: word colored by part of speech with a small legend underneath, example sentence with its English translation, and a scrollable word-breakdown strip on the back.
Structure: word, pinyin, pos, translation, example_cn, example_pinyin, example_en, breakdown — each row is one word with pinyin, part of speech, English meaning, a Chinese
example sentence with its own pinyin and English translation, and a word-by-word
breakdown.
Card design: white card center framed by a red decorative corner motif (a nod to traditional Chinese red-and-gold ornamentation), word + pinyin + part of speech on the front, full example sentence with translation and breakdown on the back, forced to stay white even if you run Anki in dark mode.
This is deliberate, not a gap. Word frequency across any language follows a long-tail (Zipfian) distribution: a relatively small core of roughly the first 1,000–2,000 words covers the large majority of everyday spoken and written communication, and each step up in proficiency moves further into a long, thin tail of progressively rarer, more specialized vocabulary. That's exactly why CEFR and HSK themselves allocate a shrinking number of core words at the advanced end — A1–B1 vocabulary is densely shared across nearly every speaker and context, while C1/C2 vocabulary fragments into specialized registers (law, science, literature, business) that don't converge on one universal "next 2,000 words" the way beginner vocabulary does. A smaller, high-utility C2 list beats a longer but diffuse one: at that tier the marginal value of any one additional word drops sharply, and which words matter next depends more on individual interest than on a shared core.
- Some
sentence_breakdown/breakdowncells were written in inconsistent formats across generation batches (pipe-separated, em-dash-separated, labeled key:value, nested lists).build_deck.pyhandles the formats seen so far and prints a[!]warning for any row it can't parse — a failed parse only affects that row's breakdown strip, never the rest of the card. Check the console output when you run it. - A handful of German rows had the article (der/die/das) inconsistently attached to the word field rather than parsed out separately; this was corrected but is worth spot-checking if you regenerate the source data.
The vocabulary, example sentences, translations, and breakdowns in this repository were written by GPT-5.6 Sol, with a chunked generate-then-recheck pass built into the pipeline to catch dropped or hallucinated entries. Sol did the real work here across both languages — a large, tedious writing task handled well. That said, this is still AI-generated content, and despite the verification pass, occasional inconsistencies, formatting quirks, or translation inaccuracies may remain (see Known issues above).
Found an error, a wrong translation, or a card that looks off? Email evanhislupus143@gmail.com.
If your German data derives from a CC BY-NC 4.0 source, keep the attribution and non-commercial terms intact when redistributing. If your Chinese source material came from a site whose redistribution terms you haven't checked, confirm that before making this repository public — CSV/JSON extracted from copyrighted material isn't automatically clear to republish just because the extraction was automated.
0 comments
log in to comment.