Uses Satori + @resvg/resvg-js to create branded 1200x630 social
preview cards at build time. Cards show post title, type badge,
date, and site name on a dark background with blue accent.
Generated images are cached in .cache/og/ (persistent on Cloudron)
and passthrough-copied to the output. Posts with photos continue
using their own images. Untitled posts (notes) use body text.
Uses markdown-it-anchor to generate linkable IDs on h2-h4 headings.
Headings become clickable links with a subtle # indicator on hover.
Includes scroll-margin-top so anchored headings don't hide behind
the sticky header.
Post navigation now uses previousInCollection/nextInCollection filters
to find adjacent posts (avoids Nunjucks loop scoping bug). Webmentions
sidebar widget now uses webmentionsForUrl and webmentionsByType filters
instead of non-existent filter function.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix recentPosts collection glob (content/posts/ → content/) so the
widget actually finds posts. Extract blog-sidebar widgets into reusable
partials. Make both sidebar.njk (listing pages) and blog-sidebar.njk
(post pages) configurable via homepageConfig.blogListingSidebar and
homepageConfig.blogPostSidebar, with fallback to current hardcoded
widgets for backward compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integrates @11ty/eleventy-plugin-syntaxhighlight (PrismJS) for
build-time syntax highlighting of fenced code blocks. Includes
a custom GitHub-inspired theme with dark mode support (.dark class).
All existing articles with triple-backtick code blocks will
automatically get highlighting on next Eleventy rebuild.
Also fixes overflow-x: hidden on .prose/.e-content that was
clipping scrollable code blocks — changed to overflow-x: clip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change all webmention fetch URLs from /webmentions-api/api/mentions
to /webmentions/api/mentions to match the new @rmdes/indiekit-endpoint-webmention-io
plugin which replaces both the upstream viewer and the proxy plugin.
Build-time feed now fetches from local Indiekit API instead of
webmention.io directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add obfuscateEmail Eleventy filter that converts email to HTML entities
- Apply to h-card.njk (both mailto: href and display text)
- Apply to blog-sidebar.njk hidden data element
- HTML entities block ~95% of spam harvesters while remaining valid
for IndieWeb microformat parsers (u-email for rel="me" auth)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Subscribers discovering via HTML rel="self" subscribe to the
homepage topic, not the feed URL. Must notify hub for all
topic URLs so those subscriptions receive updates.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Advertise WebSub hub (websubhub.com) in three discovery layers:
- HTML <link rel="hub"> in page head
- <atom:link rel="hub"> in RSS feed
- "hubs" array in JSON Feed 1.1
Notify hub after each Eleventy build so subscribers receive
push updates when new content is published.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update Pagefind asset URLs from /_pagefind/ to /pagefind/ to stop
the pre-1.0 compatibility mode that was writing the index twice.
Also ignore CLAUDE.md and README.md in Eleventy to prevent them
from being processed into HTML pages without an <html> element.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add Pagefind indexing after each Eleventy build with a search page at
/search/. Indexes main content only (sidebars excluded), supports dark
mode theming and URL query parameters (?q=).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When Eleventy's output (_site) is a symlink to /app/data/site, the watcher
was detecting changes to its own output and triggering infinite rebuilds.
This adds explicit ignores for both the symlink and its target path.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
htmlmin transform was consuming 84% of build time (321s out of 384s).
Two changes:
- Only run htmlmin during initial build (ELEVENTY_RUN_MODE === "build"),
skip during watch-mode rebuilds for faster content updates
- Set minifyCSS and minifyJS to false to avoid expensive CSS/JS parsing
Also updates CLAUDE.md paths for indiekit-dev workspace move.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add "/" link to desktop and mobile nav pointing to /slashes/
- Update pages collection to find content/*.md (root-level pages)
- Keeps About and Now as featured nav items, with / for all pages
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add pages collection in eleventy.config.js
- Add page.njk layout for slash pages
- Add /slashes/ listing page showing all site pages
- Pages created via Indiekit go to /{slug}/ instead of /content/pages/
Inspired by https://slashpages.net
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add js/webmentions.js to fetch new webmentions from webmention.io API
- Supplements build-time cached webmentions with real-time data
- Shows new webmentions with 'NEW' badge and visual ring highlight
- Uses safe DOM methods to prevent XSS vulnerabilities
- Data attributes on webmentions container provide target URL and build time
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Indiekit Eleventy preset uses camelcaseKeys to convert frontmatter
properties (e.g., bookmark-of → bookmarkOf), but templates expected
underscore-separated names (bookmark_of).
Changes:
- Support both camelCase and underscore property names in all templates
- Update collections to filter on both property name formats
- Include interaction URLs (bookmarks, likes, replies, reposts) in
Bridgy syndication content for proper social media posting
Fixes bookmark URLs not appearing on posts or in syndicated content.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add urlAliases.js to parse redirect maps and build old→new URL mappings
- Enhance webmentionsForUrl filter to check legacy URLs (micro.blog, Known/WP)
- Update webmentions.njk to pass urlAliases data
- Add webmention-debug.njk page at /debug/webmentions/
This recovers webmentions sent to old URL structures:
- micro.blog: /YYYY/MM/DD/slug.html
- Known/WordPress: /YYYY/slug
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
content/ is in .gitignore because it's a symlink at runtime,
but Eleventy 3.x respects .gitignore by default which was
preventing content files from being processed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>