From 6bbcc9532b139648efda950a06e9766bb4d2609c Mon Sep 17 00:00:00 2001 From: GANESH NADKARNI Date: Sun, 24 May 2026 14:51:14 +0530 Subject: [PATCH 1/6] fix: add production-compatible RSS feed for changelog Uses getChangelogIndexItems() with build-time data instead of fs.readdirSync, so the feed works on Vercel production. Fixes #1614 --- app/api/changelog-rss.xml/route.ts | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 app/api/changelog-rss.xml/route.ts diff --git a/app/api/changelog-rss.xml/route.ts b/app/api/changelog-rss.xml/route.ts new file mode 100644 index 0000000000..fda0f89b3a --- /dev/null +++ b/app/api/changelog-rss.xml/route.ts @@ -0,0 +1,52 @@ +import { getChangelogIndexItems } from "@/lib/changelog-index"; + +export async function GET() { + try { + const items = getChangelogIndexItems(); + + const rssItems = items + .map((item) => { + const title = item.frontMatter?.title ?? "Untitled"; + const description = item.frontMatter?.description ?? ""; + const date = item.frontMatter?.date + ? new Date(item.frontMatter.date).toUTCString() + : new Date().toUTCString(); + const url = `https://langfuse.com${item.route}`; + + return ` + + <![CDATA[${title}]]> + ${url} + ${url} + ${date} + + `; + }) + .join(""); + + const feed = ` + + + Langfuse Changelog + https://langfuse.com/changelog + + Latest updates from Langfuse + en-us + ${rssItems} + +`; + + return new Response(feed, { + headers: { + "Content-Type": "application/xml; charset=utf-8", + "Cache-Control": "public, max-age=3600, s-maxage=3600", + }, + }); + } catch (err) { + console.error("RSS generation failed:", err); + return new Response(JSON.stringify({ error: "Failed to generate RSS feed" }), { + status: 500, + headers: { "Content-Type": "application/json" }, + }); + } +} \ No newline at end of file From 546d4ca0bacaabb88c537e86cbb13128159c0d59 Mon Sep 17 00:00:00 2001 From: GANESH NADKARNI Date: Sun, 24 May 2026 14:55:42 +0530 Subject: [PATCH 2/6] fix: add production-compatible RSS feed for changelog - Adds /api/changelog-rss.xml endpoint using getChangelogIndexItems() instead of fs.readdirSync so it works on Vercel production - Adds RSS Feed link to changelog page UI Fixes #1614 --- app/changelog/page.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/changelog/page.tsx b/app/changelog/page.tsx index 16b72cbecd..c4726bc9b9 100644 --- a/app/changelog/page.tsx +++ b/app/changelog/page.tsx @@ -65,13 +65,18 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) { Changelog - + Latest release updates from the Langfuse team. Check out our{" "} Roadmap {" "} to see what's next. +
+ + RSS Feed + +
From 7de9770d5be88f5da1123bbb1141371fbbf5ad7b Mon Sep 17 00:00:00 2001 From: GANESH NADKARNI Date: Sun, 24 May 2026 15:08:56 +0530 Subject: [PATCH 3/6] fix: add RSS button to changelog page UI --- app/changelog/page.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/changelog/page.tsx b/app/changelog/page.tsx index c4726bc9b9..df667ae616 100644 --- a/app/changelog/page.tsx +++ b/app/changelog/page.tsx @@ -12,6 +12,8 @@ import { TextHighlight } from "@/components/ui/text-highlight"; import { Link } from "@/components/ui/link"; import { Heading } from "@/components/ui/heading"; import { Text } from "@/components/ui/text"; +import { Rss } from "lucide-react"; +import { Button } from "@/components/ui/button"; type PageProps = { searchParams: Promise<{ page?: string }>; @@ -65,7 +67,7 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) { Changelog - + Latest release updates from the Langfuse team. Check out our{" "} Roadmap @@ -73,9 +75,12 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) { to see what's next.
- - RSS Feed - +
@@ -89,4 +94,4 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) {
); -} +} \ No newline at end of file From 538f1bfe8de4cc348142f4d0310e06978d5dedf7 Mon Sep 17 00:00:00 2001 From: GANESH NADKARNI Date: Sun, 24 May 2026 15:37:51 +0530 Subject: [PATCH 4/6] fix: use NEXT_PUBLIC_BASE_URL env var for base URL in RSS feed Signed-off-by: GANESH NADKARNI --- app/api/changelog-rss.xml/route.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/api/changelog-rss.xml/route.ts b/app/api/changelog-rss.xml/route.ts index fda0f89b3a..79b2effe3b 100644 --- a/app/api/changelog-rss.xml/route.ts +++ b/app/api/changelog-rss.xml/route.ts @@ -3,6 +3,8 @@ import { getChangelogIndexItems } from "@/lib/changelog-index"; export async function GET() { try { const items = getChangelogIndexItems(); + const baseUrl = + process.env.NEXT_PUBLIC_BASE_URL ?? "https://langfuse.com"; const rssItems = items .map((item) => { @@ -11,7 +13,7 @@ export async function GET() { const date = item.frontMatter?.date ? new Date(item.frontMatter.date).toUTCString() : new Date().toUTCString(); - const url = `https://langfuse.com${item.route}`; + const url = `${baseUrl}${item.route}`; return ` @@ -28,8 +30,8 @@ export async function GET() { Langfuse Changelog - https://langfuse.com/changelog - + ${baseUrl}/changelog + Latest updates from Langfuse en-us ${rssItems} @@ -44,9 +46,12 @@ export async function GET() { }); } catch (err) { console.error("RSS generation failed:", err); - return new Response(JSON.stringify({ error: "Failed to generate RSS feed" }), { - status: 500, - headers: { "Content-Type": "application/json" }, - }); + return new Response( + JSON.stringify({ error: "Failed to generate RSS feed" }), + { + status: 500, + headers: { "Content-Type": "application/json" }, + } + ); } } \ No newline at end of file From 821f0579f8ad211f500ad2958567813cb6049a4e Mon Sep 17 00:00:00 2001 From: GANESH NADKARNI Date: Sun, 30 Aug 2026 22:20:49 +0530 Subject: [PATCH 5/6] Update page.tsx --- app/changelog/page.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/changelog/page.tsx b/app/changelog/page.tsx index df667ae616..6a54860bfb 100644 --- a/app/changelog/page.tsx +++ b/app/changelog/page.tsx @@ -30,7 +30,6 @@ export async function generateMetadata({ ); const currentPage = parseChangelogPageParam(sp.page, totalPages); const canonical = changelogPageHref(currentPage, totalPages) ?? "/changelog"; - return { alternates: { canonical, @@ -59,7 +58,6 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) { sliceStart, sliceStart + CHANGELOG_ITEMS_PER_PAGE, ); - return (
@@ -75,10 +73,15 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) { to see what's next.
-
@@ -94,4 +97,4 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) {
); -} \ No newline at end of file +} From 6854a792a6e3e8dc35ccf7d92a3146178c8bb1c6 Mon Sep 17 00:00:00 2001 From: GANESH NADKARNI Date: Mon, 7 Sep 2026 18:56:25 +0530 Subject: [PATCH 6/6] Change RSS button variant to secondary and size to small --- app/changelog/page.tsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/changelog/page.tsx b/app/changelog/page.tsx index 8ea60a5e85..d306bc75be 100644 --- a/app/changelog/page.tsx +++ b/app/changelog/page.tsx @@ -76,17 +76,17 @@ export default async function ChangelogIndexPage({ searchParams }: PageProps) { to see what's next.
- +