···11"use client";
2233+import { siteTagline } from "@/lib/site";
34import { useState, useEffect } from "react";
45import Image from "next/image";
56import GrainedBlob from "./GrainedBlob";
···157158 {/* Sub-heading + body */}
158159 <div className="lg:col-span-5 lg:pl-[calc(100%/5)]">
159160 <FadeIn delay={500}>
160160- <h2 className="mb-3">
161161- A social network that belongs to the people.
162162- </h2>
161161+ <h2 className="mb-3">{siteTagline}.</h2>
163162 </FadeIn>
164163 <FadeIn delay={600}>
165164 <p className="section-copy lg:pl-[calc(100%/4)] text-right">
+35-3
app/layout.tsx
···11import type { Metadata } from "next";
22+import { siteDescription, siteName, siteTitle } from "@/lib/site";
23import { Instrument_Serif, Instrument_Sans } from "next/font/google";
34import { Analytics } from "@vercel/analytics/next";
45import { SpeedInsights } from "@vercel/speed-insights/next";
···1718 weight: ["400", "500", "600", "700"],
1819});
19202121+/** Canonical site for metadata (OG, etc.). Override via NEXT_PUBLIC_SITE_URL if needed. */
2222+const siteUrl =
2323+ process.env.NEXT_PUBLIC_SITE_URL ??
2424+ (process.env.VERCEL_URL
2525+ ? process.env.VERCEL_ENV === "production"
2626+ ? "https://eny.social"
2727+ : `https://${process.env.VERCEL_URL}`
2828+ : "http://localhost:3000");
2929+3030+const ogImage = "/opengraph.png";
3131+2032export const metadata: Metadata = {
2121- title: "eny.social — A social network that belongs to the people",
2222- description:
2323- "No algorithms shaping your reality. Decentralized. Built and hosted in Europe. Starting in Offenbach.",
3333+ metadataBase: new URL(siteUrl),
3434+ title: siteTitle,
3535+ description: siteDescription,
3636+ openGraph: {
3737+ type: "website",
3838+ siteName,
3939+ title: siteTitle,
4040+ description: siteDescription,
4141+ images: [
4242+ {
4343+ url: ogImage,
4444+ width: 1200,
4545+ height: 630,
4646+ alt: siteTitle,
4747+ },
4848+ ],
4949+ },
5050+ twitter: {
5151+ card: "summary_large_image",
5252+ title: siteTitle,
5353+ description: siteDescription,
5454+ images: [{ url: ogImage, alt: siteTitle }],
5555+ },
2456};
25572658export default function RootLayout({
+10
lib/site.ts
···11+/** Site copy shared by layout metadata, OG image, and pages. */
22+33+export const siteName = "eny.social";
44+55+export const siteTagline = "A social network that belongs to the people";
66+77+export const siteDescription =
88+ "No algorithms shaping your reality. Decentralized. Built and hosted in Europe. Starting in Offenbach.";
99+1010+export const siteTitle = `${siteName} — ${siteTagline}`;