Skip to main content
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.

CI Release License: MIT Python 3.11+ DIN 5008


Andere Werkzeuge erzeugen ein PDF. falzmarke prüft das Ergebnis.

Du schreibst den Inhalt als Markdown. falzmarke setzt daraus einen Geschäftsbrief nach DIN 5008:2020 als PDF/A — und misst anschließend das fertige PDF nach. Sitzt die Falzmarke nicht auf 105,0 mm, endet der Lauf mit einem Fehler statt mit einem Brief, der nur ungefähr stimmt.

⬇ Als Claude-Skill laden · In 60 Sekunden ausprobieren · Beispielbrief ansehen

Linux · macOS · Windows · 33 Maße je Seite · PDF/A-2b · MIT


In Bewegung

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.

Aufgezeichnet aus der echten CLI mit vhs; das Drehbuch steht in docs/marke/video/readme.tape. Ein Test hält den Mitschnitt gegen einen frischen Lauf, damit hier kein Terminal steht, das es so nie gab (tests/test_tape.py).


Was dabei herauskommt

Briefkopf, Anschriftfeld, Informationsblock und Betreff

Und was danach geprüft wird — Auszug aus dem Bericht, den jeder Lauf ausgibt:

OK    Falzmarke 1, y: soll 105.00 ist 105.00 (tol ±0.3)
OK    Infoblock, x-links: soll 125.00 ist 125.00 (tol ±0.5)
OK    Betreff, y-Oberkante: soll 98.47 ist 97.91 (tol -1.75/+0.6)
OK    Abstand Betreff → Anrede (2 Leerzeilen): soll 12.70 ist 12.70 (tol ±0.2)

Das Problem

Eine Briefvorlage kann nicht prüfen, ob das Ergebnis stimmt. Sie wird kopiert, jemand verschiebt eine Zeile, und der Fehler fällt erst am fertigen Stapel auf: Die Anschrift steht nicht mehr im Fensterausschnitt, alles muss neu gedruckt und kuvertiert werden — und wer mit Automationsrabatt einliefert, verliert ihn für diese Sendung.

Sprachmodelle verschärfen das. Sie formulieren gut, aber sie können keinen Text auf 45,0 mm setzen. Wer einen Brief von einer KI schreiben lässt, bekommt zuverlässig guten Inhalt in unzuverlässigem Layout.

Und ein Renderer kann ebenfalls Fehler haben — auch dieser hier.

Deshalb trennt falzmarke drei Dinge: Inhalt kommt als Markdown, lesbar und versionierbar. Das Layout setzt ein Renderer, der es immer gleich macht. Und die Prüfung misst das fertige PDF, statt dem Renderer zu glauben.

Warum nicht einfach Word oder ein Prompt?

Verglichen wird der typische Arbeitsablauf, nicht das Werkzeug an sich — mit einer sorgfältig gepflegten Vorlage lässt sich vieles davon erreichen.

Vorlage in Word / LibreOffice Brief direkt von einer KI falzmarke
Quelle diffbar und versionierbar teilweise selten ja — Markdown und YAML
Layout reproduzierbar hängt an Vorlage und Umgebung nicht zugesichert ja — derselbe Renderer, dieselbe Ausgabe
Fertiges PDF wird nachgemessen nein nein ja — 33 Maße, jede Seite, Abweichung ist ein Fehler
Absenderprofile von Hand gepflegt uneinheitlich ja — einmal anlegen, überall nutzen
Prüfbericht maschinenlesbar nein nein ja — --json und Exit-Codes
PDF/A als Voreinstellung nicht automatisch nicht zugesichert ja — ohne zusätzliches Flag

Was du davon hast

  • Der Brief sitzt im Fensterumschlag — Anschriftfeld, Falz- und Lochmarken werden am fertigen PDF vermessen, nicht beim Setzen angenommen.
  • Änderungen bleiben nachvollziehbar — Markdown und YAML sind Textdateien. Ein Diff zeigt, was sich geändert hat; das PDF ist Ergebnis, nicht Quelle.
  • Ein Auftritt, viele Briefe — Profile bündeln Briefkopf, Fußzeile, Logo, Farben und Voreinstellungen. Auch die Unterschrift, je Brief überschreibbar.
  • Fehler sind maschinenlesbar — eigene Exit-Codes für Eingabe-, Geometrie- und Umgebungsfehler, dazu --json. Damit läuft es in CI und in Automatisierungen.
  • Für Langzeitarchivierung ausgelegt — PDF/A-2b ohne zusätzliches Flag. Dass die Datei die Konformität wirklich einhält, sagt nicht dieses Werkzeug, sondern veraPDF — die Referenzimplementierung der PDF Association, in CI bei jedem Push. Optional PDF/UA-1 mit --pdfua, ebenfalls dort geprüft.
  • Im Gespräch oder im Terminal — als Claude-Skill oder als CLI, ohne Systeminstallation.

