notACMS 1.2.0 — das Audit-Release
Ein vollständiges Code-, Sicherheits- und Theme-Audit in einem Release: ~170 Fixes, eine gehärtete Build-Pipeline, eine dokumentierte Theme-API und einige bewusste Breaking Changes.
Das Audit-Release
1.2.0 ist das Ergebnis eines vollständigen Audits von notACMS — Architektur, Sicherheit, Codequalität und beide Template-Bäume. Rund 170 Findings wurden behoben. Die Highlights:
Robustheit
- Eine Markdown-Datei mit kaputtem Frontmatter legt nicht mehr eine ganze Sprache oder den Build lahm — sie wird übersprungen und mit Pfad und Fehler gemeldet.
- Ein fehlendes
slug:kann die Startseite nicht mehr still übernehmen;posts_per_page: 0crasht den Blog nicht mehr; doppelte URLs, mehrdeutige Verzeichnisschlüssel und ungültige Tag-Werte erzeugen klare Build-Warnungen. - Entwürfe und geplante Seiten werden jetzt wirklich aus Builds, Menüs und
/llms.txtausgeschlossen — bisher wurden nur Beiträge gefiltert. app:build -o <dir>weigert sich ohne--force, ein anderes Verzeichnis als das konfigurierte Static-Verzeichnis zu leeren.- Der Aufruf von
/pl/beim ersten Besuch leitet nicht mehr auf die englische Version um — die URL gilt als Sprachauswahl und ein Cookie wird gesetzt. Das Locale-Cookie ist jetzt auchSecure-bedingt, sodass der Mechanismus in HTTP-Entwicklungsumgebungen funktioniert. - Suchergebnis-Ausschnitte zeigen jetzt hervorgehobene Begriffe als echte
<mark>-Markierungen statt als wörtlichen<mark>-Text. - Das bare Starter-Theme enthält jetzt Platzhalter-
contact_form-Werte in_site.yaml— kein Build-Fehler mehr bei einer Neuinstallation.
Sicherheit
- ImageMagick läuft über
Symfony\Processmit Argument-Arrays —exec()ist Geschichte. - Turnstile prüft jetzt den Antwort-Hostname gegen die
base_urlund loggt einen Fehler, wenn die mitgelieferten Test-Keys in Produktion aktiv sind. Ein Boot-Check warnt bei Platzhalter-APP_SECRET. - JSON-LD-Output ist hex-escaped (
</script>in einem Titel bricht nicht mehr aus), Übersetzungskataloge enthalten kein HTML mehr, und die nginx-Security-Header gelten jetzt auch für/assets/- und/media/-Antworten. - Die Kontakt-API mit Sprachpräfix war im Docker-Runtime-Deployment wegen eines nginx-Regex-Bugs unerreichbar — behoben.
Für Theme-Entwickler
- Neu: THEME_BUILDING.md — der vollständige Theme-API-Vertrag: Template-Kontexte pro Route, Twig-Funktionen und -Globals, die ContentItem-API und die Übersetzungsschlüssel, die jedes Theme definieren muss.
#[LocalizedRoute]funktioniert jetzt inlocal/src/Controller/, der Sprachwechsel funktioniert korrekt auf Seiten mit 3+ Sprachen, und die Static-Build-Pipeline ist in wiederverwendbare Services zerlegt.
Neu
- Der Static Build erzeugt jetzt eine
/llms.txt-Datei pro Sprache — die neuesten Beiträge in einem maschinenlesbaren Format für LLM-Kontextfenster. Konfigurierbar überllms_limitin_site.yaml(Standard: 5). Das Template ist per-Theme über den@base-Twig-Namespace überschreibbar.
Breaking Changes
Einige — jede mit einzeiliger Migration. directoryKey() liefert volle Content-Pfade (Basename-Lookups funktionieren weiter), getTree() ist nach ContentTreeProviderInterface umgezogen, blogPosting() nimmt eine benannte Map, der Kontext-Schlüssel lang_switch_url ist weg, vier tote Übersetzungsschlüssel wurden entfernt und das old-template-Paket aus 1.0 wurde eingestellt. Der vollständige Guide: UPGRADE-1.2.md.