Projects now show startDate/endDate range. Education supports both
startDate/endDate (new) and year (backward compat) display.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The homepage builder's sidebar bypass was using homepageConfig (a global
Eleventy data file) to suppress the sidebar on ALL pages, not just the
homepage. Now only bypasses when page.url == "/" so blog, post type, and
plugin pages keep their normal sidebar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Homepage builder now renders footer section below main content
- Sidebar supports custom-html widget type with title + content
- New homepage-footer.njk component for footer items
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The search widget was only showing a heading with an empty div.
Now loads Pagefind CSS/JS and initializes the search UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- base.njk: skip hardcoded sidebar when homepage builder is active
- homepage-builder.njk: implement 3 layouts (single-column, two-column,
full-width-hero) with CSS grid and sidebar rendering
- homepage-section.njk: section type dispatcher (extracted for reuse)
- homepage-sidebar.njk: maps widget types to existing widget partials
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The hardcoded hero section was always rendering, causing a double hero
when the homepage plugin is configured and has its own hero enabled.
Now only shows for Tier 2 (CV) and Tier 3 (default) fallbacks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- cv-experience.njk: work history timeline with highlights
- cv-skills.njk: skills grid grouped by category
- cv-education.njk: education cards + language pills
- cv-projects.njk: project cards with status badges and tech tags
- cv-interests.njk: interest tag cloud
- Update homepage-builder.njk to include cv-education and cv-interests
Part of indiekit-endpoint-cv plugin integration (Phase 2).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- homepage-builder.njk: master section renderer for configured sections
- sections/hero.njk: hero section with avatar, name, title, bio, social
- sections/recent-posts.njk: configurable recent posts section
- sections/custom-html.njk: freeform HTML content block
- Wire home.njk Tier 1 to include homepage-builder when config exists
Part of indiekit-endpoint-homepage plugin integration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Strip personal data from templates so the theme ships clean for any
deployer. Collection pages now use generatePageOnEmptyData so empty
post types show encouraging placeholders instead of 404s. Navigation
is conditional on enabled post types and installed plugins. Sidebar
widgets split into individual components with plugin-aware visibility.
Slashes page explains required plugins for root-level page creation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HTML entities in href and value attributes don't decode properly -
browsers treat them as literal strings. Only obfuscate display text.
Co-Authored-By: Claude Opus 4.5 <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>
- Sidebar now includes h-card.njk instead of duplicating the code
- Updated h-card.njk with hidden u-photo and full social links
- Homepage hero: replace duplicate bio with unique intro text + Read more link
- Net reduction of ~100 lines by proper component reuse
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add social links nav with rel="me" to sidebar h-card (was only in
standalone h-card.njk component, never included by sidebar)
- Add hidden <data class="u-photo"> for reliable microformat parsing
(some parsers struggle with img nested inside links)
- Fix social links fallback in site.js: auto-generate from feed config
(GITHUB_USERNAME, BLUESKY_HANDLE, etc.) when SITE_SOCIAL is not set
- Add hidden email/org data elements to blog-sidebar compact h-card
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
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>
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>
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>
- 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>
- 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>
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
The photo property can be an array for multi-photo posts.
Normalize photo to first element if array, and avoid startsWith on non-strings.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The photo property can be an array for multi-photo posts.
Also avoid calling startsWith on non-string values.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Blog dropdown with all post types (articles, notes, photos, bookmarks, likes, replies, reposts)
- Add Activity dropdown with GitHub, Listening, Funkwhale, YouTube
- Add /news and /interactions links to main nav
- Add mobile-responsive collapsible sections with Alpine.js
- Add CSS for dropdown menus and mobile nav sections
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>
- Make all headings responsive (text-2xl sm:text-3xl pattern)
- Make all section headings responsive (text-xl sm:text-2xl)
- Add responsive margins (mb-6 sm:mb-8 pattern)
- Fix flex layouts to stack on mobile (flex-col sm:flex-row)
- Make images responsive (w-20 sm:w-24 pattern)
- Add responsive padding (p-4 sm:p-6)
- Improve grid gaps for mobile (gap-3 sm:gap-4)
- Add CSS utilities for table overflow and touch scrolling
- Restyle 404 page with proper responsive design
Files updated: 22 template and CSS files across all pages
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>
Navigation now includes both /listening (combined Last.fm + Funkwhale)
and /funkwhale (Funkwhale-only). Sidebar widget links to combined page.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>