From f31243781fef94f227e600a42960acd8593ae522 Mon Sep 17 00:00:00 2001 From: svemagie <869694+svemagie@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:11:37 +0100 Subject: [PATCH] Implement AI frontmatter defaults and metadata outputs --- _includes/layouts/page.njk | 47 +++++++++++++++++-- _includes/layouts/post.njk | 37 ++++++++++++--- blog.njk | 9 ++-- .../articles/du-machst-es-dir-aber-leicht.md | 5 ++ content/articles/murnauer-dialektik.md | 5 ++ .../perspektiven-auf-die-corona-demos.md | 5 ++ .../articles/soeders-tweet-zu-trumps-wahl.md | 5 ++ content/bookmarks/14b61.md | 5 ++ content/bookmarks/173ac.md | 5 ++ content/bookmarks/1a009.md | 5 ++ content/likes/ae278.md | 5 ++ content/likes/e15f0.md | 5 ++ content/notes/1e3e4.md | 5 ++ content/notes/9d830.md | 5 ++ content/pages/about.md | 5 ++ content/pages/now.md | 5 ++ content/pages/where.md | 5 ++ content/photos/77a2d.md | 5 ++ content/photos/941a3.md | 5 ++ content/reposts/b383a.md | 5 ++ eleventy.config.js | 38 ++++++++++++++- 21 files changed, 199 insertions(+), 17 deletions(-) diff --git a/_includes/layouts/page.njk b/_includes/layouts/page.njk index e5c7318..bf0d669 100644 --- a/_includes/layouts/page.njk +++ b/_includes/layouts/page.njk @@ -5,7 +5,15 @@ withSidebar: true {# Layout for slash pages (/about, /now, /uses, etc.) #} {# These are root-level pages created via Indiekit's page post type #} -
+{# AI metadata compatibility: support nested ai object plus legacy top-level keys #} +{% set aiMeta = ai or {} %} +{% set aiTextLevel = aiTextLevel or ai_text_level or aiMeta.textLevel or aiMeta.aiTextLevel or "0" %} +{% set aiCodeLevel = aiCodeLevel or ai_code_level or aiMeta.codeLevel or aiMeta.aiCodeLevel or "0" %} +{% set aiTools = aiTools or ai_tools or aiMeta.aiTools or aiMeta.tools %} +{% set aiDescription = aiDescription or ai_description or aiMeta.aiDescription or aiMeta.description %} +{% set aiUsed = (aiTextLevel and aiTextLevel !== "0") or (aiCodeLevel and aiCodeLevel !== "0") %} + +

{{ title }} @@ -76,10 +84,6 @@ withSidebar: true {% endif %} {# AI usage disclosure #} - {% set aiTextLevel = aiTextLevel or ai_text_level %} - {% set aiCodeLevel = aiCodeLevel or ai_code_level %} - {% set aiTools = aiTools or ai_tools %} - {% set aiDescription = aiDescription or ai_description %} {% if aiTextLevel or aiCodeLevel or aiTools %} {% endif %} @@ -138,6 +152,9 @@ withSidebar: true {# Pagefind filter metadata #} + + {# JSON-LD Structured Data for pages with AI transparency metadata #} +

diff --git a/_includes/layouts/post.njk b/_includes/layouts/post.njk index f6b9bd9..0d57212 100644 --- a/_includes/layouts/post.njk +++ b/_includes/layouts/post.njk @@ -2,7 +2,15 @@ layout: layouts/base.njk withBlogSidebar: true --- -
+{# AI metadata compatibility: support nested ai object plus legacy top-level keys #} +{% set aiMeta = ai or {} %} +{% set aiTextLevel = aiTextLevel or ai_text_level or aiMeta.textLevel or aiMeta.aiTextLevel or "0" %} +{% set aiCodeLevel = aiCodeLevel or ai_code_level or aiMeta.codeLevel or aiMeta.aiCodeLevel or "0" %} +{% set aiTools = aiTools or ai_tools or aiMeta.aiTools or aiMeta.tools %} +{% set aiDescription = aiDescription or ai_description or aiMeta.aiDescription or aiMeta.description %} +{% set aiUsed = (aiTextLevel and aiTextLevel !== "0") or (aiCodeLevel and aiCodeLevel !== "0") %} + +
{# Support both camelCase (Indiekit Eleventy preset) and underscore (legacy) property names #} {% set bookmarkedUrl = bookmarkOf or bookmark_of %} {% set likedUrl = likeOf or like_of %} @@ -69,10 +77,6 @@ withBlogSidebar: true {% include "components/reply-context.njk" %} {# AI usage disclosure — always shown, collapsed by default, placed after reply context #} - {% set aiTextLevel = aiTextLevel or ai_text_level or "0" %} - {% set aiCodeLevel = aiCodeLevel or ai_code_level %} - {% set aiTools = aiTools or ai_tools %} - {% set aiDescription = aiDescription or ai_description %}

{{ aiDescription }}

{% endif %}

Learn more about AI usage on this site

+
{# Pending syndication targets (for services like IndieNews that require u-syndication before webmention) #} @@ -209,6 +223,9 @@ withBlogSidebar: true {% else %}Note {% endif %} {{ date | date("yyyy") }} + {{ aiTextLevel }} + {{ aiCodeLevel or "0" }} + {% if aiUsed %}yes{% else %}no{% endif %} {% if category %} {% if category is string %} {{ category }} @@ -260,9 +277,15 @@ withBlogSidebar: true } }, "description": {{ postDesc | dump | safe }}{% if postImage and postImage != "" and (postImage | length) > 10 %}, - "image": ["{% if postImage.startsWith('http') %}{{ postImage }}{% elif '/' in postImage and postImage[0] == '/' %}{{ site.url }}{{ postImage }}{% else %}{{ site.url }}/{{ postImage }}{% endif %}"]{% endif %}{% if aiTextLevel or aiCodeLevel or aiTools %}, + "image": ["{% if postImage.startsWith('http') %}{{ postImage }}{% elif '/' in postImage and postImage[0] == '/' %}{{ site.url }}{{ postImage }}{% else %}{{ site.url }}/{{ postImage }}{% endif %}"]{% endif %}, "usageInfo": "{{ site.url }}/ai"{% set _aiParts = [] %}{% if aiTextLevel %}{% set _textLabel %}{% if aiTextLevel === "0" %}None{% elif aiTextLevel === "1" %}Editorial assistance{% elif aiTextLevel === "2" %}Co-drafting{% elif aiTextLevel === "3" %}AI-generated{% endif %}{% endset %}{% set _aiParts = (_aiParts.push("Text: " + _textLabel), _aiParts) %}{% endif %}{% if aiCodeLevel %}{% set _codeLabel %}{% if aiCodeLevel === "0" %}Human-written{% elif aiCodeLevel === "1" %}AI-assisted{% elif aiCodeLevel === "2" %}AI-generated{% endif %}{% endset %}{% set _aiParts = (_aiParts.push("Code: " + _codeLabel), _aiParts) %}{% endif %}{% if aiTools %}{% set _aiParts = (_aiParts.push("Tools: " + aiTools), _aiParts) %}{% endif %}, - "creativeWorkStatus": "{{ _aiParts | join(', ') }}"{% endif %} + "creativeWorkStatus": "{{ _aiParts | join(', ') }}", + "additionalProperty": [ + { "@type": "PropertyValue", "name": "aiTextLevel", "value": "{{ aiTextLevel }}" }, + { "@type": "PropertyValue", "name": "aiCodeLevel", "value": "{{ aiCodeLevel or '0' }}" }{% if aiTools %}, + { "@type": "PropertyValue", "name": "aiTools", "value": {{ aiTools | dump | safe }} }{% endif %} + ]{% if aiDescription %}, + "abstract": {{ aiDescription | dump | safe }}{% endif %} } diff --git a/blog.njk b/blog.njk index e1b92b9..afac632 100644 --- a/blog.njk +++ b/blog.njk @@ -324,12 +324,15 @@ permalink: "blog/{% if pagination.pageNumber > 0 %}page/{{ pagination.pageNumber {% endif %} {# AI usage badge — only show when AI was actually used (level > 0) #} - {% set postAiText = post.data.aiTextLevel or post.data.ai_text_level %} - {% set postAiCode = post.data.aiCodeLevel or post.data.ai_code_level %} + {% set postAi = post.data.ai or {} %} + {% set postAiText = post.data.aiTextLevel or post.data.ai_text_level or postAi.textLevel or postAi.aiTextLevel or "0" %} + {% set postAiCode = post.data.aiCodeLevel or post.data.ai_code_level or postAi.codeLevel or postAi.aiCodeLevel or "0" %} {% if (postAiText and postAiText !== "0") or (postAiCode and postAiCode !== "0") %} - + AI{% if postAiText %}: T{{ postAiText }}{% endif %}{% if postAiCode %}/C{{ postAiCode }}{% endif %} + + {% endif %} diff --git a/content/articles/du-machst-es-dir-aber-leicht.md b/content/articles/du-machst-es-dir-aber-leicht.md index 867634e..93610f1 100644 --- a/content/articles/du-machst-es-dir-aber-leicht.md +++ b/content/articles/du-machst-es-dir-aber-leicht.md @@ -7,6 +7,11 @@ category: - lang:de visibility: public permalink: https://blog.giersig.eu/articles/du-machst-es-dir-aber-leicht/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- Es gibt zwei Standards, wie viele Menschen reagieren, wenn sie zum ersten Mal von meiner Art, Beziehung zu definieren und zu leben, hören: diff --git a/content/articles/murnauer-dialektik.md b/content/articles/murnauer-dialektik.md index cf61072..9d365d6 100644 --- a/content/articles/murnauer-dialektik.md +++ b/content/articles/murnauer-dialektik.md @@ -8,6 +8,11 @@ category: - lang:de visibility: public permalink: https://blog.giersig.eu/articles/murnauer-dialektik/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- diff --git a/content/articles/perspektiven-auf-die-corona-demos.md b/content/articles/perspektiven-auf-die-corona-demos.md index 317d955..4f247d2 100644 --- a/content/articles/perspektiven-auf-die-corona-demos.md +++ b/content/articles/perspektiven-auf-die-corona-demos.md @@ -9,6 +9,11 @@ visibility: public updated: 2026-03-08T07:50:18.987Z summary: Über den “richtigen” Umgang mit der Corona-Pandemie wird gestritten und debattiert. Über den richtigen Umgang mit den rechtsoffenen Corona-Demos herrscht jedoch eine seltsam anmutende und verstörende Einigkeit. permalink: https://blog.giersig.eu/articles/perspektiven-auf-die-corona-demos/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- Über den “richtigen” Umgang mit der Corona-Pandemie wird gestritten und debattiert. Über den richtigen Umgang mit den rechtsoffenen Corona-Demos herrscht jedoch eine seltsam anmutende und verstörende Einigkeit. Hier und da wird zwar darauf hingewiesen, dass der Terminus “Covidioten” ableistisch ist und dass das Wort Verschwörungstheorie den falschen Anschein von Wissenschaftlichkeit erwecken kann und man darum besser “-ideologie” oder “-erzählung” nutzen sollte. Das sind fraglos wichtige Beiträge zu dieser Debatte. Aber um den Kern der Frage, nämlich, was so viele Menschen dazu bringt, solch offensichtlich unwissenschaftlichen Unfug zu vertreten, und aus jeglicher logischen Lebensführung herauszutreten und in die pure Emotion einzutreten, wird sich nichtwissenwollend und nichtinteressierend ausgeschwiegen. Diese Menschen werden kurzerhand als Verirrte stigmatisiert, und das Thema wird mit dieser breit geteilten und allseits anerkannten Erkenntnis schleunig abgeschlossen. diff --git a/content/articles/soeders-tweet-zu-trumps-wahl.md b/content/articles/soeders-tweet-zu-trumps-wahl.md index 4b9fc3d..e953fcb 100644 --- a/content/articles/soeders-tweet-zu-trumps-wahl.md +++ b/content/articles/soeders-tweet-zu-trumps-wahl.md @@ -8,6 +8,11 @@ category: - lang:de visibility: public permalink: https://blog.giersig.eu/articles/soeders-tweet-zu-trumps-wahl/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- > Amerika hat gewählt - und das eindeutig. Entgegen mancher Prognosen ist es ein klarer Sieg für Donald Trump und die Republikaner. Glückwunsch an Donald Trump. Für Deutschland muss sich jetzt aber einiges zwingend ändern. Natürlich bleiben die USA unser wichtigster Partner: Aber wir werden so gefordert wie nie. Es weht ein anderer Wind. Wir müssen uns deutlich mehr anstrengen, um mithalten zu können: Die Bundeswehr muss massiv gestärkt werden - statt zwei Prozent vom BIP braucht es mindestens drei Prozent und eine echte Wehrpflicht. Beides rasch! Und wirtschaftlich benötigt Deutschland ein komplettes Update mit vergleichbaren Steuern und Energiepreisen wie die USA. Klar ist auch: Einen gestärkten Donald Trump wird eine schwache und zerstrittene Bundesregierung wenig beeindrucken. Daher braucht es jetzt erst recht Neuwahlen und einen Neuanfang in Deutschland. Die Partnerschaft mit den USA bleibt zentral, aber sie muss mehr aus eigener Stärke heraus erfolgen. Kontinuität in der Schwäche hilft unserem Land nicht. diff --git a/content/bookmarks/14b61.md b/content/bookmarks/14b61.md index 9127ece..d4196e4 100644 --- a/content/bookmarks/14b61.md +++ b/content/bookmarks/14b61.md @@ -7,4 +7,9 @@ category: mpSyndicateTo: - https://blog.giersig.eu/ permalink: https://blog.giersig.eu/bookmarks/14b61/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- diff --git a/content/bookmarks/173ac.md b/content/bookmarks/173ac.md index 0c7d53b..70dbf38 100644 --- a/content/bookmarks/173ac.md +++ b/content/bookmarks/173ac.md @@ -5,6 +5,11 @@ bookmarkOf: https://rmendes.net/ category: dev updated: 2026-03-07T23:35:24.179Z permalink: https://blog.giersig.eu/bookmarks/173ac/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- Ricardo inspired this blog diff --git a/content/bookmarks/1a009.md b/content/bookmarks/1a009.md index c543ea9..0d21baa 100644 --- a/content/bookmarks/1a009.md +++ b/content/bookmarks/1a009.md @@ -7,6 +7,11 @@ category: mpSyndicateTo: - https://blog.giersig.eu/ permalink: https://blog.giersig.eu/bookmarks/1a009/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- Post your Swarm checkins to your website via Micropub. diff --git a/content/likes/ae278.md b/content/likes/ae278.md index c94d397..a66e686 100644 --- a/content/likes/ae278.md +++ b/content/likes/ae278.md @@ -9,4 +9,9 @@ syndication: mpSyndicateTo: - https://blog.giersig.eu/ permalink: https://blog.giersig.eu/likes/ae278/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- diff --git a/content/likes/e15f0.md b/content/likes/e15f0.md index 2e343d2..06a0a37 100644 --- a/content/likes/e15f0.md +++ b/content/likes/e15f0.md @@ -8,4 +8,9 @@ category: mpSyndicateTo: - https://blog.giersig.eu/ permalink: https://blog.giersig.eu/likes/e15f0/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- diff --git a/content/notes/1e3e4.md b/content/notes/1e3e4.md index 30315fe..f2f8aca 100644 --- a/content/notes/1e3e4.md +++ b/content/notes/1e3e4.md @@ -22,6 +22,11 @@ location: visibility: unlisted updated: 2026-03-08T14:52:23.406Z permalink: https://blog.giersig.eu/notes/1e3e4/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- indieweb diff --git a/content/notes/9d830.md b/content/notes/9d830.md index c834185..48ebd3e 100644 --- a/content/notes/9d830.md +++ b/content/notes/9d830.md @@ -4,6 +4,11 @@ visibility: public category: dev updated: 2026-03-08T07:53:02.269Z permalink: https://blog.giersig.eu/notes/9d830/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- Hello world! diff --git a/content/pages/about.md b/content/pages/about.md index bbfc37d..847831c 100644 --- a/content/pages/about.md +++ b/content/pages/about.md @@ -7,6 +7,11 @@ category: - slashpage updated: 2026-03-08T12:47:17.679Z permalink: https://blog.giersig.eu/about/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- My path has been anything but straight. I started out as a Unix administrator, spent some time DJing minimal techno, studied Sociology in Constance, and somehow ended up managing a mountaineering gear shop. For nearly a decade I ran a communication agency — writing, editing, advising clients across industries. Then came years as a social worker, helping young people and refugees find their footing in Germany. These days I work in public relations for a district office, with a focus on social issues. diff --git a/content/pages/now.md b/content/pages/now.md index b5a864c..6eb79c0 100644 --- a/content/pages/now.md +++ b/content/pages/now.md @@ -7,6 +7,11 @@ category: - slashpage updated: 2026-03-08T13:56:38.077Z permalink: https://blog.giersig.eu/now/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- This page is a [now page](https://nownownow.com/about), you should consider adding one if you have a website as well, inspiration comes [from here](https://slashpages.net/#defaults). diff --git a/content/pages/where.md b/content/pages/where.md index 5218a0f..cc7ee60 100644 --- a/content/pages/where.md +++ b/content/pages/where.md @@ -9,6 +9,11 @@ visibility: unlisted updated: 2026-03-08T14:11:03.969Z summary: A [where page](https://niqwithq.com/posts/where-are-you) is a place on the web to let others know about your current location. permalink: https://blog.giersig.eu/where/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- A [where page](https://niqwithq.com/posts/where-are-you) is a place on the web to let others know about your current location. Thanks to [Aaron Parecki](https://aaronparecki.com/) for ownyourswarm. diff --git a/content/photos/77a2d.md b/content/photos/77a2d.md index 91228f8..4a216eb 100644 --- a/content/photos/77a2d.md +++ b/content/photos/77a2d.md @@ -9,6 +9,11 @@ category: mpSyndicateTo: - https://blog.giersig.eu/ permalink: https://blog.giersig.eu/photos/77a2d/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- Shall we play a game? diff --git a/content/photos/941a3.md b/content/photos/941a3.md index e131a8d..9174832 100644 --- a/content/photos/941a3.md +++ b/content/photos/941a3.md @@ -5,6 +5,11 @@ photo: alt: blue and lilac alpenglow category: mountains permalink: https://blog.giersig.eu/photos/941a3/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- alpenglow diff --git a/content/reposts/b383a.md b/content/reposts/b383a.md index c9f6fc8..13b5654 100644 --- a/content/reposts/b383a.md +++ b/content/reposts/b383a.md @@ -9,6 +9,11 @@ syndication: mpSyndicateTo: - https://blog.giersig.eu/ permalink: https://blog.giersig.eu/reposts/b383a/ +ai: + textLevel: "0" + codeLevel: "0" + # aiTools: "Claude, ChatGPT, Copilot" + # aiDescription: "Optional disclosure about how AI was used" --- The path is there, the weather is perfect, our bodies are carrying us, and yet nothing happens. diff --git a/eleventy.config.js b/eleventy.config.js index 013e137..2055fe9 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -850,10 +850,43 @@ export default function (eleventyConfig) { }); // Filter AI-involved posts (ai-text-level > "0" or aiTextLevel > "0") + const getAiMetadata = (data = {}) => { + const aiMeta = (data && typeof data.ai === "object" && !Array.isArray(data.ai)) + ? data.ai + : {}; + + const textLevel = String( + data.aiTextLevel + ?? data.ai_text_level + ?? data["ai-text-level"] + ?? aiMeta.textLevel + ?? aiMeta.aiTextLevel + ?? "0", + ); + + const codeLevel = String( + data.aiCodeLevel + ?? data.ai_code_level + ?? data["ai-code-level"] + ?? aiMeta.codeLevel + ?? aiMeta.aiCodeLevel + ?? "0", + ); + + const tools = data.aiTools ?? data.ai_tools ?? aiMeta.aiTools ?? aiMeta.tools; + const description = + data.aiDescription + ?? data.ai_description + ?? aiMeta.aiDescription + ?? aiMeta.description; + + return { textLevel, codeLevel, tools, description }; + }; + eleventyConfig.addFilter("aiPosts", (posts) => { if (!Array.isArray(posts)) return []; return posts.filter((post) => { - const level = post.data?.aiTextLevel || post.data?.["ai-text-level"] || "0"; + const { textLevel: level } = getAiMetadata(post.data || {}); return level !== "0" && level !== 0; }); }); @@ -864,7 +897,8 @@ export default function (eleventyConfig) { const total = posts.length; const byLevel = { 0: 0, 1: 0, 2: 0, 3: 0 }; for (const post of posts) { - const level = parseInt(post.data?.aiTextLevel || post.data?.["ai-text-level"] || "0", 10); + const { textLevel } = getAiMetadata(post.data || {}); + const level = parseInt(textLevel || "0", 10); byLevel[level] = (byLevel[level] || 0) + 1; } const aiCount = total - byLevel[0];