From 7585a38a73d08d3ffef655686352a32d3dd0b559 Mon Sep 17 00:00:00 2001 From: Lewis Carhart Date: Mon, 24 Feb 2025 15:53:55 +0000 Subject: [PATCH] feat: Enhance SEO with dynamic metadata generation - Add new SEO utility function `generatePageMeta()` for flexible metadata configuration - Update layout and home page to use dynamic metadata generation - Add default Open Graph image for improved social sharing - Centralize SEO configuration with base metadata settings --- apps/web/public/og.png | Bin 0 -> 48953 bytes apps/web/src/app/(home)/page.tsx | 9 -- apps/web/src/app/layout.tsx | 11 +-- apps/web/src/lib/seo.tsx | 158 +++++++++++++++++++++++++++++++ 4 files changed, 162 insertions(+), 16 deletions(-) create mode 100644 apps/web/public/og.png create mode 100644 apps/web/src/lib/seo.tsx diff --git a/apps/web/public/og.png b/apps/web/public/og.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1c9160e13bbdec7bcd61857efbfe03b7e310d7 GIT binary patch literal 48953 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 N3bHCPrB6-#{|6{*;FSOX literal 0 HcmV?d00001 diff --git a/apps/web/src/app/(home)/page.tsx b/apps/web/src/app/(home)/page.tsx index 3426058e24..be9e08bd34 100644 --- a/apps/web/src/app/(home)/page.tsx +++ b/apps/web/src/app/(home)/page.tsx @@ -5,15 +5,6 @@ import Link from "next/link"; import Balancer from "react-wrap-balancer"; import Logo from "../components/logo"; -export const metadata: Metadata = { - title: "Comp AI - Get SOC 2, ISO 27001 and GDPR compliant", - description: - "The open-source compliance automation platform for SOC 2, ISO 27001, GDPR and more.", - alternates: { - canonical: "https://trycomp.ai", - }, -}; - export default function Home() { return (
diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 806438cef8..0223e9911c 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -4,17 +4,14 @@ import { Toaster } from "sonner"; import "@bubba/ui/globals.css"; import { Providers } from "@/app/providers"; import { env } from "@/env.mjs"; +import { generatePageMeta } from "@/lib/seo"; import { cn } from "@/lib/utils"; import { GoogleTagManager } from "@next/third-parties/google"; import localFont from "next/font/local"; -export const metadata: Metadata = { - title: "Comp AI", - description: "Automate SOC 2, ISO 27001 and GDPR compliance with AI.", - icons: { - icon: "/favicon-96x96.png", - }, -}; +export const metadata = generatePageMeta({ + url: "/", +}); const font = localFont({ src: "../../public/fonts/GeneralSans-Variable.ttf", diff --git a/apps/web/src/lib/seo.tsx b/apps/web/src/lib/seo.tsx new file mode 100644 index 0000000000..eb3a8b6bff --- /dev/null +++ b/apps/web/src/lib/seo.tsx @@ -0,0 +1,158 @@ +import type { Metadata } from "next"; +import type { OpenGraph } from "next/dist/lib/metadata/types/opengraph-types"; +import type { Twitter } from "next/dist/lib/metadata/types/twitter-types"; +import type { StaticImageData } from "next/image"; + +const baseURL = "https://trycomp.ai"; +const title = "Comp AI - Open Source Platform for SOC 2, ISO 27001 & GDPR"; +const description = + "The Open Source Drata & Vanta alternative that does everything you need to get compliant, fast. Get SOC 2, ISO 27001 and GDPR compliant in minutes."; + +export const rootOpenGraph: OpenGraph = { + locale: "en", + type: "website", + url: baseURL, + siteName: "Comp AI", + title, + description, +}; + +export const rootTwitter: Twitter = { + title, + description, + card: "summary_large_image", + creator: "@trycompai", + site: "@trycompai", +}; + +export const rootMetadata: Metadata = { + metadataBase: new URL(baseURL), + title, + description, + applicationName: "Comp AI", + openGraph: rootOpenGraph, + twitter: rootTwitter, + robots: + "follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large", +}; + +function getImage( + image?: StaticImageData | string, + alt?: string, + width?: number, + height?: number, +) { + if (!image) { + return null; + } + + if (typeof image === "string") { + return { + url: image, + alt, + width, + height, + type: image.endsWith(".png") ? "image/png" : "image/jpeg", + }; + } + + return { + url: image.src, + width: image.width, + height: image.height, + alt, + type: image.src.endsWith(".png") ? "image/png" : "image/jpeg", + }; +} + +export function generatePageMeta({ + title = rootMetadata.title as string, + description = rootMetadata.description as string, + url, + image, + image_alt, + image_width, + image_height, + publishedAt, + updatedAt, + siteName = rootMetadata.applicationName as string, + authors, + noindex, + locale = "en", +}: { + title?: string; + description?: string; + url?: string; + image?: StaticImageData | string; + image_alt?: string; + image_width?: number; + image_height?: number; + publishedAt?: string; + updatedAt?: string; + authors?: string[]; + siteName?: string; + noindex?: boolean; + locale?: string; +} = {}): Metadata { + const metadata = { + ...rootMetadata, + title, + description, + alternates: { + canonical: url, + }, + authors: authors, + openGraph: { + ...rootOpenGraph, + locale, + url, + title: title, + description, + } as OpenGraph, + twitter: { + ...rootTwitter, + title: title, + description, + } as Twitter, + publisher: siteName, + other: {}, + } as Metadata; + + if (publishedAt) { + metadata.openGraph = { + ...metadata.openGraph, + type: "article", + locale: locale, + publishedTime: publishedAt, + modifiedTime: updatedAt ?? publishedAt, + authors: authors ?? [], + section: siteName, + tags: [siteName ?? "Comp AI"], + }; + } + + const img = getImage(image, image_alt ?? title, image_width, image_height); + const screenshot = { + url: `${metadata.metadataBase}og.png`, + width: 1200, + height: 630, + alt: title, + type: "image/png", + }; + metadata.openGraph!.images = img ? [img] : [screenshot]; + metadata.twitter!.images = img ? [img] : [screenshot]; + + if (siteName) { + metadata.applicationName = siteName; + metadata.openGraph!.siteName = siteName; + } + + if (noindex) { + metadata.robots = { + index: false, + follow: true, + }; + } + + return metadata; +}