From c17ca030c8766f47b7cbd6a76b23de7d7c805874 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Thu, 5 Feb 2026 16:34:37 +0100 Subject: [PATCH] feat: add WebSub support for real-time feed updates Advertise WebSub hub (websubhub.com) in three discovery layers: - HTML in page head - 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 --- _includes/layouts/base.njk | 1 + eleventy.config.js | 24 ++++++++++++++++++++++-- feed-json.njk | 6 ++++++ feed.njk | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/_includes/layouts/base.njk b/_includes/layouts/base.njk index 891f424..2f5b239 100644 --- a/_includes/layouts/base.njk +++ b/_includes/layouts/base.njk @@ -65,6 +65,7 @@ + diff --git a/eleventy.config.js b/eleventy.config.js index 2bee38d..6ee5416 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -404,8 +404,9 @@ export default function (eleventyConfig) { .slice(0, 5); }); - // Pagefind indexing after each build - eleventyConfig.on("eleventy.after", ({ dir, runMode }) => { + // Pagefind indexing + WebSub hub notification after each build + eleventyConfig.on("eleventy.after", async ({ dir, runMode }) => { + // Pagefind indexing try { console.log(`[pagefind] Indexing ${dir.output} (${runMode})...`); execFileSync("npx", ["pagefind", "--site", dir.output, "--glob", "**/*.html"], { @@ -416,6 +417,25 @@ export default function (eleventyConfig) { } catch (err) { console.error("[pagefind] Indexing failed:", err.message); } + + // WebSub hub notification — notify subscribers of feed updates + const hubUrl = "https://websubhub.com/hub"; + const feedUrls = [ + `${siteUrl}/feed.xml`, + `${siteUrl}/feed.json`, + ]; + for (const feedUrl of feedUrls) { + try { + const res = await fetch(hubUrl, { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: `hub.mode=publish&hub.url=${encodeURIComponent(feedUrl)}`, + }); + console.log(`[websub] Notified hub for ${feedUrl}: ${res.status}`); + } catch (err) { + console.error(`[websub] Hub notification failed for ${feedUrl}:`, err.message); + } + } }); return { diff --git a/feed-json.njk b/feed-json.njk index 352e13a..43357c8 100644 --- a/feed-json.njk +++ b/feed-json.njk @@ -7,6 +7,12 @@ eleventyExcludeFromCollections: true "title": "{{ site.name }}", "home_page_url": "{{ site.url }}/", "feed_url": "{{ site.url }}/feed.json", + "hubs": [ + { + "type": "WebSub", + "url": "https://websubhub.com/hub" + } + ], "description": "{{ site.description }}", "language": "{{ site.locale | default('en') }}", "authors": [ diff --git a/feed.njk b/feed.njk index 5a65275..c29105b 100644 --- a/feed.njk +++ b/feed.njk @@ -10,6 +10,7 @@ eleventyExcludeFromCollections: true {{ site.description }} {{ site.locale | default('en') }} + {{ collections.feed | getNewestCollectionItemDate | dateToRfc822 }} {%- for post in collections.feed %} {%- set absolutePostUrl = site.url + post.url %}