--- 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 %} {% set replyTo = inReplyTo or in_reply_to %} {% set repostedUrl = repostOf or repost_of %} {% if title and not repostedUrl %}

{{ title }}

{% else %}
{% if replyTo %}↩ Reply{% elif likedUrl %}♥ Like{% elif repostedUrl %}♻ Repost{% elif bookmarkedUrl %}🔖 Bookmark{% else %}✎ Note{% endif %}
{% endif %}
Planted: {% if category | withoutGardenTags %}
    {# Handle both string and array categories #} {% if category is string %}
  • {{ category }}
  • {% else %} {% for cat in (category | withoutGardenTags) %}
  • {{ cat }}
  • {% endfor %} {% endif %}
{% endif %} {# Digital Garden stage badge #} {% include "components/garden-badge.njk" %}
{% if updated %}
Tended:
{% endif %}
{# Bridgy syndication content - controls what gets posted to social networks #} {# For interaction types (bookmarks, likes, replies, reposts), include the target URL #} {% set bridgySummary = description or summary or (content | ogDescription(280)) %} {% set interactionUrl = bookmarkedUrl or likedUrl or replyTo or repostedUrl %} {% if bridgySummary or interactionUrl %} {% endif %} {# Render photo(s) from frontmatter for photo posts - use eleventy:ignore to skip image transform #} {% if photo %} {% endif %} {% set isInteraction = replyTo or likedUrl or repostedUrl or bookmarkedUrl %} {% set hasContent = content and content | striptags | trim %} {% set contentWarning = contentWarning or content_warning %} {% if contentWarning %}
⚠ {{ contentWarning }} (click to show)
{{ content | safe }}
{% else %}
{{ content | safe }}
{% endif %} {# Rich reply context with h-cite microformat #} {% include "components/reply-context.njk" %} {# AI usage disclosure โ€” articles and notes only #} {% if '/articles/' in page.url or '/notes/' in page.url %}
AI: Text {% if aiTextLevel === "0" %}None{% elif aiTextLevel === "1" %}Editorial{% elif aiTextLevel === "2" %}Co-drafted{% elif aiTextLevel === "3" %}AI-generated{% endif %}{% if aiCodeLevel %} ยท Code {% if aiCodeLevel === "0" %}Human{% elif aiCodeLevel === "1" %}AI-assisted{% elif aiCodeLevel === "2" %}AI-generated{% endif %}{% endif %}{% if aiTools %} ยท {{ aiTools }}{% endif %} {% if aiDescription %}

{{ aiDescription }}

{% endif %}

Learn more about AI usage on this site

{% endif %} {# See Also โ€” explicit related: frontmatter + in-text links to other blog posts #} {% set _seeAlso = page.inputPath | seeAlsoLinks(related) %} {# Cross-link posts that share the same external target URL (repostOf, likeOf, etc.) #} {% set _targetUrl = repostedUrl or likedUrl or bookmarkedUrl or replyTo %} {% set _sameTarget = collections.posts | sameTargetPosts(_targetUrl, page.url) %} {% if _seeAlso.length > 0 or _sameTarget.length > 0 %}

See Also

{% endif %} {# Linked From โ€” merges plugin backlinks ([[wikilinks]]/internal HTML links) with the existing URL-scan filter. Deduplicated by URL. #} {% set _allBacklinks = (backlinks if backlinks else []) | mergeBacklinks(collections.posts | backlinksWith(page.url)) %} {% if _allBacklinks.length > 0 %}

Linked From

{% endif %} {# Pending syndication targets (for services like IndieNews that require u-syndication before webmention) #} {% if mpSyndicateTo %} {% endif %} {# Syndication Footer - shows where this post was also published #} {# Separate self-hosted AP URLs from external syndication targets #} {% set externalSyndication = [] %} {% set selfHostedApUrl = "" %} {% if syndication %} {% for url in syndication %} {% if url.indexOf(site.url) == 0 %} {% set selfHostedApUrl = url %} {% else %} {% set externalSyndication = (externalSyndication.push(url), externalSyndication) %} {% endif %} {% endfor %} {% endif %} {# Fallback: if no selfHostedApUrl from syndication yet, check mpSyndicateTo. This ensures the Fediverse button appears on the first build, before the syndication endpoint has run and added the URL to the syndication array. #} {% if not selfHostedApUrl and mpSyndicateTo %} {% for url in mpSyndicateTo %} {% if url.indexOf(site.url) == 0 %} {% set selfHostedApUrl = page.url | url %} {% endif %} {% endfor %} {% endif %} {% if externalSyndication.length or selfHostedApUrl %} {% endif %} {# Author h-card for IndieWeb authorship #} {# Pagefind filter metadata โ€” hidden elements for search filtering #} {# JSON-LD Structured Data for SEO #} {# Handle photo as potentially an array #} {% set postImage = photo %} {% if postImage %} {# If photo is an array, use first element (check if first element looks like a URL) #} {% if postImage[0] and (postImage[0] | length) > 10 %} {% set postImage = postImage[0] %} {% endif %} {% endif %} {% if not postImage or postImage == "" %} {% set postImage = image or (content | extractFirstImage) %} {% endif %} {% set postDesc = description | default(content | ogDescription(160)) %} {# Lightbox overlay for article images #}
{# Comments section #} {% include "components/comments.njk" %} {# Webmentions display - likes, reposts, replies #} {% include "components/webmentions.njk" %} {# Post Navigation - Previous/Next #} {% include "components/post-navigation.njk" %}