From fca9d7ab5dbfc5ad5e55f45f2bd9104c90921982 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Fri, 20 Feb 2026 08:49:53 -0600 Subject: [PATCH] fix og (#515) --- docs/public/Geist-Regular.ttf | Bin 0 -> 71112 bytes docs/src/app/cdp-mode/page.mdx | 4 +- docs/src/app/changelog/page.mdx | 4 +- docs/src/app/commands/page.mdx | 4 +- docs/src/app/configuration/page.mdx | 4 +- docs/src/app/diffing/page.mdx | 4 +- docs/src/app/installation/page.mdx | 4 +- docs/src/app/ios/page.mdx | 4 +- docs/src/app/layout.tsx | 21 +++++- docs/src/app/og/[...slug]/route.tsx | 16 +++++ docs/src/app/og/og-image.tsx | 104 ++++++++++++++++++++++++++++ docs/src/app/og/route.tsx | 6 ++ docs/src/app/page.mdx | 4 +- docs/src/app/profiler/page.mdx | 4 +- docs/src/app/quick-start/page.mdx | 4 +- docs/src/app/selectors/page.mdx | 4 +- docs/src/app/sessions/page.mdx | 4 +- docs/src/app/snapshots/page.mdx | 4 +- docs/src/app/streaming/page.mdx | 4 +- docs/src/lib/page-metadata.ts | 39 +++++++++++ docs/src/lib/page-titles.ts | 20 ++++++ 21 files changed, 247 insertions(+), 15 deletions(-) create mode 100644 docs/public/Geist-Regular.ttf create mode 100644 docs/src/app/og/[...slug]/route.tsx create mode 100644 docs/src/app/og/og-image.tsx create mode 100644 docs/src/app/og/route.tsx create mode 100644 docs/src/lib/page-metadata.ts create mode 100644 docs/src/lib/page-titles.ts diff --git a/docs/public/Geist-Regular.ttf b/docs/public/Geist-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..07f9e4fcf6a58366129b149297efcd34fdeaa391 GIT binary patch literal 71112 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 literal 0 HcmV?d00001 diff --git a/docs/src/app/cdp-mode/page.mdx b/docs/src/app/cdp-mode/page.mdx index 9c5242a..7edec00 100644 --- a/docs/src/app/cdp-mode/page.mdx +++ b/docs/src/app/cdp-mode/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "CDP Mode" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("cdp-mode") # CDP Mode diff --git a/docs/src/app/changelog/page.mdx b/docs/src/app/changelog/page.mdx index 5134fab..d5d8e54 100644 --- a/docs/src/app/changelog/page.mdx +++ b/docs/src/app/changelog/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Changelog" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("changelog") # Changelog diff --git a/docs/src/app/commands/page.mdx b/docs/src/app/commands/page.mdx index 82ed5f4..5e9e793 100644 --- a/docs/src/app/commands/page.mdx +++ b/docs/src/app/commands/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Commands" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("commands") # Commands diff --git a/docs/src/app/configuration/page.mdx b/docs/src/app/configuration/page.mdx index a82c36b..ff93d10 100644 --- a/docs/src/app/configuration/page.mdx +++ b/docs/src/app/configuration/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Configuration" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("configuration") # Configuration diff --git a/docs/src/app/diffing/page.mdx b/docs/src/app/diffing/page.mdx index f6fcda9..871b512 100644 --- a/docs/src/app/diffing/page.mdx +++ b/docs/src/app/diffing/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Diffing" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("diffing") import { DiffDemo } from "@/components/diff-demo" diff --git a/docs/src/app/installation/page.mdx b/docs/src/app/installation/page.mdx index fe0fbb9..f203965 100644 --- a/docs/src/app/installation/page.mdx +++ b/docs/src/app/installation/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Installation" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("installation") # Installation diff --git a/docs/src/app/ios/page.mdx b/docs/src/app/ios/page.mdx index 82e6b1d..1a40cab 100644 --- a/docs/src/app/ios/page.mdx +++ b/docs/src/app/ios/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "iOS Simulator" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("ios") # iOS Simulator diff --git a/docs/src/app/layout.tsx b/docs/src/app/layout.tsx index 4d451a4..ec09015 100644 --- a/docs/src/app/layout.tsx +++ b/docs/src/app/layout.tsx @@ -21,8 +21,27 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "agent-browser", + metadataBase: new URL("https://agent-browser.dev"), + title: { + default: "agent-browser | Headless Browser Automation for AI", + template: "%s | agent-browser", + }, description: "Headless browser automation CLI for AI agents", + openGraph: { + type: "website", + locale: "en_US", + url: "https://agent-browser.dev", + siteName: "agent-browser", + title: "agent-browser | Headless Browser Automation for AI", + description: "Headless browser automation CLI for AI agents", + images: [{ url: "/og", width: 1200, height: 630, alt: "agent-browser" }], + }, + twitter: { + card: "summary_large_image", + title: "agent-browser | Headless Browser Automation for AI", + description: "Headless browser automation CLI for AI agents", + images: ["/og"], + }, }; export default async function RootLayout({ diff --git a/docs/src/app/og/[...slug]/route.tsx b/docs/src/app/og/[...slug]/route.tsx new file mode 100644 index 0000000..50ce10c --- /dev/null +++ b/docs/src/app/og/[...slug]/route.tsx @@ -0,0 +1,16 @@ +import { NextResponse } from "next/server"; +import { getPageTitle, renderOgImage } from "../og-image"; + +export async function GET( + _request: Request, + { params }: { params: Promise<{ slug: string[] }> }, +) { + const { slug } = await params; + const title = getPageTitle(slug.join("/")); + + if (!title) { + return NextResponse.json({ error: "Not found" }, { status: 404 }); + } + + return renderOgImage(title); +} diff --git a/docs/src/app/og/og-image.tsx b/docs/src/app/og/og-image.tsx new file mode 100644 index 0000000..dde4dde --- /dev/null +++ b/docs/src/app/og/og-image.tsx @@ -0,0 +1,104 @@ +import { ImageResponse } from "next/og"; +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; + +export { getPageTitle } from "@/lib/page-titles"; + +let fontCache: { geistRegular: Buffer } | null = null; + +async function loadFonts() { + if (fontCache) return fontCache; + const geistRegular = await readFile( + join(process.cwd(), "public/Geist-Regular.ttf"), + ); + fontCache = { geistRegular }; + return fontCache; +} + +export async function renderOgImage(title: string) { + const { geistRegular } = await loadFonts(); + + return new ImageResponse( +
+
+ + + + + / + + + agent-browser + +
+ +
+ {title.split("\n").map((line, i) => ( + + {line} + + ))} +
+
, + { + width: 1200, + height: 630, + fonts: [ + { + name: "Geist", + data: geistRegular.buffer as ArrayBuffer, + style: "normal", + weight: 400, + }, + ], + }, + ); +} diff --git a/docs/src/app/og/route.tsx b/docs/src/app/og/route.tsx new file mode 100644 index 0000000..e37a195 --- /dev/null +++ b/docs/src/app/og/route.tsx @@ -0,0 +1,6 @@ +import { getPageTitle, renderOgImage } from "./og-image"; + +export async function GET() { + const title = getPageTitle("")!; + return renderOgImage(title); +} diff --git a/docs/src/app/page.mdx b/docs/src/app/page.mdx index 962c6d2..4ba14a6 100644 --- a/docs/src/app/page.mdx +++ b/docs/src/app/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "agent-browser" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("") # agent-browser diff --git a/docs/src/app/profiler/page.mdx b/docs/src/app/profiler/page.mdx index f964376..95108f5 100644 --- a/docs/src/app/profiler/page.mdx +++ b/docs/src/app/profiler/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Profiler" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("profiler") # Profiler diff --git a/docs/src/app/quick-start/page.mdx b/docs/src/app/quick-start/page.mdx index 81881d2..3346321 100644 --- a/docs/src/app/quick-start/page.mdx +++ b/docs/src/app/quick-start/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Quick Start" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("quick-start") # Quick Start diff --git a/docs/src/app/selectors/page.mdx b/docs/src/app/selectors/page.mdx index 1ab7013..03d76a5 100644 --- a/docs/src/app/selectors/page.mdx +++ b/docs/src/app/selectors/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Selectors" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("selectors") # Selectors diff --git a/docs/src/app/sessions/page.mdx b/docs/src/app/sessions/page.mdx index b73182e..bf234c2 100644 --- a/docs/src/app/sessions/page.mdx +++ b/docs/src/app/sessions/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Sessions" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("sessions") # Sessions diff --git a/docs/src/app/snapshots/page.mdx b/docs/src/app/snapshots/page.mdx index 43471ee..a5a9f05 100644 --- a/docs/src/app/snapshots/page.mdx +++ b/docs/src/app/snapshots/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Snapshots" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("snapshots") # Snapshots diff --git a/docs/src/app/streaming/page.mdx b/docs/src/app/streaming/page.mdx index 15af7b9..d0c32a6 100644 --- a/docs/src/app/streaming/page.mdx +++ b/docs/src/app/streaming/page.mdx @@ -1,4 +1,6 @@ -export const metadata = { title: "Streaming" } +import { pageMetadata } from "@/lib/page-metadata" + +export const metadata = pageMetadata("streaming") # Streaming diff --git a/docs/src/lib/page-metadata.ts b/docs/src/lib/page-metadata.ts new file mode 100644 index 0000000..2246af4 --- /dev/null +++ b/docs/src/lib/page-metadata.ts @@ -0,0 +1,39 @@ +import type { Metadata } from "next"; +import { PAGE_TITLES } from "./page-titles"; + +const DESCRIPTION = + "Headless browser automation CLI for AI agents"; + +export function pageMetadata(slug: string): Metadata { + const title = PAGE_TITLES[slug]; + if (!title) return {}; + + const displayTitle = title.replace(/\n/g, " "); + const fullTitle = `${displayTitle} | agent-browser`; + const ogImageUrl = slug ? `/og/${slug}` : "/og"; + + return { + title: displayTitle, + openGraph: { + type: "website", + locale: "en_US", + siteName: "agent-browser", + title: fullTitle, + description: DESCRIPTION, + images: [ + { + url: ogImageUrl, + width: 1200, + height: 630, + alt: `${displayTitle} - agent-browser`, + }, + ], + }, + twitter: { + card: "summary_large_image", + title: fullTitle, + description: DESCRIPTION, + images: [ogImageUrl], + }, + }; +} diff --git a/docs/src/lib/page-titles.ts b/docs/src/lib/page-titles.ts new file mode 100644 index 0000000..a43ff5e --- /dev/null +++ b/docs/src/lib/page-titles.ts @@ -0,0 +1,20 @@ +export const PAGE_TITLES: Record = { + "": "Headless Browser\nAutomation for AI", + installation: "Installation", + "quick-start": "Quick Start", + commands: "Commands", + configuration: "Configuration", + selectors: "Selectors", + snapshots: "Snapshots", + sessions: "Sessions", + diffing: "Diffing", + "cdp-mode": "CDP Mode", + streaming: "Streaming", + profiler: "Profiler", + ios: "iOS Simulator", + changelog: "Changelog", +}; + +export function getPageTitle(slug: string): string | null { + return slug in PAGE_TITLES ? PAGE_TITLES[slug]! : null; +}