From 2e92e45ee669b63c423f166f6d138ac62d007415 Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Fri, 1 May 2026 11:15:29 -0400 Subject: [PATCH] seo: add per-project OG image generator via next/og (pre-renders all 7 project cards at build time) --- src/app/projects/[slug]/opengraph-image.tsx | 123 ++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/app/projects/[slug]/opengraph-image.tsx diff --git a/src/app/projects/[slug]/opengraph-image.tsx b/src/app/projects/[slug]/opengraph-image.tsx new file mode 100644 index 0000000..0e1c2e6 --- /dev/null +++ b/src/app/projects/[slug]/opengraph-image.tsx @@ -0,0 +1,123 @@ +import { ImageResponse } from "next/og"; +import { projects } from "@/data/projects"; + +export const size = { width: 1200, height: 630 }; +export const contentType = "image/png"; + +export function generateStaticParams() { + return projects.map((p) => ({ slug: p.slug })); +} + +export default async function Image({ + params, +}: { + params: Promise<{ slug: string }>; +}) { + const { slug } = await params; + const project = projects.find((p) => p.slug === slug); + + if (!project) { + return new ImageResponse( +
, + { ...size } + ); + } + + return new ImageResponse( + ( +
+ {/* Brand mark top-left */} +
+ WILD DRAGON +
+ + {/* URL bottom-right */} +
+ wilddragon.net +
+ + {/* Accent bar */} +
+ + {/* Client name */} +
+ {project.client} +
+ + {/* Category + Year row */} +
+
+ {project.category} +
+
+ {project.year} +
+
+
+ ), + { ...size } + ); +}