Repository navigation
Changelog page inside the docs, and RSS autodiscovery on every page - #1142
Conversation
…todiscovery The changelog lives on Ghost at changelog.keboola.com and the docs only linked to it from the home page. Both Stripe and Claude keep release notes inside the docs, and the audit listed this as a gap. /changelog/ is a real Astro page inside <StarlightPage>, on the same footing as 404.astro: it fetches Ghost's RSS feed at build time, which a Markdown page cannot do, and keeps the sidebar and site chrome. Fifteen newest entries, each as date, linked title and the feed's short description; the full HTML body is not rendered because it is Ghost markup styled for Ghost and the entry is one click away. The feed is parsed without a dependency: it is flat and well-formed, and the only XML parser in node_modules (sax) is transitive and would vanish on an unrelated bump. A failed or slow fetch returns ok:false and the page falls back to the plain link — a docs build must not fail because a marketing site was down. Every page now carries <link rel="alternate" type="application/rss+xml"> pointing at the Ghost feed, so an RSS client can subscribe from anywhere in the docs. The home page's Release notes link points at /changelog/. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
keboola-pr-reviewer-bot
left a comment
There was a problem hiding this comment.
Verdict: needs_human (risk 4/5) · profile connection-docs
Needs a human — this adds runtime code (a new Astro page, a component edit, and a build-time RSS fetcher), not content-bucket docs.
Concerns:
src/pages/changelog.astro: New Astro page runs a build-time network fetch; outside content bucket.src/lib/changelog-feed.mjs: Hand-rolled RSS/XML parser instead of a dependency; needs code review.src/components/Head.astro: Component edit adds site-wide RSS link tag; tooling change per policy.
Suggested reviewers: @keboola/docs
| * @param {{ url?: string, limit?: number, timeoutMs?: number }} [opts] | ||
| * @returns {Promise<{ ok: true, items: Array<{title:string,link:string,date:Date,description:string}> } | { ok: false, error: string }>} | ||
| */ | ||
| export async function fetchChangelog({ url = CHANGELOG_RSS_URL, limit = 15, timeoutMs = 8000 } = {}) { |
There was a problem hiding this comment.
why only 15? and in the future can we make it prettier like cards Title, date on the right and desc below
|
also where does the user get to this page? |
Michal asked where a reader finds /changelog/ (only the home page linked it) and for cards instead of a plain list. The sidebar now ends with Changelog; navigation.yml gets a `link:` field for pages outside the docs collection, since Starlight cannot resolve a slug for src/pages/*.astro. Each entry is a card in the prev/next card frame: title left, date right, description below, the whole card a link; the date stacks under the title on phones. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@eruveo Added Changelog to the bottom of the sidebar, so it's reachable from every page. The entries are cards now, with the title on the left, the date on the right and the description below. As for 15: that's all Ghost's RSS feed returns, and it has no second page. The full history is linked at the top of the page. |
Item 1.2 of the Claude/Stripe docs audit: both keep release notes inside the docs; ours lived only on changelog.keboola.com, linked once from the home page.
What this adds
/changelog/— the 15 newest entries from the Ghost feed at changelog.keboola.com, newest first: date, linked title, the feed's one-line description. Full history and subscription are one click away at the top of the page.<link rel="alternate" type="application/rss+xml">pointing at Ghost's feed, so a reader's RSS client can subscribe from anywhere in the docs./changelog/instead of leaving the site.How
src/pages/changelog.astrois a real Astro page inside<StarlightPage>, on the same footing as404.astro: it needs data fetched at build time, which a Markdown page cannot do, and keeps the sidebar and chrome.src/lib/changelog-feed.mjsfetches and parses the feed.Choices worth a glance:
node_modules(sax) is transitive and would disappear on an unrelated bump.content:encoded. That body is Ghost markup styled for Ghost; the entry's own page is the right place to read it.ok:false, and the page renders the link plus a one-line notice instead of the list. Exercised against an unreachable host (25 ms) and a 404.hideMeta: truefor the same reason as on the 404: the page-head chrome includes "View as Markdown", which points at<slug>/index.md, and that file is only emitted for collection pages.Deliberately not done — your call
_data/navigation.yml.llms.txt.page-markdown.mjsindexes collection pages; this one is dynamic, and the canonical source for an agent is the Ghost feed itself.src/content/docs/index.mdchanged by one link. No prose changed, so the fact-checker pass was not run.Verified
dist/changelog/index.htmlhas 15<time>entries; first is Sep 22, 2026 — Google Ads Update.&in "August 15 & 22" is decoded, not raw).<link>present in the<head>of an unrelated page (/storage/); home page links/changelog/; page is in the sitemap./api/chat— the Kai backend, absent in a static preview.ok:falsein 25 ms; 404 →ok:false, HTTP 404.🤖 Generated with Claude Code