Commit Graph

232 Commits

Author SHA1 Message Date
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
71c314152c fix: make mobile nav and desktop dropdown scrollable
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>
2026-02-05 14:47:18 +01:00
Ricardo
e5d699cffc fix: use Pagefind 1.x path and exclude non-HTML files from index
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>
2026-02-05 13:54:51 +01:00
Ricardo
e79f23309d fix: dispatch auth event on window for Alpine.js compatibility
Alpine's .window modifier listens on window, not document.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:23:30 +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
4e6a4747e6 fix: improve Pagefind UI styling for light and dark mode
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>
2026-02-05 11:13:35 +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
a8b44329d8 fix: cache webmention API responses in sessionStorage to persist across refreshes
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>
2026-02-05 10:39:47 +01:00
Ricardo
f58198c021 fix: fetch webmentions for both trailing slash URL variants
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>
2026-02-05 10:06:40 +01:00
Ricardo
1a1014a60d feat: differentiate post types in blog feed with icons and labels
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>
2026-02-05 09:35:59 +01:00
Ricardo
625ad5c16c fix: add watchIgnores to prevent rebuild loop
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>
2026-02-04 23:42:33 +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
ddf27fc132 perf: skip htmlmin during watch rebuilds, disable minifyCSS/minifyJS
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>
2026-02-04 14:40:57 +01:00
Ricardo
80e4ec8b2b fix: populate podcast dropdown from sources, filter via API
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>
2026-02-03 18:05:02 +01:00
Ricardo
8e50a7948d fix(podroll): add optional chaining for status in x-text binding
Prevents TypeError when status is null before initial fetch completes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 10:29:47 +01:00
Ricardo
ca8da64a60 feat: add ChardonsBleus page with embedded Bluesky timeline
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>
2026-02-03 09:48:47 +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
eaf1a71757 fix(podroll): move subscriptions to sidebar, use widget styling
- 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>
2026-02-02 19:44:03 +01:00
Ricardo
875676d9c7 feat: add podroll page for podcast episode listings
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>
2026-02-02 19:11:26 +01:00
Ricardo
44bfa6de9e fix: disable about.njk completely with permalink: false
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>
2026-02-02 13:08:42 +01:00
Ricardo
f03e48e4db fix: use 11tydata.js for conditional about page permalink
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>
2026-02-02 12:34:01 +01:00
Ricardo
829395a2cd fix: use fileSlug instead of url to avoid circular dependency
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>
2026-02-02 12:30:04 +01:00
Ricardo
5e564d3403 feat: make about.njk conditional for post-type-page compatibility
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>
2026-02-02 12:21:06 +01:00
Ricardo
a148a90cc7 fix: include content/pages/*.md in pages collection 2026-02-02 12:03:30 +01:00
Ricardo
e657aa5a72 fix: add overflow handling to prevent mobile layout breaking
- 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>
2026-02-01 17:25:49 +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
64b2edb0d2 refactor: reorder slashes page - dynamic pages first
- 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>
2026-02-01 14:17:31 +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
767f8d6b6c feat: add consistent styling to all post type pages
- 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>
2026-01-31 13:24:43 +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
f9af152efd debug: add raw URL debug output 2026-01-28 22:06:28 +01:00
Ricardo
0e82a00739 debug: add visible debug output for photo data 2026-01-28 22:00:22 +01:00
Ricardo
93a1662e5d debug: add photo data dump 2026-01-28 21:54:42 +01:00
Ricardo
62038aba5f fix: use Nunjucks-compatible syntax for URL check 2026-01-28 21:49:26 +01:00
Ricardo
faf881b93f fix: ensure photo URLs have leading slash 2026-01-28 21:31:06 +01:00
Ricardo
2581a6eaa5 feat: display photos on /photos/ listing page
- 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>
2026-01-28 21:20:15 +01:00