Commit Graph

36 Commits

Author SHA1 Message Date
svemagie
dd400cbef5 Fetch CV data via API with file fallback 2026-03-08 06:46:07 +01:00
svemagie
b3525b6944 Fix Last.fm listening fetch parameters 2026-03-08 06:26:14 +01:00
svemagie
e54624f7c0 Harden listening data endpoints with route fallbacks 2026-03-08 06:19:11 +01:00
svemagie
722ff22328 Fix GitHub widget/data endpoints to prefer /github/api routes 2026-03-08 05:44:47 +01:00
svemagie
98a1898fd1 fix: normalize permalinks and page updated dates 2026-03-08 02:45:11 +01:00
Ricardo
9b5fe6014d feat: redesign starred page with GitHub Lists tabs, sort, and filters
- Add tab bar for GitHub Lists (All, per-list tabs, Uncategorized)
- Add sort controls (stars, recently starred, recently updated, name)
- Add filter controls (language, star count range, archived toggle)
- Add language color dots, formatted star/fork counts, topic overflow
- Fix starred count on GitHub activity page (fetch totalCount from API)
- All rendering remains client-side via Alpine.js (no build OOM risk)

Confab-Link: http://localhost:8080/sessions/b130e9e5-4723-435d-8d5a-fc38113381c9
2026-03-03 11:01:05 +01:00
Ricardo
a39b20375d fix: make starred page client-side rendered to avoid OOM
5,137 starred repos in Nunjucks template + Pagefind indexing exceeded
the 2048MB Eleventy heap limit during build. Switched to Alpine.js
client-side rendering:

- _data/githubStarred.js: returns only buildDate (no API fetch)
- starred.njk: fetches /githubapi/api/starred/all via Alpine.js
- Added client-side text search (replaces separate Pagefind index)
- Removed pagefind-starred build step and --exclude-selectors flag

Confab-Link: http://localhost:8080/sessions/b130e9e5-4723-435d-8d5a-fc38113381c9
2026-03-02 13:40:33 +01:00
Ricardo
9d29f24d93 feat: add /github/starred/ page with Pagefind search and live updates
- New starred.njk page rendering all ~5k starred repos as searchable cards
- Separate Pagefind index (pagefind-starred) for starred-only search
- Alpine.js live updates section for stars added since last build
- Load More pagination (50 at a time, all in DOM)
- githubStarred.js data file fetching from plugin API (1d cache)
- Link from /github/ to /github/starred/
- Exclude starred cards from main site Pagefind index

