From 1ad7560c46591436a7c3a462747e3b99d6551a15 Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Fri, 24 Apr 2026 02:26:58 -0700 Subject: [PATCH] feat(announcements): add SEO metadata via server layout.tsx The announcements page is a public, crawlable route but its page.tsx is 'use client', so it can't export metadata itself and falls back to the root app/layout.tsx. Add a server-component layout.tsx under app/(home)/announcements/ that exports route-specific metadata (title, description, canonical, OpenGraph, Twitter) in the same shape as the neighboring /blog, /changelog, /contact, /privacy, /terms routes. page.tsx is unchanged. Canonical URL matches app/layout.tsx's metadataBase (https://surfsense.com). Fixes #1244 --- .../app/(home)/announcements/layout.tsx | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 surfsense_web/app/(home)/announcements/layout.tsx diff --git a/surfsense_web/app/(home)/announcements/layout.tsx b/surfsense_web/app/(home)/announcements/layout.tsx new file mode 100644 index 000000000..072db2c3f --- /dev/null +++ b/surfsense_web/app/(home)/announcements/layout.tsx @@ -0,0 +1,25 @@ +import type { Metadata } from "next"; +import type { ReactNode } from "react"; + +export const metadata: Metadata = { + title: "Announcements | SurfSense", + description: "Latest product updates, feature releases, and news from SurfSense.", + alternates: { + canonical: "https://surfsense.com/announcements", + }, + openGraph: { + title: "Announcements | SurfSense", + description: "Latest product updates, feature releases, and news from SurfSense.", + url: "https://surfsense.com/announcements", + type: "website", + }, + twitter: { + card: "summary_large_image", + title: "Announcements | SurfSense", + description: "Latest product updates, feature releases, and news from SurfSense.", + }, +}; + +export default function AnnouncementsLayout({ children }: { children: ReactNode }) { + return <>{children}; +}