import { loader } from "fumadocs-core/source"; import type { Metadata } from "next"; import { changelog } from "@/.source/server"; import { BreadcrumbNav } from "@/components/seo/breadcrumb-nav"; import { formatDate } from "@/lib/utils"; import { getMDXComponents } from "@/mdx-components"; export const metadata: Metadata = { title: "Changelog | SurfSense", description: "See what's new in SurfSense. Latest updates, features, and improvements.", alternates: { canonical: "https://surfsense.com/changelog", }, }; const source = loader({ baseUrl: "/changelog", source: changelog.toFumadocsSource(), }); interface ChangelogData { title: string; date: string; version?: string; tags?: string[]; body: React.ComponentType<{ components?: Record }>; } interface ChangelogPageItem { url: string; data: ChangelogData; } export default async function ChangelogPage() { const allPages = source.getPages() as ChangelogPageItem[]; const sortedChangelogs = allPages.toSorted((a, b) => { const dateA = new Date(a.data.date).getTime(); const dateB = new Date(b.data.date).getTime(); return dateB - dateA; }); return (
{/* Header */}

Changelog

Stay up to date with the latest updates and improvements to SurfSense.

{/* Timeline */}
{sortedChangelogs.map((changelog) => { const MDX = changelog.data.body; const date = new Date(changelog.data.date); const formattedDate = formatDate(date); return (
{changelog.data.version && (
{changelog.data.version}
)}
{/* Right side - Content */}
{/* Vertical timeline line */}
{/* Timeline dot */}

{changelog.data.title}

{/* Tags */} {changelog.data.tags && changelog.data.tags.length > 0 && (
{changelog.data.tags.map((tag: string) => ( {tag} ))}
)}
); })}
); }