Automatically generated using Codex and GPT 5.5 in high reasoning mode
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
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.
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).