Confab-Link: http://localhost:8080/sessions/b130e9e5-4723-435d-8d5a-fc38113381c9
2026-03-02 13:15:12 +01:00
Ricardo
ab31e080bb feat: update interests templates for category-based data model
Interests are now grouped by category (matching skills pattern).
Updated cv-interests.njk to iterate categories, cv.js fallback to {},
and cv.njk hasCvData check to include interests.
2026-02-25 14:56:11 +01:00
Ricardo
42a5c67896 feat: add Markdown for Agents — serve clean Markdown to AI agents
Generate index.md alongside index.html for /articles/ at build time.
Agents can access clean Markdown via .md URL extension or Accept:
text/markdown content negotiation. Includes configurable content-signal
policy (ai-train, search, ai-input) and a master on/off toggle via
MARKDOWN_AGENTS_ENABLED env var.
2026-02-24 20:24:06 +01:00
Ricardo
7110ba3879 fix: compute ogSlug from permalink in template to avoid Eleventy 3.x race condition
Both page.url AND page.inputPath are unreliable in eleventyComputed due to
Eleventy 3.x parallel rendering (issue #3183). They return values from OTHER
pages being processed concurrently, causing og:image meta tags to reference
wrong OG images.

Fix: compute ogSlug directly in base.njk from the permalink data value using
existing Nunjucks filters (ogSlug, hasOgImage). permalink comes from frontmatter
(per-file data) and is immune to cross-page contamination.
2026-02-24 18:33:46 +01:00
Ricardo
a7e68ee941 fix: derive ogSlug from inputPath to fix Eleventy 3.x race condition
page.url in eleventyComputed returns URLs from other pages being
processed concurrently in Eleventy 3.x parallel rendering. This caused
OG images to show wrong post types and titles (e.g., a note showing
"Reply" badge from a completely different post).

Fix: use page.inputPath (physical file path) which is always correct,
matching the approach already used by the permalink computation.
2026-02-24 17:55:31 +01:00
Ricardo
910889cde8 fix: remove trailing slash from site.url to prevent double-slash URLs
site.url had a trailing slash (added for Mastodon rel=me verification),
which caused double slashes in all URL constructions like
{{ site.url }}/auth → https://rmendes.net//auth

This broke IndieAuth login — indielogin.com read the authorization_endpoint
link tag with //auth and redirected users there, which 404'd in nginx.

Split into site.url (no slash, for URL construction) and site.me /
site.author.url (with slash, for Mastodon rel=me strict matching).

Also fixed twitter:image meta tags to use smart slash logic matching
the og:image pattern (check if path starts with / before prepending one).
2026-02-24 16:18:52 +01:00
Ricardo
f5f77cb4a3 fix: normalize site URL with trailing slash for Mastodon rel=me verification
Mastodon's VerifyLinkService uses strict string comparison against
account.url (which includes trailing slash from the AP actor's url
field). The h-card self-link used SITE_URL without trailing slash,
causing the comparison to fail silently.
2026-02-24 13:56:29 +01:00
Ricardo
90ff9068a1 feat: use AP handle as primary fediverse identity
Rename getMastodonHandle() to getFediverseCreator() and prefer the
site's own ActivityPub handle (ACTIVITYPUB_HANDLE) over the external
Mastodon account for the fediverse:creator meta tag. The Mastodon
account is a syndication target, not the canonical identity.
2026-02-24 12:08:02 +01:00
Ricardo
c7f2841625 fix: auto-convert stale /content/ permalinks in data cascade
Posts published between Jan 19 – Feb 6 2026 (pre-beta.37 preset) had
permalink: /content/TYPE/YYYY-MM-DD-SLUG/ in frontmatter. The data
cascade trusted these values, causing Eleventy to generate pages at
/content/ paths instead of canonical URLs. This left 86 posts (including
articles like collecteur-de-flux-rss) returning 404 at their canonical
URLs.

The markdown files were fixed on the server (permalink lines removed),
but this adds a safety net: any remaining or future /content/ permalinks
are auto-converted to /TYPE/YYYY/MM/DD/SLUG/ format.
2026-02-23 12:31:44 +01:00
Ricardo
e1f4b2cd90 feat: eliminate URL dualism — computed permalinks, conversations support
- Add computed permalink in data cascade for existing posts without
  frontmatter permalink (converts file path to Indiekit URL)
- Fix ogSlug filter and computed data for new 5-segment URL structure
- Add conversations API as build-time data source
- Merge conversations + webmentions in webmentionsForUrl filter with
  deduplication and legacy /content/ URL alias computation
- Sidebar widget fetches from both webmention-io and conversations APIs
- Update webmention-debug page with conversationMentions parameter
2026-02-23 09:38:30 +01:00
Ricardo
c70b51b499 feat: add ActivityPub actor rel="me" link for Mastodon verification
Add ACTIVITYPUB_HANDLE env var support to site.js social links.
Add activitypub globe icon to h-card sidebar widget.
2026-02-22 12:14:06 +01:00
rmdes
fa7bfb26ea feat: add comment system components and recent comments widget
- Comment area on post pages (IndieAuth sign-in, submit, display)
- Alpine.js client-side component for auth flow and comment CRUD
- Recent comments sidebar widget with build-time data fetching
- Include comments.js in base layout, comments.njk before webmentions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 21:56:15 +01:00
Ricardo
66e55af7ee feat: add configurable CV page layout with builder support
CV page now reads layout config from cv-page.json when available,
supporting single-column, two-column, and full-width hero layouts with
configurable sections, sidebar widgets, and footer columns. Falls back
to the previous hardcoded layout when no config exists.
2026-02-20 15:17:32 +01:00
Ricardo
3bf0e78f74 feat: add filtered section templates for work/personal type distinction
Add thin-wrapper templates for work/personal filtering of CV sections:
- 8 new templates: cv-{experience,education,skills,interests}-{personal,work}.njk
- cv-languages.njk: standalone languages section (split from education)
- homepage-section.njk: 9 new routes for filtered variants
- cv.njk: uses work-only variants for the /cv/ page
- Base templates: filterType support in experience, education, skills, interests
- _data/cv.js: skillTypes and interestTypes fallback fields
2026-02-20 13:11:37 +01:00
Ricardo
2ebe63ffff fix: use eleventyComputed for OG slug to avoid Nunjucks race condition
Eleventy 3.x renders Nunjucks templates in parallel, causing page.url
to return wrong values in {% set %} tags. This caused OG images to be
mismatched between pages (e.g., bookmark showed note's OG image).

Move ogSlug and hasOgImage computation to eleventyComputed, which runs
during the sequential data cascade phase before parallel rendering.
The computed values are then available as plain template variables.

Refs: https://github.com/11ty/eleventy/issues/3183
2026-02-18 17:17:30 +01:00
rmdes
afc394525b feat: add textcasting support, feed attachments, and protocol badges
- Add _textcasting extension to JSON feed with support/monetization config
- Add feedAttachments filter for photo/audio/video media in feed items
- Add content_text and date_modified fields to feed items
- Add protocol badges (ATmosphere, Fediverse, Web) on reply posts
- Add support configuration via environment variables in site data

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 08:42:59 +01:00
Ricardo
7004dbc4f1 feat: read CV data from plugin file instead of hardcoded defaults
_data/cv.js now reads from content/.indiekit/cv.json written by the
CV plugin, matching the homepageConfig.js pattern. Falls back to
empty defaults when no plugin is installed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 10:55:22 +01:00
Ricardo
bada61e2e4 fix: resolve homepage.json via content/ symlink instead of absolute path
CONTENT_DIR env var wasn't set on Cloudron, so the data file tried
/data/content/.indiekit/homepage.json which doesn't exist. Now resolves
relative to the Eleventy project dir through the content/ symlink.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 17:10:28 +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
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
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
40a9babf55 feat: add news page and data file for RSS feed reader
- newsActivity.js: Fetch items/feeds/status from /rssapi/api
- news.njk: News page with list/card/full view modes and feed filtering

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 23:10:42 +01:00
Ricardo
9a0c1a5111 feat: fetch contributions data from Indiekit API
Enables Contributions/PRs section when using Indiekit backend

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 18:16:08 +01:00
Ricardo
fbb7653dc4 fix: add fallback for commits when GitHub Events API lacks details
GitHub's Events API no longer includes commit details in PushEvent
payloads. This adds a fallback that fetches commits directly from
the user's recently pushed repositories when events don't have them.

- Try events API first (existing behavior)
- If no commits, fetch from user's top 5 recently pushed repos
- Sort combined results by date

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:09:04 +01:00
Ricardo
3c21393989 fix: improve redirect map file discovery
- Fix fallback logic (empty object is truthy)
- Try multiple paths for Docker and local dev
- Add debug logging for file discovery

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 15:13:11 +01:00
Ricardo
46f4559fe3 feat: add Last.fm integration to listening page
- Add lastfmActivity.js data fetcher for Indiekit Last.fm API
- Add listening.njk combined page with Funkwhale + Last.fm data
- Source filter tabs, combined stats, recent listens timeline
- Loved tracks section for Last.fm

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 14:59:39 +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
2b225197b4 Initial commit: Indiekit Eleventy theme 2026-01-24 12:13:34 +01:00