> **Published copy.** This file is the release copy of `data/FONTS.md` from > [https://github.com/naeyn/de-htr-web](https://github.com/naeyn/de-htr-web). Paths to files that ship in this release have been rewritten to > their locations here (`training-data/…`). Any other repository-relative path — > `src/…`, `scripts/…`, `DECISIONS.md`, the raw corpora, the font `.ttf` files, and > `data/german_wikipedia_lines.txt` — refers to the source repository, which is the > only place those files exist. # Handwriting fonts for synthetic training data These fonts are used to render German text for **synthetic training data** (Tier 3). Every font listed below was **individually verified** for: 1. **License** — SIL Open Font License 1.1 only (sourced from the Google Fonts `ofl/` tree). Personal-use-only fonts are categorically rejected. 2. **German charset** — cmap coverage of Ä Ö Ü ä ö ü ß (`U+00C4 U+00D6 U+00DC U+00E4 U+00F6 U+00FC U+00DF`) via `fontTools.ttLib.TTFont.getBestCmap()`. TTF files live in `data/fonts/`. Matching license texts live in `training-data/font-licenses/`. | Font | File | Source URL | License | License file | German glyphs verified (method: fontTools cmap check) | Access date | |------|------|------------|---------|--------------|------------------------------------------------------|-------------| | Caveat | `Caveat[wght].ttf` | https://github.com/google/fonts/raw/main/ofl/caveat/Caveat%5Bwght%5D.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Caveat_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Kalam | `Kalam-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/kalam/Kalam-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Kalam_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Patrick Hand | `PatrickHand-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/patrickhand/PatrickHand-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Patrick_Hand_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Shadows Into Light | `ShadowsIntoLight.ttf` | https://github.com/google/fonts/raw/main/ofl/shadowsintolight/ShadowsIntoLight.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Shadows_Into_Light_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Shadows Into Light Two | `ShadowsIntoLightTwo-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/shadowsintolighttwo/ShadowsIntoLightTwo-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Shadows_Into_Light_Two_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Indie Flower | `IndieFlower-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/indieflower/IndieFlower-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Indie_Flower_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Architects Daughter | `ArchitectsDaughter-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/architectsdaughter/ArchitectsDaughter-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Architects_Daughter_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Reenie Beanie | `ReenieBeanie.ttf` | https://github.com/google/fonts/raw/main/ofl/reeniebeanie/ReenieBeanie.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Reenie_Beanie_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Gloria Hallelujah | `GloriaHallelujah.ttf` | https://github.com/google/fonts/raw/main/ofl/gloriahallelujah/GloriaHallelujah.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Gloria_Hallelujah_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | La Belle Aurore | `LaBelleAurore.ttf` | https://github.com/google/fonts/raw/main/ofl/labelleaurore/LaBelleAurore.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/La_Belle_Aurore_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Waiting for the Sunrise | `WaitingfortheSunrise.ttf` | https://github.com/google/fonts/raw/main/ofl/waitingforthesunrise/WaitingfortheSunrise.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Waiting_for_the_Sunrise_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | | Covered By Your Grace | `CoveredByYourGrace.ttf` | https://github.com/google/fonts/raw/main/ofl/coveredbyyourgrace/CoveredByYourGrace.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Covered_By_Your_Grace_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 | ## Verification Command (run from repo root on 2026-07-28): ```bash uv run --with fonttools python -c ' from fontTools.ttLib import TTFont from pathlib import Path REQUIRED = { 0x00C4: "Ä", 0x00D6: "Ö", 0x00DC: "Ü", 0x00E4: "ä", 0x00F6: "ö", 0x00FC: "ü", 0x00DF: "ß", } order = [ "Caveat[wght].ttf", "Kalam-Regular.ttf", "PatrickHand-Regular.ttf", "ShadowsIntoLight.ttf", "ShadowsIntoLightTwo-Regular.ttf", "IndieFlower-Regular.ttf", "ArchitectsDaughter-Regular.ttf", "ReenieBeanie.ttf", "GloriaHallelujah.ttf", "LaBelleAurore.ttf", "WaitingfortheSunrise.ttf", "CoveredByYourGrace.ttf", ] for name in order: path = Path("data/fonts") / name font = TTFont(path) cmap = font.getBestCmap() or {} cps = set(cmap.keys()) missing = [f"U+{cp:04X} ({ch})" for cp, ch in REQUIRED.items() if cp not in cps] status = "PASS" if not missing else "FAIL" miss = ", ".join(missing) if missing else "(none)" print(f"{status}\t{path.name}\tmissing={miss}") ' ``` Output: ``` PASS Caveat[wght].ttf missing=(none) PASS Kalam-Regular.ttf missing=(none) PASS PatrickHand-Regular.ttf missing=(none) PASS ShadowsIntoLight.ttf missing=(none) PASS ShadowsIntoLightTwo-Regular.ttf missing=(none) PASS IndieFlower-Regular.ttf missing=(none) PASS ArchitectsDaughter-Regular.ttf missing=(none) PASS ReenieBeanie.ttf missing=(none) PASS GloriaHallelujah.ttf missing=(none) PASS LaBelleAurore.ttf missing=(none) PASS WaitingfortheSunrise.ttf missing=(none) PASS CoveredByYourGrace.ttf missing=(none) ``` ## Rejected candidates | Candidate | Reason | |-----------|--------| | Homemade Apple | Not SIL OFL 1.1 — lives under `apache/homemadeapple` in google/fonts (Apache 2.0) | | Rock Salt | Not SIL OFL 1.1 — lives under `apache/rocksalt` in google/fonts (Apache 2.0) | Additional OFL handwriting candidates that also PASSed the German cmap check but were not needed after the first 12 accepted fonts: Neucha, Bad Script, Marck Script, Sue Ellen Francisco.