KI-Kennzeichnung ohne CMS: Next.js, Nuxt, Hugo und andere Generatoren

- Drei Wege: von Hand im Template, über das Front Matter oder automatisiert per Script.
- Es steht kein Redaktionssystem dazwischen – die Angabe lebt im Template oder beim Inhalt.
- Die meisten Generatoren hängen Bildern beim Bauen eine Prüfsumme an den Dateinamen.
- Bei vibe-codeten Projekten sind generierte Bilder eher die Regel als die Ausnahme.
Worum es hier geht: Um Frameworks und Generatoren, die eine Website vorab zu fertigen Dateien bauen oder sie auf dem Server zusammensetzen – von Next.js und Nuxt über Hugo bis zu handgeschriebenem HTML. Gemeinsam ist ihnen, dass kein Redaktionssystem dazwischensteht.
Statische Websites sind für dieses Thema der unkomplizierteste Fall. Was ausgeliefert wird, steht fertig in der Datei – kein Datenmodell dazwischen, keine API, kein Zugang nötig. Der Abgleich liest schlicht das, was auch der Besucher bekommt.
Dieses Kapitel gilt für alles, was fertige Seiten ausliefert – Next.js und Nuxt ebenso wie Hugo, Eleventy, Jekyll, Zola, SvelteKit, vibe-codete Projekte aus Cursor, v0 oder Bolt und handgeschriebenes HTML. Für Astro, Framer und Lovable gibt es eigene Kapitel, weil dort je eine Besonderheit dazukommt.
Beide rendern standardmäßig auf dem Server – dann steht alles im HTML und dieses Kapitel gilt unverändert.
Es lässt sich aber pro Seite anders einstellen. Eine Route, die ihre Inhalte erst im Browser lädt, liefert dieselbe leere Hülle wie eine reine Browser-Anwendung. Der Verbindungstest sagt Ihnen, wie es bei Ihrer Seite aussieht: Er nennt gefundene Seiten und gefundene Bilder.
Was bei Websites ohne CMS besonders ist
Es gibt kein Medienverzeichnis. Wo ein CMS eine Mediathek hat, liegen die
Bilder hier verstreut: im Repository unter public/ oder static/, neben den
Inhalten, teilweise fest im Template. Eine zentrale Liste, in der man
nachschauen könnte, existiert nicht.
Die Angabe lebt im Code oder beim Inhalt. Es gibt kein Feld, das jemand ohne Entwicklungsumgebung setzen könnte. Das heißt nicht, dass es aufwendig wäre – aber es heißt, dass die Entscheidung „ist das KI?” dort landen muss, wo auch der Inhalt gepflegt wird, sonst pflegt sie niemand.
Die Adresse eines Bildes ist selten sein Dateiname. Viele Generatoren hängen
beim Bauen eine Prüfsumme an – aus hero.avif wird hero.C4fR9z2q.avif, damit
Browser-Caches sauber greifen. Andere schieben Bilder durch einen Optimierer und
liefern sie unter einer ganz anderen Adresse aus: Next.js etwa über
/_next/image?url=…&w=640, Nuxt über /_ipx/…. Für Sie ist beides ohne
Bedeutung – nur eine Kennzeichnung, die sich am Dateinamen festhält, hätte damit
ein Problem.
Wer eine Seite per Prompt entstehen lässt – mit Cursor, v0, Bolt oder Vergleichbarem –, bekommt Bilder mitgeliefert, ohne sie bewusst ausgewählt zu haben. Eigene Dateien lassen sich natürlich genauso hinzufügen; nur liegen danach beide Sorten nebeneinander im Repository, und man sieht es ihnen nicht an.
„Wir haben gar keine KI-Bilder” ist bei solchen Projekten deshalb selten die richtige Ausgangsannahme. Die Frage ist eher, welche der generierten Bilder reale Personen, Orte oder Ereignisse zeigen – denn erst dann greift die Pflicht. Ein abstraktes Farbmuster bleibt unbedenklich, das fotorealistische Team im Büro nicht.
Was vorher geklärt sein muss
Bevor Sie etwas einbauen, muss feststehen, welche Medien betroffen sind. Die Pflicht greift nicht bei allem, was mit KI zu tun hatte, sondern bei Deepfakes – siehe Was gekennzeichnet werden muss und Deepfake, KI-generiert, KI-bearbeitet. Für eine erste Einordnung genügen ein paar Fragen im Kennzeichnungs-Check.
Was die Kennzeichnung leisten muss
Ohne Redaktionssystem dazwischen bestimmen Sie das Markup vollständig selbst. Das hat eine angenehme und eine unangenehme Seite: Was Sie einmal als Partial oder Shortcode richtig bauen, ist überall richtig – und was Sie einmal falsch bauen, ist überall falsch. Worauf es ankommt, steht in Artikel 50 Absatz 5: Die Information muss spätestens beim ersten Ansehen bereitstehen, klar und eindeutig sein und den Barrierefreiheitsanforderungen entsprechen. Der Verhaltenskodex der EU-Kommission ergänzt die Platzierung – wahrnehmbar, nicht überlagert, im Inhalt eingebettet, möglichst auch beim Teilen noch sichtbar. An den Kodex muss sich nur binden, wer ihn unterzeichnet – an Artikel 50 alle.
Für ein Projekt ohne CMS folgt daraus:
- Bauen Sie es einmal, an einer Stelle. Ein Partial oder Shortcode ist hier mehr als Bequemlichkeit: Er ist der Unterschied zwischen einer Korrektur und vierzig.
- Metadaten ersetzen den Hinweis nicht. Auch wenn Ihr Bildpipeline-Schritt Herkunftsangaben durchreicht – sichtbar ist das für niemanden, und „klar und eindeutig” wird es damit nicht.
- Das Symbol braucht einen eigenen Alt-Text. Als CSS-Hintergrund gesetzt
trägt es keinen. Nehmen Sie ein
<img>mit sinnvollemaltoder setzen Sie einaria-label.
Weg A, von Hand im Template. Der Hinweis steht dort, wo das Bild gerendert wird. Als Partial oder Shortcode einmal gebaut, überall verwendbar – die Pflege bleibt trotzdem an Ihnen.
Weg B, über das Front Matter. Wer einen Beitrag schreibt, beantwortet die Frage einmal beim Inhalt. Wirkt aber nur für Medien, die auch über das Front Matter laufen.
Weg C, automatisiert. Ein Script kennzeichnet anhand einer zentral gepflegten Liste, unabhängig davon, wo ein Bild eingebunden ist. Dafür braucht es ein Werkzeug, das diese Liste führt.
Die Wege schließen sich nicht aus. Viele fangen mit A an und stellen um, wenn der Bestand wächst.
Weg A: von Hand im Template
Sinnvoll bei überschaubaren Projekten oder wenn nur einzelne Bilder betroffen sind. Ein Textelement unter dem Bild, dazu das Symbol:
<figure>
<img src="/bilder/hero.avif" alt="…" />
<figcaption class="ki-hinweis">
<img src="/eu-icons/ai_generated_black.svg"
alt="EU-Symbol: KI-generiert" width="20" height="20" />
Mit KI erstellt
</figcaption>
</figure>
Für das Symbol müssen Sie nichts entwerfen: Die EU-Kommission hat im Juni 2026 drei Zeichen veröffentlicht, die frei genutzt werden dürfen. Welches davon passt, hängt davon ab, wie stark KI beteiligt war:
KI war an der Erstellung beteiligt.
Komplett von einer KI erzeugt, ohne von Menschen geschaffene Elemente.
Bestehender Inhalt wurde mit KI verändert, etwa ein ausgetauschtes Gesicht.
Es gibt sie in Schwarz, Weiß und je einer halbtransparenten Fassung. Alle zwölf Dateien und die Platzierungsregeln stehen in Die offiziellen EU-Icons.
Ein Hinweis, der oft untergeht: Die Verwendung dieser Symbole ist freiwillig, die Kennzeichnungspflicht ist es nicht. Und die Kommission hat getestet, dass die Zeichen deutlich besser verstanden werden, wenn ein kurzer Text danebensteht – das Symbol allein sagt vielen Menschen noch nichts.
Bauen Sie sich das einmal als Partial oder Shortcode – bei Hugo etwa als
layouts/shortcodes/ki-hinweis.html, bei Eleventy als Shortcode, bei Next.js
als Komponente. Dann steht es an einer Stelle und lässt sich später dort ändern.
Der Haken ist die Pflege: Sie müssen wissen, welches Bild betroffen ist, und daran denken, wenn eines ausgetauscht wird.
Weg B: über das Front Matter
Der bessere Weg, sobald Inhalte aus Markdown-Dateien kommen – also bei Blogs, Projektlisten, Dokumentation. Die Entscheidung steht dann beim Inhalt und nicht im Layout:
---
titel: "Unser neues Bürogebäude"
bild: /bilder/buero.avif
bildKiErzeugt: true
---
Im Template gebunden, hier am Beispiel Hugo:
{{ with .Params.bild }}
<figure>
<img src="{{ . }}" alt="{{ $.Params.bildAlt }}" />
{{ if $.Params.bildKiErzeugt }}
<figcaption class="ki-hinweis">Mit KI erstellt</figcaption>
{{ end }}
</figure>
{{ end }}
Der Vorteil: Wer einen Beitrag schreibt, beantwortet die Frage einmal beim Inhalt. Neue Beiträge sind damit von Anfang an richtig ausgezeichnet.
Die Grenze: Es wirkt nur für Medien, die über das Front Matter laufen. Bilder, die direkt im Fließtext oder fest im Template stehen, bleiben Handarbeit nach Weg A.
Weg C: automatisiert mit wirklich.ai
Ab ein paar hundert Medien wird Handarbeit unwirtschaftlich. Und anders als bei Weg A und B haben Sie hier am Ende einen Nachweis darüber, wer wann was entschieden hat.
Voraussetzung: eine Sitemap
Der Abgleich liest die Seitenliste aus ihre-domain.de/sitemap.xml. Sehen Sie
dort zuerst nach – je nach Generator ist sie längst da:
- Hugo erzeugt sie ohne Zutun. Sie wäre nur weg, wenn jemand
disableKinds: ['sitemap']gesetzt hat. - Next.js über eine
sitemap.tsim App-Verzeichnis. - Nuxt über das Sitemap-Modul.
- Jekyll über das Plugin
jekyll-sitemap. - Eleventy über ein kleines Template – dort ist nichts eingebaut.
Fehlt sie, findet der Abgleich die Startseite und folgt einmal den internen Links. Für eine Seite mit zehn Unterseiten genügt das; bei zweihundert fehlt der größte Teil. Eine Sitemap anzulegen lohnt sich ohnehin, weil auch Suchmaschinen davon leben.
Anbindung einrichten
Beim Anlegen des Projekts in der wirklich.ai App wählen Sie Andere statische Website und tragen die Adresse Ihrer Live-Site ein. Mehr braucht es nicht: kein Zugriff auf Ihr Repository, kein Schlüssel, keine Änderung an Ihrem Build.
Zu den Prüfsummen in Dateinamen, die weiter oben stehen: Die gängigen Muster rechnet der Abgleich heraus und erkennt das Bild nach jedem Deployment wieder. Ihre Einstufungen bleiben also gültig.
Einbau der Scripte
In das Layout, das alle Seiten verwenden, vor dem schließenden </body>. Bei
Next.js gehört es in app/layout.tsx – am saubersten über die
Script-Komponente mit strategy="afterInteractive"; bei Nuxt in die
nuxt.config unter app.head.script:
<!-- wirklich.ai · KI-Kennzeichnung -->
<script src="https://cdn.wirklich.ai/label.js"
data-wirklich-site="IHRE-SITE-ID" async></script>
Unter 10 kB, lädt asynchron, setzt keine Cookies und braucht keine Consent-Anpassung.
Das Transparenz-Protokoll kommt auf eine Unterseite, verlinkt aus Footer oder Impressum:
<!-- wirklich.ai · KI-Transparenz-Protokoll -->
<div id="wirklich-protokoll"></div>
<script src="https://cdn.wirklich.ai/protokoll.js"
data-wirklich-site="IHRE-SITE-ID" async></script>
Ein Signet für den Footer gibt es zusätzlich – siehe Das wirklich.ai Signet und den Abschnitt am Ende dieses Kapitels.
Die Site-ID finden Sie in der wirklich.ai App. Dort hinterlegen Sie auch die Domains, auf denen die Scripte laufen dürfen – auf allen anderen bleiben sie stumm. Das ist praktisch, weil neben der Live-Domain meist noch eine Vorschauadresse des Hosters existiert.
Was der Abgleich nicht sieht
Zwei Dinge stehen nicht im HTML und bleiben deshalb unsichtbar: Bilder, die als CSS-Hintergrund gesetzt sind, und Medien, die erst nach einer Interaktion nachgeladen werden. Beides lässt sich von Hand über die Adresse ergänzen; die Kennzeichnung greift danach automatisch.
- Adresse Ihrer Live-Site eintragen, Abgleich starten.
- Die gefundenen Medien durchgehen und einstufen – geführt, Frage für Frage.
- Script einbauen. Ab jetzt trägt jedes eingestufte Medium seinen Hinweis.
- Nach jedem Deployment läuft der Abgleich automatisch weiter und meldet neue Medien.
Die Basisnutzung der wirklich.ai App ist dauerhaft kostenlos – kostenloses Konto erstellen.
Haltung zeigen: der wirklich.ai Transparenz-Pledge
Wer Aufwand in Transparenz steckt, muss das nicht im Hintergrund verstecken. Mit dem wirklich.ai Transparenz-Pledge setzen Sie ein Zeichen für ehrliche Kommunikation im Netz – unabhängig davon, ob Sie KI-Medien einsetzen und offen ausweisen oder vollständig auf echte Fotografie setzen.
Das Signet für Ihren Footer verlinkt direkt auf Ihr öffentliches Transparenz-Protokoll. Es zeigt Kundschaft, Partnern und Behörden auf einen Blick, dass auf Ihrer Website nicht nur behauptet, sondern geprüft wird:
Es behauptet bewusst wenig: keine Zertifizierung, keine Rechtskonformität, sondern nur, dass hier gekennzeichnet und darüber Buch geführt wird – nachprüfbar über das verlinkte Protokoll. Was es genau aussagt und was nicht, steht in Das wirklich.ai Signet.
Andere Systeme
Die Anforderungen sind überall dieselben, die Umsetzung nicht. Betreuen Sie weitere Websites, finden Sie hier die passende Anleitung:
Häufige Fragen
Für welche Generatoren gilt dieses Kapitel?
Für alle, die fertige Seiten ausliefern – Next.js und Nuxt ebenso wie Hugo, Eleventy, Jekyll, SvelteKit, vibe-codete Projekte aus Cursor, v0 oder Bolt und handgeschriebenes HTML. Astro, Framer und Lovable haben eigene Kapitel, weil dort je eine Besonderheit dazukommt; der Weg selbst ist derselbe.
Brauche ich einen Zugang für die Anbindung?
Nein. Statische Seiten werden über die Sitemap ihrer Live-Adresse gelesen. Es braucht keinen Zugriff auf Ihr Repository und keinen Schlüssel, und es kann nichts an Ihrem Projekt verändert werden – gelesen wird ausschließlich, was ohnehin öffentlich ausgeliefert wird.
Was, wenn meine Seite keine Sitemap hat?
Dann findet der Abgleich die Startseite und folgt einmal den internen Links von dort. Das reicht für kleine Seiten, verpasst aber alles, was tiefer liegt. Fast jeder Generator kann eine Sitemap erzeugen – bei Hugo genügt ein Eintrag in der Konfiguration, bei Eleventy ein kleines Template. Es lohnt sich unabhängig von uns, weil auch Suchmaschinen davon leben.
Bleiben meine Einstufungen erhalten, wenn ich neu baue?
Ja, sofern die Dateinamen stabil bleiben oder dem üblichen Muster mit Prüfsumme folgen. Der Abgleich rechnet die gängigen Build-Prüfsummen heraus und erkennt das Bild wieder. Wer Bilder bei jedem Build unter einem völlig neuen Namen ablegt, sollte das ändern – sonst ist jedes Bild nach jedem Deployment ein neues.
Muss ich jedes KI-Bild kennzeichnen?
Nein. Die Pflicht aus Artikel 50 Absatz 4 greift bei Deepfakes – also bei Inhalten, die reale Personen, Orte oder Ereignisse zeigen und für echt gehalten werden könnten. Abstrakte Hintergründe, Icons und erkennbar gezeichnete Illustrationen fallen in der Regel nicht darunter. Die Abgrenzung steht in Deepfake, KI-generiert, KI-bearbeitet, für eine schnelle Einordnung genügt der Kennzeichnungs-Check.
Warum findet der Abgleich manche Bilder nicht?
Weil sie nicht im ausgelieferten HTML stehen. Das betrifft vor allem Bilder als CSS-Hintergrund und Medien, die erst nach einer Interaktion nachgeladen werden. Solche Medien lassen sich in der wirklich.ai App von Hand über ihre Adresse ergänzen; die Kennzeichnung greift danach automatisch.
Quellen
Dieser Beitrag gibt den Verordnungstext und benannte Quellen wieder. Er ist keine Rechtsberatung und ersetzt im Einzelfall keine anwaltliche Prüfung.
Angaben zur Rechtslage, zu deren Auslegung sowie zu Funktionen, Oberflächen und Schnittstellen fremder Systeme geben den Stand zum oben genannten Datum wieder. Beides kann sich jederzeit und ohne Ankündigung ändern. Für Aktualität, Richtigkeit und Vollständigkeit übernehmen wir keine Gewähr; eine Haftung für Schäden aus der Nutzung dieser Inhalte, der beschriebenen Anleitungen oder der Code-Beispiele ist ausgeschlossen, soweit gesetzlich zulässig. Genannte Produkt- und Firmennamen gehören ihren jeweiligen Inhabern; eine Verbindung zu ihnen besteht nicht.