200 Commits

Author SHA1 Message Date
Ricardo
45b42c67fe feat: add date display to CV projects and education templates
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>
2026-02-09 12:11:22 +01:00
Ricardo
523f538d1b fix: restore sidebar on blog and post type pages
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>
2026-02-09 10:12:46 +01:00
Ricardo
610f81f8fe feat: add footer rendering and custom-html sidebar widget
- 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>
2026-02-09 10:10:16 +01:00
Ricardo
2ea75e567d fix: search sidebar widget now renders Pagefind UI
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>
2026-02-08 19:53:13 +01:00
Ricardo
b4bc2f6f07 feat: wire homepage builder layout system and sidebar control
- 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>
2026-02-08 19:08:27 +01:00
Ricardo
b8c60b1a81 fix: hide default hero when homepage builder is active (Tier 1)
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>
2026-02-08 18:06:07 +01:00
Ricardo
d0360dbdf7 feat: add CV section partials for homepage builder
- 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>
2026-02-08 16:01:01 +01:00
Ricardo
d9e99fa9cc feat: add homepage builder components for Phase 3
- 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>
2026-02-08 15:55:08 +01:00
rmdes
32aea5ace9 feat: neutralize theme for fresh deployments
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>
2026-02-08 15:16:29 +01:00
Ricardo
8df5d33248 feat: add blogroll page and sidebar widget (Phase 3) 2026-02-08 11:20:21 +01:00
rmdes
2077a6bce9 Add Eleventy generator meta tag for leaderboard eligibility
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 19:27:55 +01:00
Ricardo
e2cf730b4e fix: add safe filter to prevent entity escaping 2026-02-06 10:05:40 +01:00
Ricardo
2c50f4265e fix: don't obfuscate email in href/value attributes
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>
2026-02-06 09:40:56 +01:00
Ricardo
b448aaa0e0 feat: add email obfuscation to protect from spam bots
- 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>
2026-02-06 09:21:09 +01:00
Ricardo
f37cd3b913 refactor: use h-card.njk component in sidebar, update homepage intro
- 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>
2026-02-06 08:34:49 +01:00
Ricardo
bf4fb8041f fix: restore h-card social links and improve microformat reliability
- 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>
2026-02-05 23:34:29 +01:00
Ricardo
1470e0fbc2 fix: add self link for WebSub discovery compliance
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>
2026-02-05 17:25:36 +01:00
Ricardo
c17ca030c8 feat: add WebSub support for real-time feed updates
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>
2026-02-05 16:34:37 +01:00
Ricardo
8229dfe3c7 feat: add admin UI for logged-in users (dashboard link + FAB)
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>
2026-02-05 12:12:33 +01:00
Ricardo
73eb019f70 fix: add cache-busting hash to webmentions.js script tag
Prevents browsers from serving stale JS when the file changes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 10:49:17 +01:00
Ricardo
d9c84cad80 feat: add Pagefind client-side search
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>
2026-02-05 10:49:05 +01:00
Ricardo
ff2c0950b7 perf: skip eleventy-img processing for external cover art
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>
2026-02-04 15:12:17 +01:00
Ricardo
e30200067c feat: add /podroll to nav menu, sort links alphabetically
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:09:19 +01:00
Ricardo
ed2044dd8b feat: add theme toggle to mobile navigation
- 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>
2026-02-01 15:01:24 +01:00
Ricardo
ba94a6e5c8 feat: merge Activity into single "/" dropdown menu
- 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>
2026-02-01 14:50:44 +01:00
Ricardo
54ddaaa5d4 feat: make slash pages a dynamic dropdown menu
- 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>
2026-02-01 14:29:49 +01:00
Ricardo
c01bdd331f feat: add slashes index to navigation
- 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>
2026-02-01 13:58:59 +01:00
Ricardo
690b5f09f5 feat: add Now page to navigation
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>
2026-02-01 13:36:26 +01:00
Ricardo
ae8bd83a0b feat: add support for slash pages (root-level pages)
- 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>
2026-02-01 11:13:20 +01:00
Ricardo
e2ca6c1313 feat: add mpSyndicateTo support for IndieNews syndication
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>
2026-01-31 15:32:28 +01:00
Ricardo
15891a0ad2 Revert "refactor: single h-card component with variant support"
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>
2026-01-30 23:06:23 +01:00
Ricardo
70c66220b8 fix: use hidden data element for reliable u-photo microformat parsing
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>
2026-01-30 17:26:11 +01:00
Ricardo
d6640d515d refactor: single h-card component with variant support
- 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
2026-01-30 16:51:29 +01:00
Ricardo
721f37d23f feat: add essential h-card properties to blog sidebar
Compact author card now includes p-author, u-uid, p-locality,
p-country-name, and p-note (hidden) for microformat completeness.
2026-01-30 15:02:10 +01:00
Ricardo
2ffdb1fee2 feat: enhance sidebar h-card with full microformat properties
Added to sidebar author card:
- p-pronoun
- Structured address (p-locality, p-country-name)
- p-org (organization)
- u-email
- u-key (PGP)
- p-category (skills)
- Proper Schema.org attributes
2026-01-30 14:59:40 +01:00
Ricardo
e993353db8 feat: enhance h-card with full microformat properties
Added support for:
- u-photo (visible)
- p-note (bio)
- u-email
- p-locality, p-region, p-country-name (structured address)
- p-org (organization)
- p-pronoun
- p-category (skills/interests)
- u-key (PGP key URL)

All configurable via environment variables.
2026-01-30 13:40:28 +01:00
Ricardo
b3c30e3029 feat: add proper rel=me atproto for Bluesky and fediverse:creator meta tag
- 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
2026-01-29 22:42:49 +01:00
Ricardo
13f8876298 fix: add eleventy:ignore to photo images and render photos in post template 2026-01-28 22:25:48 +01:00
Ricardo
b188edd2ee fix: handle photo array in base.njk OpenGraph/Twitter meta
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>
2026-01-28 17:58:29 +01:00
Ricardo
0a0718c6b2 fix: handle photo array in post.njk JSON-LD
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>
2026-01-28 17:50:16 +01:00
Ricardo
1f3fe00ce8 fix: multiple frontend issues
- Add Alpine.js Collapse plugin for x-collapse directive
- Create favicon.svg and favicon.ico with proper linking
- Fix default-avatar references (use existing .svg instead of .png)
- Add favicon.ico to passthrough copy

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 15:08:01 +01:00
Ricardo
80ced7b148 feat: add dropdown navigation menus
- 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>
2026-01-26 19:17:34 +01:00
Ricardo
8da928a91c fix: use timestamp filter for buildtime instead of date filter
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 10:22:34 +01:00
Ricardo
922ae40460 feat: add client-side webmention fetcher for real-time updates
- 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>
2026-01-26 10:11:48 +01:00
Ricardo
dc2856aa42 feat: add microsub endpoint discovery link for IndiePass/Indigenous support 2026-01-26 08:23:31 +01:00
Ricardo
f7db31ac27 fix: support camelCase property names from Indiekit Eleventy preset
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>
2026-01-24 16:34:20 +01:00
Ricardo
96182cb1e4 fix: comprehensive mobile responsive design audit
- 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>
2026-01-24 15:48:23 +01:00
Ricardo
a316d3148d feat: add legacy webmention recovery from old URLs
- 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>
2026-01-24 14:57:29 +01:00
Ricardo
f32565a2be feat: add unified /listening page and rename /funkwhale in nav
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>
2026-01-24 13:52:33 +01:00
Ricardo
2b225197b4 Initial commit: Indiekit Eleventy theme 2026-01-24 12:13:34 +01:00