falzmarke 0.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. falzmarke-0.7.3/LICENSE +21 -0
  2. falzmarke-0.7.3/PKG-INFO +400 -0
  3. falzmarke-0.7.3/README.md +339 -0
  4. falzmarke-0.7.3/pyproject.toml +74 -0
  5. falzmarke-0.7.3/setup.cfg +4 -0
  6. falzmarke-0.7.3/skill/falzmarke/__init__.py +8 -0
  7. falzmarke-0.7.3/skill/falzmarke/assets/fonts/LICENSE-SourceSans3.txt +93 -0
  8. falzmarke-0.7.3/skill/falzmarke/assets/fonts/SourceSans3-It.otf +0 -0
  9. falzmarke-0.7.3/skill/falzmarke/assets/fonts/SourceSans3-Regular.otf +0 -0
  10. falzmarke-0.7.3/skill/falzmarke/assets/fonts/SourceSans3-Semibold.otf +0 -0
  11. falzmarke-0.7.3/skill/falzmarke/assets/fonts/SourceSans3-SemiboldIt.otf +0 -0
  12. falzmarke-0.7.3/skill/falzmarke/cli.py +998 -0
  13. falzmarke-0.7.3/skill/falzmarke/emit.py +77 -0
  14. falzmarke-0.7.3/skill/falzmarke/geometrie.py +640 -0
  15. falzmarke-0.7.3/skill/falzmarke/lint.py +325 -0
  16. falzmarke-0.7.3/skill/falzmarke/markdown.py +229 -0
  17. falzmarke-0.7.3/skill/falzmarke/regeln/__init__.py +189 -0
  18. falzmarke-0.7.3/skill/falzmarke/regeln/din5008.yaml +420 -0
  19. falzmarke-0.7.3/skill/falzmarke/typografie.py +145 -0
  20. falzmarke-0.7.3/skill/falzmarke/typst/falzmarke.typ +263 -0
  21. falzmarke-0.7.3/skill/falzmarke/typst/profiles/assets/logo.svg +15 -0
  22. falzmarke-0.7.3/skill/falzmarke/typst/profiles/assets/unterschrift.svg +28 -0
  23. falzmarke-0.7.3/skill/falzmarke/typst/profiles/example-grafik.yaml +62 -0
  24. falzmarke-0.7.3/skill/falzmarke/typst/profiles/example-kopf.typ +33 -0
  25. falzmarke-0.7.3/skill/falzmarke/typst/profiles/example.yaml +57 -0
  26. falzmarke-0.7.3/skill/falzmarke/typst/vendor/LICENSE-letter-pro +21 -0
  27. falzmarke-0.7.3/skill/falzmarke/typst/vendor/README.md +22 -0
  28. falzmarke-0.7.3/skill/falzmarke/typst/vendor/letter-pro-v3.0.0.typ +606 -0
  29. falzmarke-0.7.3/skill/falzmarke.egg-info/PKG-INFO +400 -0
  30. falzmarke-0.7.3/skill/falzmarke.egg-info/SOURCES.txt +56 -0
  31. falzmarke-0.7.3/skill/falzmarke.egg-info/dependency_links.txt +1 -0
  32. falzmarke-0.7.3/skill/falzmarke.egg-info/entry_points.txt +2 -0
  33. falzmarke-0.7.3/skill/falzmarke.egg-info/requires.txt +9 -0
  34. falzmarke-0.7.3/skill/falzmarke.egg-info/top_level.txt +1 -0
  35. falzmarke-0.7.3/tests/test_cli.py +157 -0
  36. falzmarke-0.7.3/tests/test_fremde_pdfs.py +144 -0
  37. falzmarke-0.7.3/tests/test_frontmatter.py +119 -0
  38. falzmarke-0.7.3/tests/test_gegenbeweis.py +149 -0
  39. falzmarke-0.7.3/tests/test_geometry.py +70 -0
  40. falzmarke-0.7.3/tests/test_installationswege.py +61 -0
  41. falzmarke-0.7.3/tests/test_lint.py +290 -0
  42. falzmarke-0.7.3/tests/test_markdown.py +204 -0
  43. falzmarke-0.7.3/tests/test_marke.py +207 -0
  44. falzmarke-0.7.3/tests/test_oeffentlichkeit.py +134 -0
  45. falzmarke-0.7.3/tests/test_pdf_konformitaet.py +189 -0
  46. falzmarke-0.7.3/tests/test_profile.py +190 -0
  47. falzmarke-0.7.3/tests/test_profilgrenze.py +246 -0
  48. falzmarke-0.7.3/tests/test_profilsuche.py +143 -0
  49. falzmarke-0.7.3/tests/test_quellenlage.py +292 -0
  50. falzmarke-0.7.3/tests/test_readme_auf_pypi.py +102 -0
  51. falzmarke-0.7.3/tests/test_roadmap.py +193 -0
  52. falzmarke-0.7.3/tests/test_satzspiegel.py +179 -0
  53. falzmarke-0.7.3/tests/test_tape.py +193 -0
  54. falzmarke-0.7.3/tests/test_textkanon.py +159 -0
  55. falzmarke-0.7.3/tests/test_vendor.py +38 -0
  56. falzmarke-0.7.3/tests/test_verify.py +150 -0
  57. falzmarke-0.7.3/tests/test_version.py +93 -0
  58. falzmarke-0.7.3/tests/test_vollstaendigkeit.py +107 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Johannes-Maximilian Gottl (Blitzsicht)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,400 @@
