# Amateurfunk-Anki Download the German amateur-radio exam question catalog from the Bundesnetzagentur and turn it into Anki decks. ## Quick start ```sh make # fetch + build everything (default) make fetch # download + extract the catalog only → data/ make anki # rebuild the five exam decks from data/ → anki/ make shorthand # rebuild the Q-group / operating-abbreviation deck → anki/ make technical # rebuild the technical / HAM-abbreviation deck → anki/ make test # run all test suites make clean # remove data/ and anki/ ``` Output: seven `.apkg` files under `anki/`. **Five exam decks** built from the catalog: 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. **Two glossary decks** of radio shorthand — Q-groups and operating abbreviations, and technical/HAM abbreviations — built from curated data rather than the catalog (see [Glossary decks](#glossary-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. ## Glossary decks Two extra decks teach the radio shorthand a candidate actually needs — the codes used in the exam **plus** the most common ones used on the air that the exam never tests (real operating knowledge, not just the test). They are built from hand-curated JSON, independent of the catalog, so they build even without `make fetch`: | Deck | Source | Builder | |-----------------------------------------------|------------------|----------------------------| | `amateurfunk-abkuerzungen-q-gruppen.apkg` | `shorthand.json` | `amateurfunk_shorthand.py` | | `amateurfunk-technische-abkuerzungen.apkg` | `technical.json` | `amateurfunk_technical.py` | - **Q-groups & operating abbreviations** — Q-codes (QRM, QSO, QSY…), CW/voice shorthand (CQ, DE, 73, RST…), prosigns, and the distress/urgency signals (MAYDAY, SOS…). - **Technical & HAM abbreviations** — modulation and modes (SSB, FM, CW), signal domains (NF, HF, ZF), building blocks (VFO, PLL, AGC), components, measurements (dB, SWR, PEP), propagation, digital modes, and the organisations/regulations (ITU, CEPT, EMV). Each code is a single Anki **note** with two cards: one prompts for the meaning given the code, the reverse prompts for the code given the meaning. A Q-group means one thing as a statement (`QSO`) and another as a question (`QSO?`), so each becomes two notes (four cards). Filter inside Anki by tag: `pruefung` marks codes that appear in the exam catalog; `q-gruppe` / `abkuerzung` and (technical deck) `kategorie-*` mark the kind; `prosign` and `notsignal` mark prosigns and the non-amateur distress signals. The `pruefung` flags and the meanings were cross-checked against the BNetzA catalog — `pruefung` means "this code's meaning is tested", not merely "the string appears somewhere". > **⚠ Important: AI-generated content.** `shorthand.json` and > `technical.json` are compiled with AI assistance. As with the > explanations and references, verify anything that looks off against a > primary source (the catalog, the ARRL/DARC Q-code lists, or the > resources under [See also](#see-also)) before relying on it. ## 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: - Machine-readable ZIP (what we download): [`PruefungsfragenZIP.zip`](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Amateurfunk/Fragenkatalog/PruefungsfragenZIP.zip?__blob=publicationFile) — contains the JSON question tree, the `svgs/` figure folder, and a `README.txt` with the official Quellenvermerk. - Human-readable PDF (not used by this pipeline): [`Pruefungsfragen.pdf`](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Amateurfunk/Fragenkatalog/Pruefungsfragen.pdf?__blob=publicationFile) BNetzA replaces the file in place across editions, so the URL is stable; the fetcher detects updates via the HTTP `Last-Modified` header. ## Exam aids (Hilfsmittel) BNetzA publishes an official aid sheet that candidates **are allowed to use during the exam** — you do not have to memorize anything it contains: - [`Hilfsmittel_12062024.pdf`](https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Amateurfunk/AntraegeFormulare/Hilfsmittel_12062024.pdf?__blob=publicationFile&v=3) It bundles the BNetzA frequency-allocation table (band limits, usage parameters, and maximum power per class), the IARU band plans, the German *Rufzeichenplan* (call-sign series → class plus the international suffixes like `/m`, `/mm`, `/p`), and the *Formelsammlung* (formula collection) together with constants and material tables. It does **not** contain foreign-country prefixes (*Landeskenner*), Q-codes, or the phonetic alphabet — those remain memory items. Questions whose answer can be read or derived from this sheet carry a **Hilfsmittel** note in their explanation (see below), so you can tell when something is a lookup in the exam rather than something to learn by heart. ## See also - [**50ohm.de**](https://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**](https://www.darc.de/) — 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](https://www.gesetze-im-internet.de/), or > the resources under [See also](#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. Where a question's answer is available in the official exam aid sheet (see [Exam aids (Hilfsmittel)](#exam-aids-hilfsmittel)), the explanation appends a short **Hilfsmittel** note — for example pointing at the frequency-allocation table, the IARU band plan, the Rufzeichenplan, or the Formelsammlung — to flag that it is a lookup you may consult during the exam rather than a memory item. `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](https://www.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. This reference is the catalogue the [Q-group glossary deck](#glossary-decks) (`shorthand.json`) was built from. ## More - `CLAUDE.md` — project orientation, pipeline overview (including the two [glossary decks](#glossary-decks)). - `DESIGN.md` — source-discovery notes, JSON schema, per-stage design contracts. - `EXPLANATIONS.md` — schema + workflows for the explanations database. - `shorthand.json` / `technical.json` — curated source data for the two [glossary decks](#glossary-decks). ## 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](https://www.govdata.de/dl-de/by-2-0); attribution is preserved in every generated artifact (`README.txt` inside `data//`, `attribution` field in the per-edition manifest).