Woran man sieht, dass es stimmt

Das ist der Teil, an dem sich das Versprechen entscheidet — deshalb steht er vor der Installation.

  • Gemessen wird das fertige PDF, nicht die Eingabe. verify liest das erzeugte Dokument mit pdfplumber und vergleicht Zonen, Marken und Abstände gegen die Sollwerte.
  • Jede tragende Prüfung hat eine Gegenprobe. Sie läuft gegen ein absichtlich verschobenes Layout und muss dort anschlagen — ein Prüfmittel, das nie rot werden kann, wäre kein Nachweis.
  • CI auf Linux, macOS und Windows, bei jedem Push.
  • Ein Frischinstallations-Test führt die Befehle aus dieser README wirklich aus. Hier steht kein Befehl, den niemand ausprobiert hat.
  • Alle Beispielbriefe werden in CI gerendert und vermessen.
  • Die PDF-Konformität bestätigt ein fremdes Werkzeug. Alles andere auf dieser Liste misst mit demselben Code, der das PDF erzeugt hat — das belegt Selbsttreue, nicht Konformität. veraPDF hat den Brief nicht geschrieben und teilt keine Zeile mit dem Renderer. Geprüft wird, was die Datei selbst deklariert, auf der ausgelieferten Datei, mit Prüfsummen-Abgleich — und mit einer Gegenprobe, die ein absichtlich nicht-konformes PDF durchfallen lässt (scripts/pdf_konformitaet.py).
  • Die Layoutbasis ist vendort und prüfsummengesichertvendor/README.md.

Zwei Aussagen, die gern verwechselt werden, hält das Projekt auseinander:

Der Sollwert ist fachlich belegt und der Verifier erkennt eine Abweichung davon sind verschiedene Dinge. Das Zweite ist bewiesen. Das Erste hat Grenzen.

Woher die Sollwerte stammen: Maße und Schreibregeln folgen öffentlich dokumentierten Quellen (Liste in skill/references/din5008.md); der Abgleich mit dem Originaltext der DIN 5008:2020-03 einschließlich Berichtigung 1:2020-07 steht aus. Regeln aus einzelnen Quellen wirken nur als Warnung. Welche Regel worauf beruht, steht in der Quellenlage je Regel; was daraus rechtlich folgt, in docs/recht.md.

python3 -m pytest -q

Sicherheit

Genannt wird nur, was im Code steht und geprüft ist. falzmarke ist nicht unabhängig auditiert — Sicherheitsrelevantes bitte nach SECURITY.md, nicht als Issue.

  • Verarbeitung bleibt lokal. Der Renderpfad importiert keine Netzwerkbibliothek.
  • YAML wird ausschließlich mit safe_load gelesen — an jeder Stelle, auch beim eingebetteten Profil.
  • Markdown läuft gegen eine Positivliste von Knotentypen. Was nicht daraufsteht, ist ein Fehler mit Zeilenangabe — nie ein stilles Durchreichen.
  • Brieftext wird nie zu Typst-Code. Der Emitter übergibt ihn als maskierte Zeichenkette; Sonderzeichen können die Struktur nicht verlassen.
  • Profil- und Briefdateien bleiben in ihrem Ordner. Logo, Unterschrift und eigener Briefkopf dürfen nicht darüber hinauszeigen, Symlinks werden aufgelöst (Gegenproben).
  • Typst läuft auf ein eigenes Wurzelverzeichnis begrenzt, Systemschriften sind abgeschaltet.
  • Alle Abhängigkeiten des Programms sind permissiv lizenziertTHIRD_PARTY_LICENSES.md.
  • Die CI-Aktionen hängen an vollständigen Commit-SHAs, nicht an verschiebbaren Tags.

Das Release-Asset lässt sich auf seine Herkunft prüfen:

gh attestation verify falzmarke.skill --repo blitzsicht/falzmarke

Das belegt, aus welchem Lauf und welchem Commit die Datei stammt — nicht, dass sie fehlerfrei ist. Die SHA-256-Summe steht in der Release-Notiz und als falzmarke.skill.sha256 daneben.

