| > **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. |
|
|