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.
falzmarke.com — Anleitung ohne Terminal · ⬇ Als Claude-Skill laden · In 60 Sekunden ausprobieren · Beispielbrief ansehen
Linux · macOS · Windows · 34 Maße je Seite · PDF/A-2b · MIT
In Bewegung
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
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 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.
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:
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 — 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.
verifyliest 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.
Unterscheiden sich die beiden Ausschnitte nicht, zeigt der Ausschnitt die Marke gar nicht — dann ist das Bild oben wertlos, und
tests/test_detailbild.pyschlä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.
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_loadgelesen — 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 lizenziert — THIRD_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
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.
Mit Claude
falzmarke.skillherunterladen- 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
- „Schreib einen Brief an die Muster GmbH, Angebot über …"
Im Terminal
uvx falzmarke init brief.md --profil example --betreff "Angebot Nr. 2026-0815"
oder dauerhaft installiert, danach genügt falzmarke render brief.md --png:
pipx install falzmarke
Das Paket liegt auf PyPI. Wer den unveröffentlichten
Stand von main will, nimmt weiterhin die Adresse:
pipx install git+https://github.com/blitzsicht/falzmarke
Der Typst-Compiler kommt als Python-Wheel mit: keine Systeminstallation, kein LaTeX, kein wkhtmltopdf, keine Schriftinstallation.
In einem Repository voller Briefe
Wer seine Briefe versioniert, lässt sie bei jedem Push setzen und nachmessen:
- uses: blitzsicht/falzmarke@main
with:
briefe: "briefe/*.md"
profile: "profile"
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.
pip install 'mcp>=2,<3' # das SDK ist nicht in der Grundausstattung
falzmarke mcp # Server über stdio
Drei Werkzeuge: brief_rendern, 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.
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).
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 |
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.
Die vollständige Liste: falzmarke-Markdown.
Dieselbe Datei als E-Mail
Ein Schreiben mit typ: email im Frontmatter wird keine PDF-Seite, sondern eine .eml —
dieselbe Quelle, dasselbe Profil, dieselbe Signatur.
falzmarke email nachricht.md --html
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 übergibt falzmarke
die fertige Nachricht gleich dem Programm, das im System für .eml eingetragen ist — erst nach
bestandener Prüfung, und ohne selbst ein Programm auszusuchen. Sie erscheint dort als
Lesefenster, nicht als Entwurf; das ist eine Eigenschaft des Formats und in drei Programmen
nachgemessen. 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). Öffnen ist davon nicht berührt und geht auch keinen Schritt weiter: eine Datei ans Betriebssystem übergeben — kein Entwurf, keine Steuerung des Mailprogramms (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/.
Beispiele
| Standardbrief | Einschreiben | Mehrseitig |
|---|---|---|
| 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.
Weiterlesen
| Befehle | alle Unterbefehle, Exit-Codes, was geprüft wird |
| Absenderprofile | Profil anlegen, Suchreihenfolge, eigener Briefkopf |
| Die E-Mail-Fassung | Aufbau der .eml, ihre Teile und Grenzen |
| 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 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.4 — 07.09.2026
Behoben
-
Fünf Stellen, an denen v0.9.3 die eigenen Regeln verletzte. Ein Mehr-Augen-Review der Runde förderte sie zutage; jede ist am Code nachgemessen.
Der Regelkatalog
regeln/email.yamlbehauptete weiter, den Zeitpunkt setze der Mailclient — dieselbe Aussage, die kurz zuvor an fünf anderen Stellen korrigiert worden war. Von dort wanderte sie über den Generator in die Referenz.references/frontmatter.mdundREADME.mdnannten „höchstens 32 Zeichen" für Werte im Informationsblock, während die Grenze auf 21 steht: Wer sich danach richtete, lief in einen harten Abbruch. Und der Docstring voneml.baue()sagte „ohne Date", zwanzig Zeilen unter dem Modulkopf, der das Gegenteil erklärt.Zwei funktionale Befunde dazu. Der Hinweis auf eine gesetzte Blindkopie erreichte nur die Kommandozeile — der MCP-Dienst ruft
setze_emaildirekt auf und gab nur „bestanden: true" zurück, also genau die Lage, die der Hinweis verhindern sollte, auf dem Hauptweg des Pakets. Er steht jetzt an einer einzigen Stelle (eml.blindkopie_hinweis) und wird von beiden Wegen benutzt. Außerdem meldeteverify --emailbei einem unlesbarenBcc„steht nicht im sichtbaren Teil" — geprüft wurde dabei eine leere Adressmenge gegen den Text, also nichts.Damit die beiden Textbefunde nicht wiederkehren, hält
tests/test_textkanon.pysie jetzt fest: eine Prüfung gegen die zurückgenommeneDate-Behauptung über alle Textquellen einschließlich YAML — die Lücke, durch die der Regelkatalog gefallen war —, und eine, die die Zahl in der Doku gegenINFOBLOCK_WERT_MAXhält. Der Changelog-Verlauf bleibt ausgenommen: Dort steht die alte Aussage zu Recht, als Zitat dessen, was korrigiert wurde. (#253)
v0.9.3 — 04.09.2026
Neu
-
falzmarke email --oeffnenübergibt die fertige Nachricht dem Standardprogramm. Bisher endete der Befehl damit, dass ein Pfad im Terminal stand; wer die.emlansehen oder weiterleiten wollte, suchte sie im Dateimanager. Das Flag erspart diesen Weg — und sonst nichts: Es übergibt eine Datei an das Betriebssystem, sucht keine Anwendung aus und steuert kein Mailprogramm. Übergeben wird erst nach bestandener Prüfung, ohne Flag öffnet nichts, und ein Fehlschlag beim Öffnen lässt den Exit-Code bei 0 — die Nachricht ist ja geschrieben und gemessen. Dass sie im Mailprogramm als Lesefenster erscheint und nicht als Entwurf, bleibt wahr und steht in der Doku; der nächste Handgriff heißt weiterhin „Weiterleiten" (ADR 0038). (#239) -
bcc:im Frontmatter einer E-Mail. Ein verbreitetes Muster in der Geschäftskorrespondenz ist eine Archivadresse im Blindverteiler, über die jede ausgehende Mail im Dokumentenmanagement landet. Bisher kannte der Datenvertrag nuran:undcc:, und die Adresse musste im Mailprogramm bei jeder einzelnen Nachricht von Hand nachgetragen werden — wird sie einmal vergessen, ist die Mail trotzdem raus und sieht in jeder Hinsicht erledigt aus, nur existiert kein Beleg.Die Adresse steht jetzt als
Bcc:in der.emlund wird wiean:undcc:auf ihre Form geprüft. In der.html-Vorschau erscheint sie nicht: Die ist zum Ansehen und Herauskopieren da, und eine sichtbare Zeile „Blindkopie" ginge beim Kopieren mit — das Feld täte dann das Gegenteil dessen, wofür es da ist.verify --emailmisst eigens, dass keine ihrer Adressen im Text- oder HTML-Teil vorkommt.Ob ein Mailprogramm die Kopfzeile beim Weiterleiten übernimmt, entscheidet das Programm; falzmarke versendet nicht (ADR 0034) und kann es deshalb nicht zusagen. Der Befehl nennt die Adresse beim Erzeugen darum eigens — wer die Zeile liest, sieht im Programm nach, statt den Blindverteiler für erledigt zu halten.
In einem Brief gibt es
bcc:nicht. Anders alscc:, das dortverteiler:heißt, bekommt es keinen Ersatzvorschlag: Wer eine Kopie erhält, ohne im Verteiler zu stehen, ist auf Papier nicht vorgesehen. (#242)
Geändert
-
Der Skill löst jetzt auch bei E-Mails aus. Seine Beschreibung nannte ausschließlich Papier — Brief, Kündigung, Mahnung, „etwas zum Ausdrucken oder Verschicken" — und kein einziges E-Mail-Wort. Da ein Assistent den Skill allein über Name und Beschreibung vorauswählt, war die seit v0.8.0 fertige E-Mail-Fassung im Auslösepfad unsichtbar: Wer „schreib eine E-Mail an …" sagte, bekam eine frei getippte Nachricht statt einer geprüften
.eml. Die Beschreibung nennt jetzt beide Ausgaben, führt die Auslöser für Mails mit und verbietet die selbstgebaute Nachricht so ausdrücklich, wie sie den frei gesetzten Brief schon verbot. (#238) -
Der Name in der Signatur trägt jetzt Gewicht. Er stand in derselben Größe da wie die Umsatzsteuer-Nummer drei Zeilen tiefer, und das Auge fand keinen Anker — beim Vergleich mit einem fremden Signaturgenerator fiel das als Erstes auf. Die erste Zeile des ersten Blocks ist jetzt 18px und halbfett. Bewusst ohne Akzentfarbe: Die Signatur gehört dem Absender, nicht dem Werkzeug, und eine profilabhängige Farbe kann nicht in den Dunkelregeln stehen — der Block ist eine Konstante, die zeichenweise verglichen wird. Größe und Gewicht tragen auf hellem wie auf dunklem Grund, ohne eine einzige Farbe zu setzen. (#243)
Behoben
-
Jede Nachricht trägt jetzt ein
Date. Bisher fehlte die Kopfzeile — außer bei gesetztemSOURCE_DATE_EPOCH—, weil das Datum beim Versand entstehen sollte. Diese Begründung setzte voraus, dass das Mailprogramm die.emlals Entwurf übernimmt und den Zeitpunkt selbst einsetzt; nach der eigenen Messung indocs/mailprogramme-2026-08-27.mdtut das keines der drei geprüften Programme. Der gangbare Weg ist „Weiterleiten", und dabei baut das Programm den zitierten Kopf aus den Feldern der Quelle: Das fehlende Feld erschien dort alsDatum: (null), (null)und ging mit raus. RFC 5322, Abschnitt 3.6, führtorig-dateohnehin als Pflichtfeld.SOURCE_DATE_EPOCHbehält den Vorrang und bleibt der Weg zum Golden-Vergleich; ohne die Variable steht der Zeitpunkt der Erzeugung in der Datei. Der eigentliche Befund war dabei der zweite:verify --emailmeldete solche Dateien grün. Die Prüfung misst jetzt beides — dassDatevorhanden und dass es nach RFC 5322 lesbar ist. (#236) -
Profilangaben wirken nicht mehr still falsch. Zwei Fälle aus einem echten Briefbau, beide daran erkennbar, dass das Werkzeug grün meldete und trotzdem etwas anderes tat als gemeint.
briefkopf.logo_hoehe_mmohnebriefkopf.logowirkt nie — die Höhe gehört zu einem Logo, das es nicht gibt.lintsagt das jetzt als Warnung; ein Fehler wäre es nicht, denn die Höhe kann für ein später ergänztes Logo schon dastehen. Der erste Treffer war das mitgelieferteexample.yamlselbst, wo die Höhe aktiv neben einem auskommentiertenlogo:stand; beide sind jetzt auskommentiert.Der zweite Fall betrifft die Wertespalte des Informationsblocks. Ein zu langer Wert brach den Lauf mit einer Meldung ab, die nur das letzte Wort des überstehenden Textes nannte — nicht das Feld, aus dem es stammt. Kommt der Wert aus
infoblock_defaults:des Profils, steht er nicht einmal in der Briefdatei, in der man ihn dann sucht. Die Meldung nennt jetzt Feld und Herkunft (infoblock_defaults.ansprechpartner im Profil), und rutscht ein Wert doch bis zum Prüfer am fertigen PDF durch, ordnet der den Überlauf der Wertespalte zu.Beim Nachmessen stellte sich heraus, dass die Grenze selbst zu hoch war: 21 Zeichen statt 32. Die alte Zahl kam aus „43 mm Spaltenbreite, 1,24 mm je Zeichen", und beides war zu groß — die Spalte beginnt bei 157 mm und der Satzspiegel endet bei 190, nutzbar sind also 33 mm, und ein Name braucht rund 1,55 mm je Zeichen statt 1,24. Schon „Dr. Anna Meyer-Schmidt" (22 Zeichen) riss den Rand, ohne beanstandet zu werden. Beide Kopien der Konstanten sind dabei zu einer zusammengeführt; sie standen unabhängig in
cli.pyundlint.py, ohne dass ein Test sie zusammenhielt. (#244) -
Die Warnung zu
datum:in einer E-Mail erklärte das Gegenteil dessen, was geschieht. Sie sagte „der Mailclient setzt es beim Versand" — seit derDate-Kopfzeile (#236) setzt falzmarke den Zeitpunkt selbst. Der Hinweis, dass das Feld in einer Mail nichts bewirkt, bleibt richtig; nur seine Begründung stimmte nicht mehr. Betroffen waren neben dem Nutzertext vier weitere Stellen mit derselben Aussage, darunterreferences/frontmatter.md, aus dem auch das Sprachmodell liest.Dabei kam ein Test heraus, der nie rot werden konnte: Er verglich die Kopfzeile mit der Zeichenkette
2026-08-29, die ein RFC-5322-Datum (Sat, 29 Aug 2026 …) gar nicht enthalten kann. Er liest das Datum jetzt und hält es gegen den Tag des Briefes. (#249)
Davor liegen 22 weitere Versionen — der vollständige Verlauf steht in CHANGELOG.md.
Lizenz
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file falzmarke-0.9.4.tar.gz.
File metadata
- Download URL: falzmarke-0.9.4.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ee6f7db2fee07ca7b909cee73e59bca4627d66a8b2062bef178e64fd07aa873
|
|
| MD5 |
5cade5ab2845fdc75c64fb882c13d329
|
|
| BLAKE2b-256 |
e95d6f99223b919ddd694d311f8bd58c605bd77772f08f76f04edfaa779feac0
|
Provenance
The following attestation bundles were made for falzmarke-0.9.4.tar.gz:
Publisher:
release.yml on blitzsicht/falzmarke
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
falzmarke-0.9.4.tar.gz -
Subject digest:
3ee6f7db2fee07ca7b909cee73e59bca4627d66a8b2062bef178e64fd07aa873 - Sigstore transparency entry: 2748207286
- Sigstore integration time:
-
Permalink:
blitzsicht/falzmarke@54ef490cde4cb9f8254eebe07cb87b9a073eb926 -
Branch / Tag:
refs/tags/v0.9.4 - Owner: https://github.com/blitzsicht
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@54ef490cde4cb9f8254eebe07cb87b9a073eb926 -
Trigger Event:
push
-
Statement type:
File details
Details for the file falzmarke-0.9.4-py3-none-any.whl.
File metadata
- Download URL: falzmarke-0.9.4-py3-none-any.whl
- Upload date:
- Size: 897.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0978b9c0bce42a93ef702df6020c236b7cc788aba94ed4772203749307cdea13
|
|
| MD5 |
c1e26865e05004713fa52974d4c2a672
|
|
| BLAKE2b-256 |
0f8f33d7b262e0e7b09c1f1dff40d7fa25c2f30f62f5dd9f4359f99f79d98f2a
|
Provenance
The following attestation bundles were made for falzmarke-0.9.4-py3-none-any.whl:
Publisher:
release.yml on blitzsicht/falzmarke
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
falzmarke-0.9.4-py3-none-any.whl -
Subject digest:
0978b9c0bce42a93ef702df6020c236b7cc788aba94ed4772203749307cdea13 - Sigstore transparency entry: 2748207360
- Sigstore integration time:
-
Permalink:
blitzsicht/falzmarke@54ef490cde4cb9f8254eebe07cb87b9a073eb926 -
Branch / Tag:
refs/tags/v0.9.4 - Owner: https://github.com/blitzsicht
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@54ef490cde4cb9f8254eebe07cb87b9a073eb926 -
Trigger Event:
push
-
Statement type: