Skip to content

Commit e3979f6

Browse files
committed
feat(seo): add dynamic OG image, theme color, fix broken /og.png ref
- add app/opengraph-image.tsx — 1200x630 PNG generated at build time via ImageResponse (brand gradient + tagline) - add app/twitter-image.tsx — re-uses opengraph-image - remove dead manual openGraph.images and twitter.images refs that pointed to non-existent /og.png - add viewport.themeColor #0f4c3a (primary brand green)
1 parent c94f1c1 commit e3979f6

3 files changed

Lines changed: 80 additions & 10 deletions

File tree

app/layout.tsx

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Metadata } from "next";
1+
import type { Metadata, Viewport } from "next";
22
import { Analytics } from "@vercel/analytics/next";
33
import { ClarityAnalytics } from "@/components/site/clarity";
44
import { SITE } from "@/lib/site";
@@ -24,21 +24,12 @@ export const metadata: Metadata = {
2424
title: "FIRST FLUKE — Make Your First Win",
2525
description:
2626
"AI와 기술로 더 나은 일상을 만드는 팀, FIRST FLUKE.",
27-
images: [
28-
{
29-
url: "/og.png",
30-
width: 1200,
31-
height: 630,
32-
alt: "FIRST FLUKE — Make Your First Win",
33-
},
34-
],
3527
},
3628
twitter: {
3729
card: "summary_large_image",
3830
title: "FIRST FLUKE — Make Your First Win",
3931
description:
4032
"AI와 기술로 더 나은 일상을 만드는 팀.",
41-
images: ["/og.png"],
4233
},
4334
icons: {
4435
icon: "/favicon.png",
@@ -53,6 +44,10 @@ export const metadata: Metadata = {
5344
},
5445
};
5546

47+
export const viewport: Viewport = {
48+
themeColor: "#0f4c3a",
49+
};
50+
5651
const ORGANIZATION_JSONLD = {
5752
"@context": "https://schema.org",
5853
"@type": "Organization",

app/opengraph-image.tsx

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { ImageResponse } from "next/og";
2+
3+
export const dynamic = "force-static";
4+
export const size = { width: 1200, height: 630 };
5+
export const contentType = "image/png";
6+
export const alt = "FIRST FLUKE — Make Your First Win";
7+
8+
export default async function OpengraphImage() {
9+
return new ImageResponse(
10+
(
11+
<div
12+
style={{
13+
width: "100%",
14+
height: "100%",
15+
display: "flex",
16+
flexDirection: "column",
17+
justifyContent: "space-between",
18+
padding: "80px",
19+
background:
20+
"linear-gradient(135deg, #0f4c3a 0%, #1a6048 50%, #7ab94c 100%)",
21+
color: "#fafaf7",
22+
fontFamily: "system-ui, sans-serif",
23+
}}
24+
>
25+
<div
26+
style={{
27+
display: "flex",
28+
fontSize: 28,
29+
letterSpacing: 4,
30+
opacity: 0.85,
31+
}}
32+
>
33+
FIRST FLUKE
34+
</div>
35+
<div style={{ display: "flex", flexDirection: "column", gap: 24 }}>
36+
<div
37+
style={{
38+
fontSize: 96,
39+
fontWeight: 700,
40+
lineHeight: 1.05,
41+
letterSpacing: -2,
42+
}}
43+
>
44+
Make Your First Win
45+
</div>
46+
<div
47+
style={{
48+
fontSize: 36,
49+
opacity: 0.9,
50+
lineHeight: 1.3,
51+
}}
52+
>
53+
AI와 기술로 더 나은 일상을 만드는 팀
54+
</div>
55+
</div>
56+
<div
57+
style={{
58+
display: "flex",
59+
justifyContent: "space-between",
60+
alignItems: "flex-end",
61+
fontSize: 24,
62+
opacity: 0.85,
63+
}}
64+
>
65+
<div style={{ display: "flex" }}>모두의 창업 2026 선정</div>
66+
<div style={{ display: "flex" }}>firstfluke.com</div>
67+
</div>
68+
</div>
69+
),
70+
{ ...size },
71+
);
72+
}

app/twitter-image.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { default, size, contentType, alt } from "./opengraph-image";
2+
3+
export const dynamic = "force-static";

0 commit comments

Comments
 (0)