Also make explanation section slightly more readable
Amateurfunk-Anki
Download the German amateur-radio exam question catalog from the Bundesnetzagentur and turn it into Anki decks.
Quick start
make # fetch + build (default)
make fetch # download + extract the catalog only → data/
make anki # rebuild .apkg files from data/ → anki/
make test # run both test suites
make clean # remove data/ and anki/
Output: five .apkg files under anki/. Betriebliche and
Vorschriften get one deck each (shared across all license classes);
Technische is split per class into three decks (N / E / A) following
the catalog's class field. A class-A candidate who wants every
Technische question imports all three Technische decks. Re-importing
a newer build preserves your review history.
Exam sections
The BNetzA exam has three parts (Prüfungsteile): two shared across all license classes plus the technical part, which is split per license tier. The question ID's first letter encodes which part it belongs to:
Non-technical (one deck each, taken by every candidate):
| Section | ID prefix | Questions |
|---|---|---|
| Betriebliche Kenntnisse | B* |
172 |
| Kenntnisse von Vorschriften | V* |
204 |
Technical (one deck per license class):
| Class | Section name | ID prefix | Questions |
|---|---|---|---|
| N | Technische Kenntnisse (N) | N* |
195 |
| E | Technische Kenntnisse (E) | E* |
463 |
| A | Technische Kenntnisse (A) | A* |
716 |
Counts are from the current edition (3. Auflage, März 2024; ~1750
questions total). The license tiers are cumulative for the exam:
a class-E candidate is responsible for N* + E* + B* + V*;
a class-A candidate is responsible for everything. Filter inside
Anki by deck, by the klasse-N|E|A tag, or by the Number field
prefix.
Exam question source
The catalog is published by the Bundesnetzagentur (BNetzA), the German federal regulator for telecommunications. Current edition: 3. Auflage, März 2024 (issued 2024-03-20, ~1750 questions across license classes N, E, A).
- Landing page: https://www.bundesnetzagentur.de/DE/Fachthemen/Telekommunikation/Frequenzen/SpezielleAnwendungen/Amateurfunk/start.html
- Machine-readable ZIP (what we download):
PruefungsfragenZIP.zip— contains the JSON question tree, thesvgs/figure folder, and aREADME.txtwith the official Quellenvermerk. - Human-readable PDF (not used by this pipeline):
Pruefungsfragen.pdf
BNetzA replaces the file in place across editions, so the URL is
stable; the fetcher detects updates via the HTTP Last-Modified
header.
See also
- 50ohm.de — community-maintained explanations, worked examples, and study material for the same exam. Pairs well with these decks for the why behind each question.
- DARC — Deutscher Amateur-Radio-Club, the German national IARU member-society. Publishes the German band plan, regulatory liaison material, and a large body of technical and operating guidance referenced throughout the amateur-radio community.
Requirements
Python 3.11+, standard library only. No third-party dependencies.
Explanations
⚠ Important: AI-generated content. Every explanation shipped with these decks is written by an AI agent following the contract in
EXPLANATIONS.md. AI agents make mistakes — they misread formulas, misquote law text, and confidently cite wrong sources. Do not treat any explanation as the ultimate source of truth. If something looks off, or if an explanation contradicts your existing understanding, verify against the primary source listed in the card (or against the catalog itself, the AFuV/AFuG on gesetze-im-internet.de, or the resources under See also). The official answer is always the one from the BNetzA catalog — the explanation is just a study aid, not an authority. Cards with a small low confidence badge are explicitly flagged as provisional and should be double-checked before you rely on them.
The back of each card optionally carries a terse English explanation
of why the right answer is right. Explanations are not part of the
BNetzA catalog — they're authored separately (by humans or AI agents)
into explanations.json at the repo root. The build is non-blocking
on this: questions without an entry just show no explanation block.
Entries with confidence < 7 render a small "low confidence" badge
so learners know the reasoning is provisional.
EXPLANATIONS.md is the editorial contract: schema, sourcing
guidance, confidence scale, and the workflows an AI agent should
follow when asked to add or improve entries.
References
⚠ Important: AI-generated content. The files under
references/are compiled by an AI agent from the exam catalog and public sources. AI agents make mistakes — they mis-transcribe figures, miscopy table boundaries, and confidently state things that are subtly wrong. Do not treat these tables as authoritative. Verify against the primary sources cited in each file (the official IARU Region 1 band plans, the AFuV/AFuG on gesetze-im-internet.de, or the BNetzA catalog itself) before relying on them.
The references/ directory holds study aids that span many questions —
lookup tables cross-referenced to the catalog. They are reading material,
not part of the build, and are not bundled into the .apkg decks.
references/Frequencies.md— IARU Region 1 band-plan frequency recommendations (HF through microwave), cross-referenced to the exam questions that test them.references/Call-Signs.md— call-sign patterns, suffixes, and country prefixes that appear in the catalog.references/Q-Codes.md— Q-codes and operating shorthand used in the questions.
More
CLAUDE.md— project orientation, pipeline overview.DESIGN.md— source-discovery notes, JSON schema, per-stage design contracts.EXPLANATIONS.md— schema + workflows for the explanations database.
License
The downloader and builder code is in this repo. The exam questions
themselves are published by the Bundesnetzagentur under
DL-DE→BY-2.0; attribution
is preserved in every generated artifact (README.txt inside
data/<edition>/, attribution field in the per-edition manifest).