1
+ Metadata-Version: 2.4
2
+ Name: falzmarke
3
+ Version: 0.7.3
4
+ Summary: DIN-5008-Briefe aus Markdown, am fertigen PDF nachgemessen. Sollwerte aus Sekundärquellen.
5
+ Author-email: Blitzsicht <servus@blitzsicht.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Johannes-Maximilian Gottl (Blitzsicht)
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/blitzsicht/falzmarke
29
+ Project-URL: Documentation, https://github.com/blitzsicht/falzmarke#readme
30
+ Project-URL: Source, https://github.com/blitzsicht/falzmarke
31
+ Project-URL: Changelog, https://github.com/blitzsicht/falzmarke/blob/main/CHANGELOG.md
32
+ Project-URL: Releases, https://github.com/blitzsicht/falzmarke/releases
33
+ Project-URL: Issues, https://github.com/blitzsicht/falzmarke/issues
34
+ Keywords: din5008,brief,letter,typst,pdf,markdown,geschaeftsbrief,skill,cli,agent
35
+ Classifier: Development Status :: 4 - Beta
36
+ Classifier: Environment :: Console
37
+ Classifier: Intended Audience :: Developers
38
+ Classifier: Intended Audience :: End Users/Desktop
39
+ Classifier: License :: OSI Approved :: MIT License
40
+ Classifier: Natural Language :: German
41
+ Classifier: Operating System :: OS Independent
42
+ Classifier: Programming Language :: Python :: 3
43
+ Classifier: Programming Language :: Python :: 3.11
44
+ Classifier: Programming Language :: Python :: 3.12
45
+ Classifier: Programming Language :: Python :: 3.13
46
+ Classifier: Topic :: Office/Business
47
+ Classifier: Topic :: Printing
48
+ Classifier: Topic :: Text Processing :: Markup :: Markdown
49
+ Requires-Python: >=3.11
50
+ Description-Content-Type: text/markdown
51
+ License-File: LICENSE
52
+ Requires-Dist: typst<0.16,>=0.15
53
+ Requires-Dist: pyyaml>=6
54
+ Requires-Dist: pdfplumber>=0.11
55
+ Requires-Dist: pypdf>=5
56
+ Requires-Dist: markdown-it-py<5,>=4
57
+ Provides-Extra: dev
58
+ Requires-Dist: pytest>=8; extra == "dev"
59
+ Requires-Dist: fonttools>=4; extra == "dev"
60
+ Dynamic: license-file
61
+
62
+ <div align="center">
63
+
64
+ <img src="https://github.com/blitzsicht/falzmarke/raw/main/docs/assets/brand/banner.png" alt="falzmarke — Briefe schreiben mit KI, nach Norm, nicht nach Gefühl. DIN-5008-Briefe aus Markdown, als PDF/A gesetzt und auf den Millimeter geprüft." width="100%">
65
+
66
+ [![CI](https://github.com/blitzsicht/falzmarke/actions/workflows/ci.yml/badge.svg)](https://github.com/blitzsicht/falzmarke/actions/workflows/ci.yml)
67
+ [![Release](https://img.shields.io/github/v/release/blitzsicht/falzmarke)](https://github.com/blitzsicht/falzmarke/releases/latest)
68
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/blitzsicht/falzmarke/blob/main/LICENSE)
69
+ [![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-3776AB)](https://github.com/blitzsicht/falzmarke/blob/main/pyproject.toml)
70
+ [![DIN 5008](https://img.shields.io/badge/DIN_5008-2020-245A73)](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/din5008.md)
71
+
72
+ </div>
73
+
74
+ ---
75
+
76
+ **Andere Werkzeuge erzeugen ein PDF. falzmarke prüft das Ergebnis.**
77
+
78
+ Du schreibst den Inhalt als Markdown. falzmarke setzt daraus einen Geschäftsbrief nach
79
+ DIN 5008:2020 als PDF/A — und misst anschließend das fertige PDF nach. Sitzt die Falzmarke nicht
80
+ auf 105,0 mm, endet der Lauf mit einem Fehler statt mit einem Brief, der nur ungefähr stimmt.
81
+
82
+ <div align="center">
83
+
84
+ **[⬇ Als Claude-Skill laden](https://github.com/blitzsicht/falzmarke/releases/latest/download/falzmarke.skill)** ·
85
+ **[In 60 Sekunden ausprobieren](#in-60-sekunden)** ·
86
+ **[Beispielbrief ansehen](https://github.com/blitzsicht/falzmarke/raw/main/docs/renders/brief-form-b.png)**
87
+
88
+ `Linux · macOS · Windows` · `33 Maße je Seite` · `PDF/A-2b` · `MIT`
89
+
90
+ </div>
91
+
92
+ ---
93
+
94
+ ## In Bewegung
95
+
96
+ ![Ein Terminal zeigt den Musterbrief als Markdown, danach den Lauf von falzmarke render: PDF und Vorschau werden geschrieben, anschließend läuft der Messbericht durch und endet mit der Zeile, die die eingehaltenen Maße zählt.](https://github.com/blitzsicht/falzmarke/raw/main/docs/renders/demo.gif)
97
+
98
+ Aufgezeichnet aus der echten CLI mit [vhs](https://github.com/charmbracelet/vhs);
99
+ das Drehbuch steht in [`docs/marke/video/readme.tape`](https://github.com/blitzsicht/falzmarke/blob/main/docs/marke/video/readme.tape).
100
+ Ein Test hält den Mitschnitt gegen einen frischen Lauf, damit hier kein Terminal
101
+ steht, das es so nie gab ([`tests/test_tape.py`](https://github.com/blitzsicht/falzmarke/blob/main/tests/test_tape.py)).
102
+
103
+ ---
104
+
105
+ ## Was dabei herauskommt
106
+
107
+ ![Briefkopf, Anschriftfeld, Informationsblock und Betreff](https://github.com/blitzsicht/falzmarke/raw/main/docs/assets/demo/hero.png)
108
+
109
+ Und was danach geprüft wird — Auszug aus dem Bericht, den jeder Lauf ausgibt:
110
+
111
+ ```
112
+ OK Falzmarke 1, y: soll 105.00 ist 105.00 (tol ±0.3)
113
+ OK Infoblock, x-links: soll 125.00 ist 125.00 (tol ±0.5)
114
+ OK Betreff, y-Oberkante: soll 98.47 ist 97.91 (tol -1.75/+0.6)
115
+ OK Abstand Betreff → Anrede (2 Leerzeilen): soll 12.70 ist 12.70 (tol ±0.2)
116
+ ```
117
+
118
+ ## Das Problem
119
+
120
+ Eine Briefvorlage kann nicht prüfen, ob das Ergebnis stimmt. Sie wird kopiert, jemand verschiebt
121
+ eine Zeile, und der Fehler fällt erst am fertigen Stapel auf: Die Anschrift steht nicht mehr im
122
+ Fensterausschnitt, alles muss neu gedruckt und kuvertiert werden — und wer mit Automationsrabatt
123
+ einliefert, verliert ihn für diese Sendung.
124
+
125
+ Sprachmodelle verschärfen das. Sie formulieren gut, aber sie können keinen Text auf 45,0 mm
126
+ setzen. Wer einen Brief von einer KI schreiben lässt, bekommt zuverlässig guten Inhalt in
127
+ unzuverlässigem Layout.
128
+
129
+ Und ein Renderer kann ebenfalls Fehler haben — auch dieser hier.
130
+
131
+ Deshalb trennt falzmarke drei Dinge: **Inhalt** kommt als Markdown, lesbar und versionierbar.
132
+ Das **Layout** setzt ein Renderer, der es immer gleich macht. Und die **Prüfung** misst das
133
+ fertige PDF, statt dem Renderer zu glauben.
134
+
135
+ ## Warum nicht einfach Word oder ein Prompt?
136
+
137
+ Verglichen wird der typische Arbeitsablauf, nicht das Werkzeug an sich — mit einer sorgfältig
138
+ gepflegten Vorlage lässt sich vieles davon erreichen.
139
+
140
+ | | Vorlage in Word / LibreOffice | Brief direkt von einer KI | falzmarke |
141
+ |---|---|---|---|
142
+ | Quelle diffbar und versionierbar | teilweise | selten | ja — Markdown und YAML |
143
+ | Layout reproduzierbar | hängt an Vorlage und Umgebung | nicht zugesichert | ja — derselbe Renderer, dieselbe Ausgabe |
144
+ | Fertiges PDF wird nachgemessen | nein | nein | ja — 33 Maße, jede Seite, Abweichung ist ein Fehler |
145
+ | Absenderprofile | von Hand gepflegt | uneinheitlich | ja — einmal anlegen, überall nutzen |
146
+ | Prüfbericht maschinenlesbar | nein | nein | ja — `--json` und Exit-Codes |
147
+ | PDF/A als Voreinstellung | nicht automatisch | nicht zugesichert | ja — ohne zusätzliches Flag |
148
+
149
+ ## Was du davon hast
150
+
151
+ - **Der Brief sitzt im Fensterumschlag** — Anschriftfeld, Falz- und Lochmarken werden am
152
+ fertigen PDF vermessen, nicht beim Setzen angenommen.
153
+ - **Änderungen bleiben nachvollziehbar** — Markdown und YAML sind Textdateien. Ein Diff zeigt,
154
+ was sich geändert hat; das PDF ist Ergebnis, nicht Quelle.
155
+ - **Ein Auftritt, viele Briefe** — Profile bündeln Briefkopf, Fußzeile, Logo, Farben und
156
+ Voreinstellungen. Auch die Unterschrift, je Brief überschreibbar.
157
+ - **Fehler sind maschinenlesbar** — eigene Exit-Codes für Eingabe-, Geometrie- und
158
+ Umgebungsfehler, dazu `--json`. Damit läuft es in CI und in Automatisierungen.
159
+ - **Für Langzeitarchivierung ausgelegt** — PDF/A-2b ohne zusätzliches Flag. Dass die Datei die
160
+ Konformität wirklich einhält, sagt nicht dieses Werkzeug, sondern
161
+ [veraPDF](https://verapdf.org/) — die Referenzimplementierung der PDF Association, in CI bei
162
+ jedem Push. Optional PDF/UA-1 mit `--pdfua`, ebenfalls dort geprüft.
163
+ - **Im Gespräch oder im Terminal** — als Claude-Skill oder als CLI, ohne Systeminstallation.
164
+
165
+ ## Woran man sieht, dass es stimmt
166
+
167
+ Das ist der Teil, an dem sich das Versprechen entscheidet — deshalb steht er vor der Installation.
168
+
169
+ - **Gemessen wird das fertige PDF**, nicht die Eingabe. `verify` liest das erzeugte Dokument mit
170
+ pdfplumber und vergleicht Zonen, Marken und Abstände gegen die Sollwerte.
171
+ - **Jede tragende Prüfung hat eine [Gegenprobe](https://github.com/blitzsicht/falzmarke/blob/main/tests/test_gegenbeweis.py).** Sie läuft gegen ein
172
+ absichtlich verschobenes Layout und muss dort anschlagen — ein Prüfmittel, das nie rot werden
173
+ kann, wäre kein Nachweis.
174
+ - **CI auf Linux, macOS und Windows**, bei jedem Push.
175
+ - **Ein Frischinstallations-Test** führt die Befehle aus dieser README wirklich aus. Hier steht
176
+ kein Befehl, den niemand ausprobiert hat.
177
+ - **Alle Beispielbriefe werden in CI gerendert** und vermessen.
178
+ - **Die PDF-Konformität bestätigt ein fremdes Werkzeug.** Alles andere auf dieser Liste misst mit
179
+ demselben Code, der das PDF erzeugt hat — das belegt Selbsttreue, nicht Konformität.
180
+ [veraPDF](https://verapdf.org/) hat den Brief nicht geschrieben und teilt keine Zeile mit dem
181
+ Renderer. Geprüft wird, was die Datei selbst deklariert, auf der ausgelieferten Datei, mit
182
+ Prüfsummen-Abgleich — und mit einer Gegenprobe, die ein absichtlich nicht-konformes PDF
183
+ durchfallen lässt ([`scripts/pdf_konformitaet.py`](https://github.com/blitzsicht/falzmarke/blob/main/scripts/pdf_konformitaet.py)).
184
+ - **Die Layoutbasis ist vendort und prüfsummengesichert** —
185
+ [`vendor/README.md`](https://github.com/blitzsicht/falzmarke/blob/main/skill/falzmarke/typst/vendor/README.md).
186
+
187
+ Zwei Aussagen, die gern verwechselt werden, hält das Projekt auseinander:
188
+
189
+ > **Der Sollwert ist fachlich belegt** und **der Verifier erkennt eine Abweichung davon** sind
190
+ > verschiedene Dinge. Das Zweite ist bewiesen. Das Erste hat Grenzen.
191
+
192
+ **Woher die Sollwerte stammen:** Maße und Schreibregeln folgen öffentlich dokumentierten Quellen
193
+ (Liste in [`skill/references/din5008.md`](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/din5008.md)); der Abgleich mit dem
194
+ Originaltext der DIN 5008:2020-03 einschließlich Berichtigung 1:2020-07 steht aus. Regeln aus
195
+ einzelnen Quellen wirken nur als Warnung. Welche Regel worauf beruht, steht in der
196
+ [Quellenlage je Regel](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/din5008.md#quellenlage-je-regel); was daraus rechtlich
197
+ folgt, in [`docs/recht.md`](https://github.com/blitzsicht/falzmarke/blob/main/docs/recht.md).
198
+
199
+ ```bash
200
+ python3 -m pytest -q
201
+ ```
202
+
203
+ ## Sicherheit
204
+
205
+ Genannt wird nur, was im Code steht und geprüft ist. falzmarke ist **nicht** unabhängig
206
+ auditiert — Sicherheitsrelevantes bitte nach [SECURITY.md](https://github.com/blitzsicht/falzmarke/blob/main/SECURITY.md), nicht als Issue.
207
+
208
+ - **Verarbeitung bleibt lokal.** Der Renderpfad importiert keine Netzwerkbibliothek.
209
+ - **YAML wird ausschließlich mit `safe_load` gelesen** — an jeder Stelle, auch beim
210
+ eingebetteten Profil.
211
+ - **Markdown läuft gegen eine Positivliste** von Knotentypen. Was nicht daraufsteht, ist ein
212
+ Fehler mit Zeilenangabe — nie ein stilles Durchreichen.
213
+ - **Brieftext wird nie zu Typst-Code.** Der Emitter übergibt ihn als maskierte Zeichenkette;
214
+ Sonderzeichen können die Struktur nicht verlassen.
215
+ - **Profil- und Briefdateien bleiben in ihrem Ordner.** Logo, Unterschrift und eigener Briefkopf
216
+ dürfen nicht darüber hinauszeigen, Symlinks werden aufgelöst
217
+ ([Gegenproben](https://github.com/blitzsicht/falzmarke/blob/main/tests/test_profilgrenze.py)).
218
+ - **Typst läuft auf ein eigenes Wurzelverzeichnis begrenzt**, Systemschriften sind abgeschaltet.
219
+ - **Alle Abhängigkeiten des Programms sind permissiv lizenziert** —
220
+ [THIRD_PARTY_LICENSES.md](https://github.com/blitzsicht/falzmarke/blob/main/THIRD_PARTY_LICENSES.md).
221
+ - **Die CI-Aktionen hängen an vollständigen Commit-SHAs**, nicht an verschiebbaren Tags.
222
+
223
+ Das Release-Asset lässt sich auf seine Herkunft prüfen:
224
+
225
+ ```bash
226
+ gh attestation verify falzmarke.skill --repo blitzsicht/falzmarke
227
+ ```
228
+
229
+ Das belegt, aus welchem Lauf und welchem Commit die Datei stammt — **nicht, dass sie fehlerfrei
230
+ ist**. Die SHA-256-Summe steht in der Release-Notiz und als `falzmarke.skill.sha256` daneben.
231
+
232
+ ## In 60 Sekunden
233
+
234
+ ### Mit Claude
235
+
236
+ 1. **[`falzmarke.skill` herunterladen](https://github.com/blitzsicht/falzmarke/releases/latest/download/falzmarke.skill)**
237
+ 2. In Claude unter Einstellungen › Capabilities hochladen (Tarif mit Code-Ausführung nötig).
238
+ Für Claude Code genügt ein Symlink:
239
+ ```bash
240
+ ln -s "$PWD/skill" ~/.claude/skills/falzmarke
241
+ ```
242
+ 3. „Schreib einen Brief an die Muster GmbH, Angebot über …"
243
+
244
+ ### Im Terminal
245
+
246
+ ```bash
247
+ uvx --from git+https://github.com/blitzsicht/falzmarke falzmarke \
248
+ init brief.md --profil example --betreff "Angebot Nr. 2026-0815"
249
+ ```
250
+
251
+ oder dauerhaft installiert, danach genügt `falzmarke render brief.md --png`:
252
+
253
+ ```bash
254
+ pipx install git+https://github.com/blitzsicht/falzmarke
255
+ ```
256
+
257
+ Noch liegt das Paket **nicht auf PyPI** — deshalb die Adresse statt eines bloßen Namens
258
+ ([#7](https://github.com/blitzsicht/falzmarke/issues/7)).
259
+
260
+ Der Typst-Compiler kommt als Python-Wheel mit: **keine Systeminstallation**, kein LaTeX, kein
261
+ wkhtmltopdf, keine Schriftinstallation.
262
+
263
+ <details>
264
+ <summary>Aus einem Clone, ohne Installation</summary>
265
+
266
+ ```bash
267
+ git clone https://github.com/blitzsicht/falzmarke.git
268
+ cd falzmarke
269
+ python3 skill/scripts/bootstrap.py
270
+ python3 skill/scripts/falzmarke.py render examples/brief-form-b.md --png
271
+ ```
272
+
273
+ </details>
274
+
275
+ ## Einen Brief schreiben
276
+
277
+ ```markdown
278
+ ---
279
+ profil: example
280
+ empfaenger:
281
+ - Muster GmbH
282
+ - Frau Erika Muster
283
+ - Musterstraße 1
284
+ - 12345 Musterstadt
285
+ datum: 2026-08-25
286
+ betreff: Angebot Nr. 2026-0815 über die Neugestaltung Ihrer Website
287
+ anrede: Sehr geehrte Frau Muster,
288
+ anlagen:
289
+ - Angebot 2026-0815
290
+ ---
291
+ vielen Dank für Ihre Anfrage vom 20. August 2026. Anbei erhalten Sie unser Angebot.
292
+
293
+ Die Umsetzung dauert ab Ihrer Freigabe **sieben Werktage**.
294
+ ```
295
+
296
+ ```bash
297
+ python3 skill/scripts/falzmarke.py render brief.md --png
298
+ ```
299
+
300
+ Alle Felder stehen im [Datenvertrag](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/frontmatter.md). Ein Feld, das dort nicht
301
+ steht, bricht mit Zeilennummer und Vorschlag ab — es wird nie stillschweigend verworfen.
302
+
303
+ ### Was im Brieftext erlaubt ist
304
+
305
+ Der Text unter dem Frontmatter ist **falzmarke-Markdown**, eine dokumentierte Teilmenge von
306
+ [CommonMark](https://commonmark.org/):
307
+
308
+ | Das geht | Das erledigt falzmarke selbst |
309
+ |---|---|
310
+ | Absätze, `**fett**`, `*kursiv*` | `z. B.`, `10 %`, `§ 5` bekommen geschützte Leerzeichen |
311
+ | Aufzählungen und nummerierte Listen | `--` wird zum Halbgeviertstrich – so |
312
+ | Harter Umbruch mit `\` am Zeilenende | `"Wort"` wird zu „Wort“ |
313
+ | Pipe-Tabellen mit Ausrichtung | Tag und Monat bleiben zusammen: `25. August` |
314
+
315
+ Überschriften, Links, Bilder, Code und HTML sind **Fehler** — mit Zeile, Grund und Korrektur,
316
+ nie stillschweigend. Auf Papier gibt es keinen Link, und ein Bild im Fließtext verschöbe die
317
+ Geometrie, die danach gemessen wird.
318
+
319
+ Die vollständige Liste: [falzmarke-Markdown](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/markdown.md).
320
+
321
+ ## Beispiele
322
+
323
+ | Standardbrief | Einschreiben | Mehrseitig |
324
+ |---|---|---|
325
+ | ![Form B](https://github.com/blitzsicht/falzmarke/raw/main/docs/assets/demo/gallery-standard.png) | ![Vermerkzone](https://github.com/blitzsicht/falzmarke/raw/main/docs/assets/demo/gallery-einschreiben.png) | ![Folgeseiten](https://github.com/blitzsicht/falzmarke/raw/main/docs/assets/demo/gallery-mehrseitig.png) |
326
+ | Form B mit Informationsblock | Zusatz- und Vermerkzone | Kopfzeile und Seitenzählung |
327
+
328
+ Dazu Form A, Auslandsanschrift, Tabelle und ein Brief mit langem Informationsblock —
329
+ [alle Beispiele](https://github.com/blitzsicht/falzmarke/tree/main/examples/) und ihre [vollständigen Renderings](https://github.com/blitzsicht/falzmarke/tree/main/docs/renders/).
330
+
331
+ ## Grenzen
332
+
333
+ - **[falzmarke-Markdown](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/markdown.md) (CommonMark-Teilmenge)**: Absätze,
334
+ fett, kursiv, Aufzählungen, nummerierte Listen, harter Umbruch, Pipe-Tabellen. Alles andere
335
+ bricht mit Zeilenangabe ab, statt still etwas anderes zu setzen.
336
+ - **Zonengrößen der Norm**: Anschrift höchstens 6 Zeilen, Vermerke höchstens 3, Werte im
337
+ Informationsblock höchstens 32 Zeichen.
338
+ - **Keine Bilder im Fließtext** — ein Logo gehört ins Profil.
339
+ - **Nur DIN 5008.** Schweiz (SN 010130) und Österreich (ÖNORM A 1080) sind vorgemerkt
340
+ ([#10](https://github.com/blitzsicht/falzmarke/issues/10)); das Frontmatter-Feld `norm:` ist
341
+ dafür reserviert.
342
+ - **Keine Signatur.** Das Unterschriftsbild ist Erscheinungsbild, kein Nachweis. Eine
343
+ kryptografische Signatur ist Gegenstand von
344
+ [#14](https://github.com/blitzsicht/falzmarke/issues/14).
345
+
346
+ ## Weiterlesen
347
+
348
+ | | |
349
+ |---|---|
350
+ | [Befehle](https://github.com/blitzsicht/falzmarke/blob/main/docs/cli.md) | alle Unterbefehle, Exit-Codes, was geprüft wird |
351
+ | [Absenderprofile](https://github.com/blitzsicht/falzmarke/blob/main/docs/profiles.md) | Profil anlegen, Suchreihenfolge, eigener Briefkopf |
352
+ | [Datenvertrag](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/frontmatter.md) | jedes Frontmatter-Feld mit Beispiel |
353
+ | [falzmarke-Markdown](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/markdown.md) | was im Brieftext möglich ist |
354
+ | [Normmaße und Quellenlage](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/din5008.md) | Sollwerte und ihre Herkunft |
355
+ | [Was falzmarke behauptet — und was nicht](https://github.com/blitzsicht/falzmarke/blob/main/docs/recht.md) | Grenzen der Normaussage |
356
+ | [Aufbau des Repositorys](https://github.com/blitzsicht/falzmarke/blob/main/docs/architecture.md) | Schichten, Vendoring, warum das Paket unter `skill/` liegt |
357
+ | [Roadmap](https://github.com/blitzsicht/falzmarke/blob/main/docs/ROADMAP.md) | in welcher Reihenfolge gearbeitet wird, und was noch offen ist |
358
+ | [Changelog](https://github.com/blitzsicht/falzmarke/blob/main/CHANGELOG.md) · [Releases](https://github.com/blitzsicht/falzmarke/releases) | was sich geändert hat |
359
+
360
+ ## Mitmachen
361
+
362
+ Fehlerberichte und Vorschläge sind willkommen — siehe [CONTRIBUTING.md](https://github.com/blitzsicht/falzmarke/blob/main/CONTRIBUTING.md).
363
+ Bei einem Geometriefehler bitte die Ausgabe von `verify` mitschicken; ohne sie lässt sich nicht
364
+ unterscheiden, ob das Layout oder die Messung danebenliegt.
365
+
366
+ Sicherheitsrelevantes bitte nicht als Issue, sondern nach [SECURITY.md](https://github.com/blitzsicht/falzmarke/blob/main/SECURITY.md).
367
+
368
+ ## Herkunft und Dank
369
+
370
+ **Markdown** wurde 2004 von [John Gruber](https://daringfireball.net/projects/markdown/) gemeinsam
371
+ mit Aaron Swartz entworfen. Die Spezifikation dazu ist [CommonMark](https://commonmark.org/)
372
+ (John MacFarlane und Mitwirkende). falzmarke setzt eine dokumentierte Teilmenge davon um
373
+ — **[falzmarke-Markdown](https://github.com/blitzsicht/falzmarke/blob/main/skill/references/markdown.md)** — und weicht an drei Stellen bewusst
374
+ ab: HTML wird nie durchgereicht, Links werden nie gesetzt, und eine einzelne `2. Text`-Zeile
375
+ ohne weitere Listenpunkte ist ein Fehler statt einer Liste.
376
+
377
+ Das **Seitenlayout** stammt von [typst-letter-pro](https://github.com/Sematre/typst-letter-pro)
378
+ (MIT) von Sematre und ist unverändert vendort — Prüfsumme in
379
+ [`vendor/README.md`](https://github.com/blitzsicht/falzmarke/blob/main/skill/falzmarke/typst/vendor/README.md). falzmarke ergänzt die Schicht
380
+ darüber: Datenvertrag, Profile, Markdown-Eingabe, Messung und den Skill.
381
+
382
+ Gesetzt wird mit [Typst](https://typst.app) (Apache-2.0), geparst mit
383
+ [markdown-it-py](https://github.com/executablebooks/markdown-it-py) (MIT), gemessen mit
384
+ [pdfplumber](https://github.com/jsvine/pdfplumber) (MIT) und
385
+ [pypdf](https://github.com/py-pdf/pypdf) (BSD-3). Schriften: Libertinus und Source Sans 3
386
+ (beide OFL 1.1). Die vollständige Aufstellung samt der Begründung, warum PyMuPDF (AGPL-3.0)
387
+ ersetzt wurde, steht in [THIRD_PARTY_LICENSES.md](https://github.com/blitzsicht/falzmarke/blob/main/THIRD_PARTY_LICENSES.md).
388
+
389
+ **Alle Abhängigkeiten des Programms sind permissiv lizenziert** — falzmarke lässt sich damit
390
+ auch in geschlossene Systeme einbauen. Nicht permissiv ist allein
391
+ [Remotion](https://www.remotion.dev), womit der Erklärfilm gerendert wird: am Programm ist es
392
+ nicht beteiligt und wird nicht mitgeliefert.
393
+
394
+ **DIN 5008** ist eine Norm des DIN Deutsches Institut für Normung e. V. falzmarke ist kein
395
+ Produkt des DIN, steht in keiner Verbindung zum DIN und behauptet keine Zertifizierung. Wie die
396
+ Maße gemessen wurden, steht in [`docs/normmasse.md`](https://github.com/blitzsicht/falzmarke/blob/main/docs/normmasse.md).
397
+
398
+ ## Lizenz
399
+
400
+ [MIT](https://github.com/blitzsicht/falzmarke/blob/main/LICENSE)