Geschäftspost nach DIN 5008 aus Markdown — Brief und E-Mail, am fertigen Dokument nachgemessen.
MCP Server: io.github.blitzsicht/falzmarke
This MCP server provides “Geschäftspost nach DIN 5008 aus Markdown”—it generates business correspondence based on Markdown input, producing brief and email content. The documentation is “am fertigen Dokument nachgemessen,” indicating measurements are taken against the finalized document.
🛠️ Key Features
Geschäftspost (business correspondence) following DIN 5008
Input in Markdown
Output includes brief (letter) and E-Mail formats
Measurement against the finished document (nachgemessen)
🚀 Use Cases
Creating DIN 5008-compliant business letters from Markdown
Drafting DIN 5008-compliant email correspondence
⚡ Developer Benefits
Markdown-based workflow for generating document content
DIN 5008 alignment focused on the finalized output
⚠️ Limitations
Server description does not specify any additional tools beyond brief and E-Mail generation from Markdown
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.
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.
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:
code
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 sind vier von 33 Zeilen des Geometrieberichts. Der Film zeigt, wie die übrigen
entstehen: Eine Linie fährt das Blatt ab und hält an jedem gemessenen Höhenmaß. Sie hält
dort, wo die Messung es sagt — bei diesen Prüfungen ist der gemessene Wert zugleich die
Stelle.
Ein Beispielbrief, daneben ein Textfeld. Eine grüne waagerechte Linie wandert von oben nach unten über das Blatt und hält nacheinander an acht Stellen: Rücksendeangabe bei 46,26 Millimetern, Infoblock bei 50,34, Anschrift erste Zeile bei 62,69 und letzte Zeile bei 77,86, Betreff bei 98,45, Falzmarke 1 bei 105,00, Lochmarke bei 148,50 und Falzmarke 2 bei 210,00. Bei jedem Halt stehen daneben der Name der Prüfung, Sollwert, gemessener Wert, Toleranz und das Wort eingehalten. Am Ende liegen alle acht Linien gleichzeitig auf dem Blatt und daneben steht: 33 von 33 Prüfungen eingehalten.
Acht der 33 Geometrieprüfungen tragen eine Höhe auf dem Blatt; die übrigen messen Breiten,
Abstände und Eigenschaften ohne Ort auf der Seite. Die Zahl 34 weiter oben zählt eine
mehr: Nach einem render sieht die CLI zusätzlich die PDF/A-Konformität nach, und die
liegt auf keinem Millimeter. Beide Zahlen stimmen, sie zählen Verschiedenes.
Keine Zahl im Film ist abgetippt — sie kommen alle aus verify --json, und
tests/test_messfilm.py hält den Film gegen einen frischen Messlauf. Verschiebt jemand
die Falzmarke um 2 mm, muss der betroffene Halt rot werden; tut er es nicht, schlägt der
Test fehl.
Die erste Zeile des Berichts oben spricht von einem Strich, den man auf einem
Vorschaubild kaum sieht — er ist 0,25 pt stark. Vergrößert sieht die Stelle so aus:
Ausschnitt vom linken Rand eines Briefes, sechs mal vier Millimeter groß: Eine gestrichelte grüne Hilfslinie markiert die Sollposition bei 105,00 Millimetern und geht auf gleicher Höhe in die kurze schwarze Falzmarke über, die knapp die halbe Bildbreite einnimmt. Daneben das ganze Blatt verkleinert, mit einem Rahmen um die vergrößerte Stelle. Darunter steht die gemessene Position 105,00 Millimeter.
Dort wird der Bogen gefaltet, damit die Anschrift im Fensterumschlag steht. Sitzt die
Marke falsch, faltet der Stapel falsch — und das fällt erst nach dem Druck auf.
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 — 34 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 — im Normalfall entsteht ein PDF/A-2b ohne
zusätzliches Flag, wird eine Datei eingebettet — jede Rechnung tut das —, entsteht stattdessen
ein PDF/A-3b
(ADR 0033).
Dass die Datei die behauptete Stufe 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. Das gilt auch für das Bild oben: Es entsteht zweimal, einmal aus dem
ausgelieferten Layout und einmal aus einem, in dem die Marke 2 mm zu tief sitzt.
Ein wechselndes Bild desselben Ausschnitts. Im ersten Zustand liegt die Falzmarke auf der
gestrichelten Sollinie bei 105,00 Millimetern, darunter steht 105,00 Millimeter und der Hinweis,
dass so ausgeliefert wird. Im zweiten springt die Marke deutlich nach unten, die Sollinie bleibt
wo sie war, darunter steht 107,00 Millimeter und der Hinweis, dass verify hier anschlägt.
Unterscheiden sich die beiden Ausschnitte nicht, zeigt der Ausschnitt die Marke gar nicht — dann
ist das Bild oben wertlos, und tests/test_detailbild.py schlägt fehl.
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üfsummengesichert —
vendor/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.
bash
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.
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
Vier Wege, und sie können nicht dasselbe:
Weg
rendert ohne Netz
Größe
wofür
falzmarke.skill hochladen
nein, der erste Lauf lädt nach
~0,8 MB
claude.ai — der Upload-Dialog nimmt höchstens 30 MB
falzmarke-offline.skill
ja — der Typst-Compiler reist mit
~34 MB
Sandboxen ohne PyPI-Zugriff; zu groß für den Upload-Dialog
pipx / uvx
nein, der erste Lauf lädt nach
~1 MB
Terminal
Repository klonen
nein, der erste Lauf lädt nach
~1 MB
Mitarbeit am Werkzeug
Die beiden Skill-Pakete unterscheiden sich in genau einer Datei: Das Offline-Paket trägt das
typst-Wheel in vendor/, das schlanke nicht. Warum es zwei sind und nicht eines, steht in
skill/vendor/README.md.
Die PDFs hängen danach als Artefakt am Lauf. Hält ein Brief die Maße nicht ein, wird der Lauf
rot und nennt Datei und Maß — ein Serienbrief-Archiv merkt einen verrutschten Betreff damit
beim Push und nicht beim Empfänger. Die Eingaben stehen in
action.yml; die Aktion
installiert falzmarke von PyPI und baut keine zweite Installationsstrecke auf. Wer den Lauf
nachfahrbar halten will, nennt eine feste Fassung: paket: "falzmarke==0.7.3".
In einem anderen KI-Client
falzmarke spricht MCP — damit setzen auch Clients Briefe, die keinen Claude-Skill kennen.
bash
pip install 'mcp>=2,<3'# das SDK ist nicht in der Grundausstattung
falzmarke mcp # Server über stdio
Der Server steht im offiziellen MCP-Registry
unter io.github.blitzsicht/falzmarke. Die Zeile im Kommentar darüber ist kein Schmuck: Das
Registry prüft damit, dass dieses PyPI-Paket zu diesem Servernamen gehört — es liest die
Projektbeschreibung auf PyPI, und die ist diese Datei.
Vier Werkzeuge: brief_rendern, email_setzen, brief_pruefen, profile_auflisten.
Der Messbericht kommt bei jedem Rendern mit — ein Dienst, der ein PDF zurückgibt und
offenlässt, ob die Maße stimmen, wäre ein PDF-Generator wie jeder andere.
Im Container — so bauen ihn auch die MCP-Verzeichnisse, das
Dockerfile liegt im
Wurzelverzeichnis:
bash
git clone https://github.com/blitzsicht/falzmarke.git && cd falzmarke
docker build -t falzmarke-mcp .
docker run --rm -i falzmarke-mcp # `-i` ist nötig: der Server liest von stdin
Das Absenderprofil darf als Objekt im Aufruf stehen. Ein Client ohne Zugriff auf das
Dateisystem des Servers kann so seinen eigenen Absender mitgeben, statt mit den Profilen zu
leben, die dort zufällig liegen.
Was der Dienst nicht tut: versenden, ablegen, zustellen. Er setzt und prüft
(ADR 0029).
---
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**.
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*
§ 5 mit geschütztem Leerzeichen
Aufzählungen und nummerierte Listen
-- wird zum Halbgeviertstrich – so
Harter Umbruch mit \ am Zeilenende
"Wort" wird zu „Wort“
Pipe-Tabellen mit Ausrichtung
Abkürzungen (z. B.), Datum (25. August), Einheiten (10 %, 5 kg) und Kürzel vor einer
Angabe (Tel., Nr.) setzt falzmarke nicht von selbst: Keine dieser Regeln steht auf
mehr als einer Quelle, die etwas dazu sagt — bei Abkürzungen und Datum trägt nur Wikipedia,
die zweite volle Quelle schweigt (#31). Deshalb warnt lint, statt zu ersetzen. Es meldet die
Stelle mit Zeile — dann setzt du das Leerzeichen selbst, mit (5 km). Welche
Regeln mehrfach belegt sind, steht in der
Tabelle Quellenlage je Regel.
Links, Bilder 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.
Zwischenüberschriften (# bis ####), tiefere Aufzählungen, Blockzitate und
wortgetreue Auszüge gibt es für lange Schreiben: dialekt: "1.1" im Frontmatter schaltet
sie frei. Ein Auszug bleibt Zeichen für Zeichen stehen — keine typografischen Ersetzungen,
kein Umbruch, keine Einfärbung, und nichts darin wird ausgeführt. Ohne das Feld gilt Fassung 1.0, und ein
bestehender Brief rendert unverändert.
Ein Schreiben mit typ: email im Frontmatter wird keine PDF-Seite, sondern eine .eml —
dieselbe Quelle, dasselbe Profil, dieselbe Signatur.
bash
falzmarke email nachricht.md --html
code
OK geschrieben: nachricht.eml
OK geschrieben: nachricht.html
OK verify: 22/22 Prüfungen bestanden
Die .eml öffnet das Mailprogramm, die .html der Browser. Mit --oeffnen legt falzmarke auf
macOS gleich einen Entwurf an — Empfänger, Betreff, Rumpf und Anhänge, mit Senden-Knopf, und
erst nach bestandener Prüfung. Wo dieser Weg nicht gemessen ist (Windows, Linux, Apple Mail),
wird die Datei übergeben; sie erscheint dort als Lesefenster, nicht als Entwurf, und das ist eine
Eigenschaft des Formats. Geprüft wird die fertige Datei:
MIME-Aufbau, format=flowed, Space-Stuffing, die Signaturtrennzeile, und ob im HTML nichts
steht, was dort nicht hingehört — kein Skript, kein externes Stylesheet, kein Zählpixel, keine
Tabelle als Layout. falzmarke verify --email misst auch Dateien, die von woanders kommen.
falzmarke versendet nichts. Es gibt keinen Versandbefehl und keine Option, die sendet: Wer
eine Datei erzeugt, haftet für ihren Inhalt; wer sie befördert, für Zustellung und Nachweis. Das
sind zwei Versprechen, und falzmarke gibt nur das erste
(ADR 0034). Der Entwurf ist davon nicht berührt und geht keinen
Schritt weiter: Entwurf ja, Senden nie — im Steuerskript steht kein Versandbefehl, und ein
Test misst das am ganzen Paket
(ADR 0038).
Wie die Datei aufgebaut ist, was bewusst fehlt und wo die Grenzen liegen:
Die E-Mail-Fassung. Vier
Beispiele liegen unter
examples/email/.
Rechnungen: ZUGFeRD und XRechnung
Ein Schreiben mit typ: rechnung wird wie ein Brief gesetzt und trägt zugleich einen Datensatz,
den keine Person liest: An Firmen geht die Rechnung als PDF mit eingebetteter ZUGFeRD-XML, an
Behörden geht dieselbe Rechnung als reine XRechnung-XML, ohne PDF.
bash
falzmarke render rechnung.md # PDF/A-3b mit eingebetteter ZUGFeRD-XML
falzmarke xml xrechnung.md -o rechnung.xml # nur die XML, für eine Behörde
Abgenommen wird das Ergebnis nicht von falzmarke selbst, sondern von zwei fremden Werkzeugen in
der CI: Mustang 2.26.0 prüft PDF und eingebettete XML gegen die
Schematron-Regeln der jeweiligen Fassung, der KoSIT-Validator 1.6.3 prüft eine XRechnung ein
zweites Mal mit der amtlichen Konfiguration.
falzmarke rechnet nicht. Es überträgt Positionen, Steuersätze und Summen aus der Quelle,
ohne sie zu bilden — es vergibt keine Rechnungsnummern, bucht nicht, mahnt nicht und versendet
nichts. Was das im Einzelnen heißt und was ausdrücklich nicht behauptet wird:
Rechnungen mit falzmarke.
Beispiele
Standardbrief
Einschreiben
Mehrseitig
Form B
Vermerkzone
Folgeseiten
Form B mit Informationsblock
Zusatz- und Vermerkzone
Kopfzeile und Seitenzählung
Dazu Form A, Auslandsanschrift, Tabelle, ein Brief mit langem Informationsblock und einer
mit englischer Beschriftung (sprache: en — deutsche Maße, englische Wörter) —
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 21 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.
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 wird gemeldet — gesetzt mit erhaltenem Startwert, damit nichts still
umnummeriert wird.
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.
Was sich zuletzt getan hat
Die letzten zwei Versionen im Wortlaut. Erzeugt aus CHANGELOG.md — dort ändern, dann python3 scripts/changelog.py.
v0.9.13 — 30.09.2026
Neu
Die Vorschau führt ins Mailprogramm, auch in Gmail und Outlook im Browser. Die .html-Vorschau einer E-Mail trägt jetzt einen Link „Im Mailprogramm öffnen“, der eine neue Nachricht mit Empfänger, Kopie, Betreff und Text anlegt. Er ist für die Programme gedacht, die keine .eml öffnen und die --oeffnen deshalb nicht erreicht. Anhänge, Formatierung, Signatur und Blindkopie trägt er nicht. Über 2000 Zeichen baut die Vorschau keinen Link, weil Firefox unter Windows und das klassische Outlook dort kürzen; sie nennt stattdessen den Grund. (#108)
Plugin für ChatGPT. Das Release trägt jetzt zusätzlich falzmarke-chatgpt-plugin.zip: derselbe Skill samt Typst-Compiler, verpackt als Plugin „Skills only“ zum Einreichen bei OpenAI. Anlass: Im Browser und auf dem Handy mit privatem Tarif nimmt ChatGPT eigene Skills nicht an, nur Plugins aus dem Verzeichnis. Der Packer prüft die Grenzen der Einreichung vorher und baut nichts, was OpenAI zurückweisen würde. Die Beschreibung des Skills ist dafür von 1281 auf 977 Zeichen gekürzt; alle Auslöser sind geblieben. (#375)
MCP-Referenzdienst über HTTPS.falzmarke.referenzdienst stellt Maße von Form A und B, die geprüften Regeln und ihre Quellen als MCP-Werkzeuge über Streamable HTTP bereit, zustandslos und nur lesend. Er setzt keine Briefe und nimmt keinen Text des Nutzers an; das hält ein Test am Quelltext fest. Gedacht als MCP-Teil eines Plugins für ChatGPT, falls OpenAI den Weg „Skills only“ nicht freischaltet. Der Einstieg für Vercel liegt unter mcp-dienst/, veröffentlicht ist noch nichts. (#377)
Behoben
Vorinstallierte Pakete werden auf ihre Version geprüft.scripts/bootstrap.py hat bisher jedes importierbare Paket übernommen. Eine Sandbox, die zum Beispiel pdfplumber 0.10 mitbringt, wäre deshalb still durchgegangen. Jetzt gilt eine Version, die nicht zur Grenze in requirements.txt passt oder sich nicht feststellen lässt, als fehlend und wird nachinstalliert. Die Meldung nennt die gefundene und die verlangte Version. (#374)
v0.9.12 — 27.09.2026
Neu
E-Mails setzen Überschriften, Zitate und wortgetreue Auszüge. Mit dialekt: "1.1" gilt für typ: email jetzt dasselbe wie im Brief. Bisher brach die E-Mail mit „setzt der HTML-Teil einer E-Mail noch nicht“ ab. Im HTML-Teil stehen Überschriften als fette Absätze (ab Ebene 3 zusätzlich kursiv), Zitate mit einer Linie am linken Rand und Auszüge in Festbreite; ein langer Auszug bricht nach dem Lesefenster um, statt die Nachricht waagerecht scrollen zu lassen. Im Klartextteil ist die Überschrift unterstrichen, das Zitat trägt > als Zitattiefe nach RFC 3676, und der Auszug bleibt eingerückt in festen Zeilen. verify --email lässt eine Zeile mit > nur dann durch, wenn ihr Wortlaut im HTML-Teil in einem Zitat steht; eine versehentlich ungestopfte Zeile bleibt ein Befund. Die Warnung zur Zeilenlänge eines Auszugs gilt nur noch im Brief, denn eine E-Mail hat keinen Satzspiegel. Neues Beispiel: examples/email/email-stellungnahme.md. (#109)
Infrastruktur
Der Drift-Wächter läuft vor jedem Release und kennt die PyPI-Einstellung.scripts/vor_dem_tag.sh fährt die Paketprüfung und danach repo_pruefung.py mit den gh-Rechten des Maintainers. Ein Token mit Admin-Leserecht in einem öffentlichen Repository kam nicht infrage. Neu geprüft werden die Schutzregeln des Environments pypi nach ADR 0036: Eine wieder eingeschaltete Freigabe von Hand, die v0.9.11 neun Stunden festhielt, fällt jetzt vor dem Tag auf (#359). Ist ein Wert nicht abfragbar, bricht das Skript ab, statt grün zu melden. (#211)
Davor liegen 31 weitere Versionen — der vollständige Verlauf steht in CHANGELOG.md.