Skip to content

Commit 4c9abde

Browse files
committed
feat(seo): add PWA manifest and enrich JSON-LD
- add app/manifest.ts (MetadataRoute.Manifest) - enrich Organization JSON-LD with sameAs, contactPoint, makesOffer - link WebSite JSON-LD to Organization via publisher @id - sitemap: use SITE constant, drop /privacy (disallowed in robots.ts)
1 parent be8f7d2 commit 4c9abde

3 files changed

Lines changed: 74 additions & 15 deletions

File tree

app/layout.tsx

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { Metadata } from "next";
22
import { Analytics } from "@vercel/analytics/next";
3+
import { SITE } from "@/lib/site";
4+
import { SOLUTIONS } from "@/lib/solutions";
35
import "./globals.css";
46

57
export const metadata: Metadata = {
@@ -46,18 +48,45 @@ export const metadata: Metadata = {
4648
const ORGANIZATION_JSONLD = {
4749
"@context": "https://schema.org",
4850
"@type": "Organization",
49-
name: "FIRST FLUKE",
50-
legalName: "퍼스트플루크 (FIRST FLUKE)",
51-
url: "https://firstfluke.com",
52-
logo: "https://firstfluke.com/logo.png",
51+
"@id": `${SITE.url}/#organization`,
52+
name: SITE.name,
53+
legalName: SITE.legalName,
54+
url: SITE.url,
55+
logo: `${SITE.url}/logo.png`,
56+
image: `${SITE.url}/og.png`,
57+
sameAs: [`https://www.threads.net/@${SITE.threadsHandle}`],
58+
contactPoint: [
59+
{
60+
"@type": "ContactPoint",
61+
contactType: "customer support",
62+
url: `${SITE.url}/#contact`,
63+
availableLanguage: ["Korean", "English"],
64+
},
65+
],
66+
award: SITE.selectionLabel,
67+
makesOffer: SOLUTIONS.map((solution) => ({
68+
"@type": "Offer",
69+
name: solution.name,
70+
category: solution.category,
71+
url: solution.href,
72+
itemOffered: {
73+
"@type": "SoftwareApplication",
74+
name: solution.name,
75+
description: solution.tagline,
76+
applicationCategory: "BusinessApplication",
77+
url: solution.href,
78+
},
79+
})),
5380
};
5481

5582
const WEBSITE_JSONLD = {
5683
"@context": "https://schema.org",
5784
"@type": "WebSite",
58-
name: "FIRST FLUKE",
59-
url: "https://firstfluke.com",
85+
"@id": `${SITE.url}/#website`,
86+
name: SITE.name,
87+
url: SITE.url,
6088
inLanguage: "ko-KR",
89+
publisher: { "@id": `${SITE.url}/#organization` },
6190
};
6291

6392
export default function RootLayout({

app/manifest.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { MetadataRoute } from "next";
2+
import { SITE } from "@/lib/site";
3+
4+
export const dynamic = "force-static";
5+
6+
export default function manifest(): MetadataRoute.Manifest {
7+
return {
8+
name: SITE.name,
9+
short_name: SITE.name,
10+
description:
11+
"AI와 기술로 더 나은 일상을 만드는 팀, FIRST FLUKE. 모두의 창업 2026 AI 솔루션 공급기업 선정.",
12+
start_url: "/",
13+
scope: "/",
14+
display: "standalone",
15+
orientation: "portrait",
16+
background_color: "#ffffff",
17+
theme_color: "#0a0a0a",
18+
lang: "ko-KR",
19+
categories: ["business", "productivity", "technology"],
20+
icons: [
21+
{
22+
src: "/favicon.png",
23+
sizes: "512x512",
24+
type: "image/png",
25+
purpose: "any",
26+
},
27+
{
28+
src: "/favicon.png",
29+
sizes: "512x512",
30+
type: "image/png",
31+
purpose: "maskable",
32+
},
33+
],
34+
};
35+
}

app/sitemap.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
import type { MetadataRoute } from "next";
2+
import { SITE } from "@/lib/site";
23

34
export const dynamic = "force-static";
45

56
export default function sitemap(): MetadataRoute.Sitemap {
6-
const base = "https://firstfluke.com";
7+
const lastModified = new Date();
78
return [
89
{
9-
url: `${base}/`,
10-
lastModified: new Date(),
10+
url: `${SITE.url}/`,
11+
lastModified,
1112
changeFrequency: "monthly",
1213
priority: 1,
1314
},
14-
{
15-
url: `${base}/privacy`,
16-
lastModified: new Date(),
17-
changeFrequency: "yearly",
18-
priority: 0.3,
19-
},
2015
];
2116
}

0 commit comments

Comments
 (0)