In 60 Sekunden

Mit Claude

  1. falzmarke.skill herunterladen
  2. In Claude unter Einstellungen › Capabilities hochladen (Tarif mit Code-Ausführung nötig). Für Claude Code genügt ein Symlink:
    ln -s "$PWD/skill" ~/.claude/skills/falzmarke
    
  3. „Schreib einen Brief an die Muster GmbH, Angebot über …"

Im Terminal

uvx --from git+https://github.com/blitzsicht/falzmarke falzmarke \
    init brief.md --profil example --betreff "Angebot Nr. 2026-0815"

oder dauerhaft installiert, danach genügt falzmarke render brief.md --png:

pipx install git+https://github.com/blitzsicht/falzmarke

Noch liegt das Paket nicht auf PyPI — deshalb die Adresse statt eines bloßen Namens (#7).

Der Typst-Compiler kommt als Python-Wheel mit: keine Systeminstallation, kein LaTeX, kein wkhtmltopdf, keine Schriftinstallation.

Aus einem Clone, ohne Installation
git clone https://github.com/blitzsicht/falzmarke.git
cd falzmarke
python3 skill/scripts/bootstrap.py
python3 skill/scripts/falzmarke.py render examples/brief-form-b.md --png

Einen Brief schreiben

---
profil: example
empfaenger:
  - Muster GmbH
  - Frau Erika Muster
  - Musterstraße 1
  - 12345 Musterstadt
datum: 2026-08-25
betreff: Angebot Nr. 2026-0815 über die Neugestaltung Ihrer Website
anrede: Sehr geehrte Frau Muster,
anlagen:
  - Angebot 2026-0815
---
vielen Dank für Ihre Anfrage vom 20. August 2026. Anbei erhalten Sie unser Angebot.

Die Umsetzung dauert ab Ihrer Freigabe **sieben Werktage**.
python3 skill/scripts/falzmarke.py render brief.md --png

Alle Felder stehen im Datenvertrag. Ein Feld, das dort nicht steht, bricht mit Zeilennummer und Vorschlag ab — es wird nie stillschweigend verworfen.

Was im Brieftext erlaubt ist

Der Text unter dem Frontmatter ist falzmarke-Markdown, eine dokumentierte Teilmenge von CommonMark:

Das geht Das erledigt falzmarke selbst
Absätze, **fett**, *kursiv* z. B., 10 %, § 5 bekommen geschützte Leerzeichen
Aufzählungen und nummerierte Listen -- wird zum Halbgeviertstrich – so
Harter Umbruch mit \ am Zeilenende "Wort" wird zu „Wort“
Pipe-Tabellen mit Ausrichtung Tag und Monat bleiben zusammen: 25. August

Überschriften, Links, Bilder, Code und HTML sind Fehler — mit Zeile, Grund und Korrektur, nie stillschweigend. Auf Papier gibt es keinen Link, und ein Bild im Fließtext verschöbe die Geometrie, die danach gemessen wird.

Die vollständige Liste: falzmarke-Markdown.

Beispiele

Standardbrief Einschreiben Mehrseitig
Form B Vermerkzone Folgeseiten
Form B mit Informationsblock Zusatz- und Vermerkzone Kopfzeile und Seitenzählung

Dazu Form A, Auslandsanschrift, Tabelle und ein Brief mit langem Informationsblock — alle Beispiele und ihre vollständigen Renderings.

Grenzen

  • falzmarke-Markdown (CommonMark-Teilmenge): Absätze, fett, kursiv, Aufzählungen, nummerierte Listen, harter Umbruch, Pipe-Tabellen. Alles andere bricht mit Zeilenangabe ab, statt still etwas anderes zu setzen.
  • Zonengrößen der Norm: Anschrift höchstens 6 Zeilen, Vermerke höchstens 3, Werte im Informationsblock höchstens 32 Zeichen.
  • Keine Bilder im Fließtext — ein Logo gehört ins Profil.
  • Nur DIN 5008. Schweiz (SN 010130) und Österreich (ÖNORM A 1080) sind vorgemerkt (#10); das Frontmatter-Feld norm: ist dafür reserviert.
  • Keine Signatur. Das Unterschriftsbild ist Erscheinungsbild, kein Nachweis. Eine kryptografische Signatur ist Gegenstand von #14.

Weiterlesen

Befehle alle Unterbefehle, Exit-Codes, was geprüft wird
Absenderprofile Profil anlegen, Suchreihenfolge, eigener Briefkopf
Datenvertrag jedes Frontmatter-Feld mit Beispiel
falzmarke-Markdown was im Brieftext möglich ist
Normmaße und Quellenlage Sollwerte und ihre Herkunft
Was falzmarke behauptet — und was nicht Grenzen der Normaussage
Aufbau des Repositorys Schichten, Vendoring, warum das Paket unter skill/ liegt
Roadmap in welcher Reihenfolge gearbeitet wird, und was noch offen ist
Changelog · Releases was sich geändert hat

Mitmachen

Fehlerberichte und Vorschläge sind willkommen — siehe CONTRIBUTING.md. Bei einem Geometriefehler bitte die Ausgabe von verify mitschicken; ohne sie lässt sich nicht unterscheiden, ob das Layout oder die Messung danebenliegt.

Sicherheitsrelevantes bitte nicht als Issue, sondern nach SECURITY.md.

Herkunft und Dank

Markdown wurde 2004 von John Gruber gemeinsam mit Aaron Swartz entworfen. Die Spezifikation dazu ist CommonMark (John MacFarlane und Mitwirkende). falzmarke setzt eine dokumentierte Teilmenge davon um — falzmarke-Markdown — und weicht an drei Stellen bewusst ab: HTML wird nie durchgereicht, Links werden nie gesetzt, und eine einzelne 2. Text-Zeile ohne weitere Listenpunkte ist ein Fehler statt einer Liste.

Das Seitenlayout stammt von typst-letter-pro (MIT) von Sematre und ist unverändert vendort — Prüfsumme in vendor/README.md. falzmarke ergänzt die Schicht darüber: Datenvertrag, Profile, Markdown-Eingabe, Messung und den Skill.

Gesetzt wird mit Typst (Apache-2.0), geparst mit markdown-it-py (MIT), gemessen mit pdfplumber (MIT) und pypdf (BSD-3). Schriften: Libertinus und Source Sans 3 (beide OFL 1.1). Die vollständige Aufstellung samt der Begründung, warum PyMuPDF (AGPL-3.0) ersetzt wurde, steht in THIRD_PARTY_LICENSES.md.

Alle Abhängigkeiten des Programms sind permissiv lizenziert — falzmarke lässt sich damit auch in geschlossene Systeme einbauen. Nicht permissiv ist allein Remotion, womit der Erklärfilm gerendert wird: am Programm ist es nicht beteiligt und wird nicht mitgeliefert.

DIN 5008 ist eine Norm des DIN Deutsches Institut für Normung e. V. falzmarke ist kein Produkt des DIN, steht in keiner Verbindung zum DIN und behauptet keine Zertifizierung. Wie die Maße gemessen wurden, steht in docs/normmasse.md.

Lizenz

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

falzmarke-0.7.3.tar.gz (811.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

falzmarke-0.7.3-py3-none-any.whl (765.1 kB view details)

Uploaded Python 3

File details

Details for the file falzmarke-0.7.3.tar.gz.

File metadata

  • Download URL: falzmarke-0.7.3.tar.gz
  • Upload date:
  • Size: 811.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for falzmarke-0.7.3.tar.gz
Algorithm Hash digest
SHA256 d4393c6839c902e8415c427aad1a6cacc056ca15d100eed2c646ba01a3c4e0ba
MD5 a8a7ce46fb918ae9f7b29df45557671f
BLAKE2b-256 6c697c870c6c8a1bff636ae66d158bdbfe5ac77ccaf0533b17971a9debcca9f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for falzmarke-0.7.3.tar.gz:

Publisher: release.yml on blitzsicht/falzmarke

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file falzmarke-0.7.3-py3-none-any.whl.

File metadata

  • Download URL: falzmarke-0.7.3-py3-none-any.whl
  • Upload date:
  • Size: 765.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for falzmarke-0.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c69f5371ed99d27314c77c42012596af20a329126f3a57bd10cb1c4d5c70ad4c
MD5 eb77a1658bfb62036f77abf09d8418dd
BLAKE2b-256 8188aa1e44f9036bb3c1379b4fb1b0d6076c9d5effc65667ffe5077422202e40

See more details on using hashes here.

Provenance

The following attestation bundles were made for falzmarke-0.7.3-py3-none-any.whl:

Publisher: release.yml on blitzsicht/falzmarke

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.9.8

2 files

0.9.7

2 files

0.9.6

2 files

0.9.5

2 files

0.9.4

2 files

0.9.2

2 files

0.9.1

2 files

0.8.2

2 files

This release

0.7.3 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page