diff --git a/app/layout.tsx b/app/layout.tsx index d20216a..9297caf 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -4,6 +4,7 @@ import { links, SITE_URL, INDEXABLE } from "@/lib/links"; import { Chrome } from "@/components/site/Chrome"; import { Footer } from "@/components/site/Footer"; import { ScrollReveal } from "@/components/site/ScrollReveal"; +import { FAQ_ITEMS } from "@/lib/faq"; import "./globals.css"; const geistSans = Geist({ @@ -47,6 +48,8 @@ export const viewport: Viewport = { const ORG_ID = `${SITE_URL}#organization`; const SITE_ID = `${SITE_URL}#website`; +const SERVICE_ID = `${SITE_URL}#service`; +const FAQ_ID = `${SITE_URL}#faq`; const organizationSchema = { "@context": "https://schema.org", @@ -54,8 +57,9 @@ const organizationSchema = { "@id": ORG_ID, name: "deCDN", url: SITE_URL, - logo: `${SITE_URL}icon.svg`, - description: DESCRIPTION, + logo: `${SITE_URL}d_logo.png`, + description: + "Organization developing deCDN, a peer-to-peer content delivery network with per-megabyte settlement in USDC.", sameAs: [links.github, links.x], }; @@ -69,6 +73,29 @@ const websiteSchema = { publisher: { "@id": ORG_ID }, }; +const serviceSchema = { + "@context": "https://schema.org", + "@type": "Service", + "@id": SERVICE_ID, + name: "deCDN", + url: SITE_URL, + serviceType: "Content Delivery Network", + provider: { "@id": ORG_ID }, + areaServed: "Worldwide", + description: DESCRIPTION, +}; + +const faqSchema = { + "@context": "https://schema.org", + "@type": "FAQPage", + "@id": FAQ_ID, + mainEntity: FAQ_ITEMS.map(({ q, a }) => ({ + "@type": "Question", + name: q, + acceptedAnswer: { "@type": "Answer", text: a }, + })), +}; + // Inline JSON in ` in any field // can't close the tag and create an XSS sink. < decodes back to `<` in // every JSON parser, so structured-data consumers are unaffected. @@ -86,13 +113,15 @@ export default function RootLayout({ className={`${geistSans.variable} h-full motion-safe:scroll-smooth`} > - {[organizationSchema, websiteSchema].map((schema) => ( -