WebSub spec requires both rel="hub" and rel="self" for
discovery. websub.rocks conformance test failed without self.
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>
Adds max-height (100vh minus header) and overflow-y auto to prevent
menu items from being cut off on small screens.
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>
Auth detection via /session/login probe with sessionStorage cache.
Dashboard link appears in desktop and mobile nav when authenticated.
Floating action button with quick-create menu for Note, Article,
Photo, Bookmark, and Page post types.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use high-specificity selectors outside @layer to properly override
Pagefind's :root defaults. Style input, results, marks, buttons,
tags, and clear button for both themes.
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>
The old sessionStorage rate limiter prevented re-fetching on page refresh,
causing webmentions to disappear since they weren't in the build-time HTML.
Now caches the actual API response data with a 5-minute TTL so webmentions
render instantly from cache on refresh, while still fetching fresh data in
the background.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Bridgy sends webmentions with inconsistent target URLs — articles
get trailing slashes but likes/bookmarks/reposts don't. The
client-side JS now queries both variants and deduplicates, matching
the build-time filter's behavior.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Likes, bookmarks, reposts, replies, and photos now render with
distinct type icons, colored labels, target URLs, and proper
microformat classes (u-like-of, u-bookmark-of, etc.) instead of
all appearing as generic notes.
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>
Add eleventy:ignore to all Funkwhale/Last.fm album cover <img> tags.
These are external URLs served from their origin servers — downloading,
converting to webp, and caching them locally was causing 4094 image
processing calls per build with no benefit.
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>
The podcast filter dropdown was built from loaded episodes only,
so podcasts with older episodes didn't appear until scrolling.
Now uses the full sources list and queries the API server-side
when filtering by a specific podcast.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Dedicated template to avoid storing <script> tags in Indiekit's
database, which breaks the admin /posts UI due to unescaped rendering.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove withSidebar to avoid double sidebar
- Use layout-with-sidebar and main-content classes
- Style subscriptions widget like other sidebar widgets
- Remove height limit so subscriptions can expand fully
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Client-side page that fetches podcast data from the podroll API endpoint.
Features:
- Episode listings with audio players
- Sidebar showing podcast sources from OPML
- Filter by podcast dropdown
- Load more pagination
- Auto-refresh every 5 minutes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Set permalink: false directly in frontmatter to ensure the template
never renders. Users should create their own about page via
post-type-page plugin.
Removed about.11tydata.js as it's no longer needed.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Using a JavaScript data file to return boolean false for permalink
when about.md exists, instead of trying to compute it in Nunjucks
which returns string "false" and causes errors.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The eleventyComputed permalink cannot reference page.url as it
creates a circular dependency (url depends on permalink).
Using fileSlug instead.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
If an about page exists in the pages collection (created via
post-type-page plugin), this template will not render, allowing
the user-created about.md to take precedence. Falls back to
this template for users without the post-type-page plugin.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add grid-cols-1 explicitly for mobile to ensure single column layout
- Add overflow-x-hidden to .main-content to contain horizontal overflow
- Add overflow-hidden to .sidebar and .widget components
- Add overflow-x-hidden to .e-content and .prose containers
- Add overflow-hidden to .post-card for containing wide content
These changes fix mobile layout regressions on pages using withSidebar: true
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add theme toggle button at bottom of mobile nav
- Share toggleTheme function between desktop and mobile
- Style mobile toggle to match nav item appearance
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- All slash pages now under one "/" dropdown
- Dynamic pages (from Indiekit) appear first
- Activity feeds (github, listening, funkwhale, youtube, news) below divider
- Remove standalone Activity dropdown and /news link
- Add divider styles for desktop and mobile nav
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Desktop: "/" becomes dropdown showing all pages from collections.pages
- Mobile: "/" becomes collapsible section with all dynamic pages
- New pages created via Indiekit automatically appear in nav
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move dynamic pages (created via Indiekit) to top
- Rename sections: "Pages" and "Activity Feeds"
- Remove /about from list (already in main nav)
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 /now/ link to both desktop and mobile navigation menus,
placing it after About as a standard slash page.
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>
Render pending syndication targets as hidden u-syndication links
for services like IndieNews that require the link before webmention.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add withSidebar, h-feed wrapper, pagination to all post type pages
- Add total count display
- Add post-card class for consistent styling
- Add category display
- Keep type-specific icons (heart for likes, reply arrow, repost icon)
- Keep photo gallery layout for photos page
All post type pages now match the articles/notes pattern.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This reverts commit d6640d5 and 70c6622 which broke the sidebar rendering.
Restoring the working 3-implementation approach.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Some microformat parsers have trouble detecting u-photo when the img is
inside an anchor tag or gets transformed by image processing. Added a
hidden <data class="u-photo"> element at the h-card root that parsers
reliably detect. Removed redundant u-photo class from visible img tags.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- h-card.njk is now the single source of truth
- sidebar.njk includes h-card with variant='full'
- blog-sidebar.njk includes h-card with variant='compact'
- Removed duplicate h-card code from both sidebars
- Bluesky URLs now get rel='me atproto' for verification
- Added fediverse:creator meta tag for Mastodon creator attribution
- Meta tag populated from MASTODON_INSTANCE and MASTODON_USER env vars
- Render photo frontmatter as actual img tags
- Add photo gallery CSS with responsive grid
- Support multi-photo posts with 2-column grid
- Add photo caption styling
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>