From 7d50b1018f35ea6272e839d69cc34903f498f31d Mon Sep 17 00:00:00 2001
From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com>
Date: Mon, 14 Sep 2026 13:36:03 -0700
Subject: [PATCH 1/4] fix(seo): page descriptions, canonical og tags and
sitemap cleanup
- theme.config.tsx: build og:image on splits.org instead of the per-deploy
Vercel hostname; emit og/twitter tags through next-seo with property=
and per-page og:url; drop duplicate viewport/theme-color, bogus twitter
tags and the static app tagline description; descriptive index title;
GitHub icon without an SVG
- pages/**/*.mdx: description frontmatter on all 29 pages
- pages/_document.tsx: html lang=en
- next-sitemap.config.js: no build-timestamp lastmod, no inert robots.txt
- next.config.js: sdk-info redirects permanent, straight to /sdk/
---
next-sitemap.config.js | 13 +++-
next.config.js | 12 +--
pages/_document.tsx | 14 ++++
pages/core.mdx | 4 +
pages/core/oracle.mdx | 4 +
pages/core/pass-through.mdx | 4 +
pages/core/split-v2.mdx | 4 +
pages/core/split.mdx | 4 +
pages/core/swapper.mdx | 4 +
pages/core/vesting.mdx | 4 +
pages/core/warehouse.mdx | 4 +
pages/core/waterfall.mdx | 4 +
pages/flow.mdx | 4 +
pages/index.mdx | 4 +
pages/react.mdx | 4 +
pages/sdk.mdx | 4 +
pages/sdk/data.mdx | 4 +
pages/sdk/liquid.mdx | 4 +
pages/sdk/multicall.mdx | 4 +
pages/sdk/splits-v1.mdx | 4 +
pages/sdk/splits-v2.mdx | 4 +
pages/sdk/swapper.mdx | 4 +
pages/sdk/templates.mdx | 4 +
pages/sdk/utils.mdx | 4 +
pages/sdk/vesting.mdx | 4 +
pages/sdk/warehouse.mdx | 4 +
pages/sdk/waterfall.mdx | 4 +
pages/splits-kit.mdx | 4 +
pages/templates.mdx | 4 +
pages/templates/diversifier.mdx | 4 +
pages/templates/liquid.mdx | 4 +
pages/templates/recoup.mdx | 4 +
theme.config.tsx | 128 ++++++++++++++------------------
33 files changed, 202 insertions(+), 81 deletions(-)
create mode 100644 pages/_document.tsx
diff --git a/next-sitemap.config.js b/next-sitemap.config.js
index b9a92e3..c98c1bb 100644
--- a/next-sitemap.config.js
+++ b/next-sitemap.config.js
@@ -4,10 +4,15 @@ module.exports = {
// siteUrl to each route path (route paths do NOT include basePath), so the
// '/protocol/docs' segment lives on siteUrl here.
siteUrl:
- process.env.NEXT_PUBLIC_VERCEL_ENV === 'production' ?
- 'https://splits.org/protocol/docs' :
- `https://${process.env.NEXT_PUBLIC_VERCEL_URL}/protocol/docs`,
- generateRobotsTxt: true,
+ process.env.NEXT_PUBLIC_VERCEL_ENV === 'production'
+ ? 'https://splits.org/protocol/docs'
+ : `https://${process.env.NEXT_PUBLIC_VERCEL_URL}/protocol/docs`,
+ // Crawlers only read robots.txt at the host root, so one under basePath is
+ // inert; splits.org's own sitemap index already lists this sitemap.
+ generateRobotsTxt: false,
+ // The default lastmod is the build timestamp, which Google ignores as not
+ // verifiably accurate. Omit it rather than lie.
+ autoLastmod: false,
generateIndexSitemap: false,
// splits.org enforces trailing slashes (slash-less URLs 308 to the slashed
// form), so list the final URLs directly.
diff --git a/next.config.js b/next.config.js
index 5882f47..3372f04 100644
--- a/next.config.js
+++ b/next.config.js
@@ -19,24 +19,26 @@ module.exports = withNextra({
source: '/(.*)',
headers: [
// Prevents the page from being loaded in an iframe (clickjacking prevention)
- { key: 'Content-Security-Policy', value: `frame-ancestors 'none';`}
+ { key: 'Content-Security-Policy', value: `frame-ancestors 'none';` },
],
},
]
},
async redirects() {
return [
+ // Trailing slash on the destination avoids a second hop through the
+ // splits.org 308.
{
source: '/sdk-info',
- destination: '/sdk',
- permanent: false,
+ destination: '/sdk/',
+ permanent: true,
},
// Just redirect any slug to the main page for now, not sure if they map
// the same
{
source: '/sdk-info/:slug*',
- destination: '/sdk',
- permanent: false,
+ destination: '/sdk/',
+ permanent: true,
},
]
},
diff --git a/pages/_document.tsx b/pages/_document.tsx
new file mode 100644
index 0000000..fa199f1
--- /dev/null
+++ b/pages/_document.tsx
@@ -0,0 +1,14 @@
+import React from 'react'
+import { Head, Html, Main, NextScript } from 'next/document'
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+ )
+}
diff --git a/pages/core.mdx b/pages/core.mdx
index 3c4a35a..2417488 100644
--- a/pages/core.mdx
+++ b/pages/core.mdx
@@ -1,3 +1,7 @@
+---
+description: "Architecture of the Splits core contracts and how funds flow between the Warehouse, Split, Waterfall, Swapper and Vesting building blocks."
+---
+
# Core contracts
This section describes the various smart contract building blocks upon which all
diff --git a/pages/core/oracle.mdx b/pages/core/oracle.mdx
index 7e4167d..e6317c2 100644
--- a/pages/core/oracle.mdx
+++ b/pages/core/oracle.mdx
@@ -1,3 +1,7 @@
+---
+description: "The price oracle contracts used by Swapper to value token conversions, including the Uniswap v3 TWAP oracle."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/pass-through.mdx b/pages/core/pass-through.mdx
index 580e6b9..c9c9ca6 100644
--- a/pages/core/pass-through.mdx
+++ b/pages/core/pass-through.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Pass-Through Wallet contract forwards funds through an intermediary address whose owner can pause or retarget it."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/split-v2.mdx b/pages/core/split-v2.mdx
index 9b3c267..f399059 100644
--- a/pages/core/split-v2.mdx
+++ b/pages/core/split-v2.mdx
@@ -1,3 +1,7 @@
+---
+description: "SplitV2, the latest Splits contract: push and pull variants, deterministic deployment and how distributions and withdrawals work."
+---
+
import { Toggle } from '../../components/toggle'
import { Callout, Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/split.mdx b/pages/core/split.mdx
index a409542..11f024e 100644
--- a/pages/core/split.mdx
+++ b/pages/core/split.mdx
@@ -1,3 +1,7 @@
+---
+description: "The original Split contract deployed through SplitMain: how V1 splits receive, distribute and withdraw funds."
+---
+
import { Toggle } from '../../components/toggle'
import { Callout, Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/swapper.mdx b/pages/core/swapper.mdx
index 328a6e3..9b73cc7 100644
--- a/pages/core/swapper.mdx
+++ b/pages/core/swapper.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Swapper contract converts incoming tokens to a target token on distribution using oracle-based pricing."
+---
+
import { Toggle } from '../../components/toggle'
import { Callout, Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/vesting.mdx b/pages/core/vesting.mdx
index 0eeeb68..ddae3b0 100644
--- a/pages/core/vesting.mdx
+++ b/pages/core/vesting.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Vesting contract releases funds to recipients linearly over a shared vesting period."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/warehouse.mdx b/pages/core/warehouse.mdx
index fd18c04..ba84b67 100644
--- a/pages/core/warehouse.mdx
+++ b/pages/core/warehouse.mdx
@@ -1,3 +1,7 @@
+---
+description: "SplitWarehouse, the central balance storage contract that holds tokens for Splits protocol recipients until withdrawal."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/core/waterfall.mdx b/pages/core/waterfall.mdx
index 7c72c7a..bad0aed 100644
--- a/pages/core/waterfall.mdx
+++ b/pages/core/waterfall.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Waterfall contract pays recipients in sequential tranches, filling each threshold before funds flow to the next."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/flow.mdx b/pages/flow.mdx
index 8cb52e1..f1d0173 100644
--- a/pages/flow.mdx
+++ b/pages/flow.mdx
@@ -1,3 +1,7 @@
+---
+description: "How funds move through the Splits protocol: receiving payments, distributing balances to recipients and withdrawing from the warehouse."
+---
+
import { Toggle } from '../components/toggle'
# Flow of funds
diff --git a/pages/index.mdx b/pages/index.mdx
index e0b7e38..63af1fa 100644
--- a/pages/index.mdx
+++ b/pages/index.mdx
@@ -1,3 +1,7 @@
+---
+description: "Documentation for the Splits protocol: open-source, audited Split, Waterfall and Swapper smart contracts for managing onchain revenue, with a TypeScript SDK and React hooks."
+---
+
# Docs
diff --git a/pages/react.mdx b/pages/react.mdx
index ce97745..1a9db04 100644
--- a/pages/react.mdx
+++ b/pages/react.mdx
@@ -1,3 +1,7 @@
+---
+description: "React hooks for the Splits protocol from @0xsplits/splits-sdk-react: read and write splits, waterfalls, swappers and vesting from React apps."
+---
+
import { Tab, Tabs } from 'nextra-theme-docs'
# React SDK
diff --git a/pages/sdk.mdx b/pages/sdk.mdx
index bed92f3..1b0a8d4 100644
--- a/pages/sdk.mdx
+++ b/pages/sdk.mdx
@@ -1,3 +1,7 @@
+---
+description: "Install and configure @0xsplits/splits-sdk, the TypeScript SDK for creating and managing splits, waterfalls, swappers and vesting contracts."
+---
+
import { Callout, Tab, Tabs } from 'nextra-theme-docs'
# Splits Development Kit
diff --git a/pages/sdk/data.mdx b/pages/sdk/data.mdx
index cada776..5d725d3 100644
--- a/pages/sdk/data.mdx
+++ b/pages/sdk/data.mdx
@@ -1,3 +1,7 @@
+---
+description: "Query split metadata, balances and activity through the Splits GraphQL API with the DataClient in the Splits TypeScript SDK."
+---
+
# Splits Data Client
The Splits Data client offers a comprehensive suite of functionalities for
diff --git a/pages/sdk/liquid.mdx b/pages/sdk/liquid.mdx
index b7be2c9..19d8657 100644
--- a/pages/sdk/liquid.mdx
+++ b/pages/sdk/liquid.mdx
@@ -1,3 +1,7 @@
+---
+description: "Create and manage NFT-governed liquid splits with the LiquidSplitClient in the Splits TypeScript SDK."
+---
+
# Liquid Splits
Begin by importing `LiquidSplitClient` into your app. If you are using the
diff --git a/pages/sdk/multicall.mdx b/pages/sdk/multicall.mdx
index 496ae2b..6ae7aa2 100644
--- a/pages/sdk/multicall.mdx
+++ b/pages/sdk/multicall.mdx
@@ -1,3 +1,7 @@
+---
+description: "Batch multiple Splits SDK calls into a single multicall transaction."
+---
+
# Multicall
Batch transactions together into a single multicall transaction. This multicall function can be accessed
diff --git a/pages/sdk/splits-v1.mdx b/pages/sdk/splits-v1.mdx
index b08e877..94bd374 100644
--- a/pages/sdk/splits-v1.mdx
+++ b/pages/sdk/splits-v1.mdx
@@ -1,3 +1,7 @@
+---
+description: "Manage legacy V1 splits with the SplitsClient in the Splits TypeScript SDK."
+---
+
# Splits V1
Begin by importing `SplitsClient` into your app.
diff --git a/pages/sdk/splits-v2.mdx b/pages/sdk/splits-v2.mdx
index f484fd2..f2819b8 100644
--- a/pages/sdk/splits-v2.mdx
+++ b/pages/sdk/splits-v2.mdx
@@ -1,3 +1,7 @@
+---
+description: "Create, update, distribute and withdraw from SplitV2 contracts with the SplitV2Client in the Splits TypeScript SDK."
+---
+
# Splits V2
Begin by importing `SplitV2Client` into your app.
diff --git a/pages/sdk/swapper.mdx b/pages/sdk/swapper.mdx
index 7a00003..1e618b6 100644
--- a/pages/sdk/swapper.mdx
+++ b/pages/sdk/swapper.mdx
@@ -1,3 +1,7 @@
+---
+description: "Create and manage swappers that convert incoming tokens on distribution with the SwapperClient in the Splits TypeScript SDK."
+---
+
# Swapper
Begin by importing `SwapperClient` into your app. If you are using the
diff --git a/pages/sdk/templates.mdx b/pages/sdk/templates.mdx
index 85862df..16b4059 100644
--- a/pages/sdk/templates.mdx
+++ b/pages/sdk/templates.mdx
@@ -1,3 +1,7 @@
+---
+description: "Deploy recoup, diversifier and other composed payment flows with the TemplatesClient in the Splits TypeScript SDK."
+---
+
# Templates
Begin by importing `TemplatesClient` into your app. If you are using the
diff --git a/pages/sdk/utils.mdx b/pages/sdk/utils.mdx
index 903372e..32a8d55 100644
--- a/pages/sdk/utils.mdx
+++ b/pages/sdk/utils.mdx
@@ -1,3 +1,7 @@
+---
+description: "Helper functions and constants exposed by the Splits TypeScript SDK for formatting, validation and calculations."
+---
+
# Utilities
The SDK exposes some of the utility functions and constants to make development with it easier.
diff --git a/pages/sdk/vesting.mdx b/pages/sdk/vesting.mdx
index 95c25f4..5dbc164 100644
--- a/pages/sdk/vesting.mdx
+++ b/pages/sdk/vesting.mdx
@@ -1,3 +1,7 @@
+---
+description: "Create and manage time-locked vesting streams with the VestingClient in the Splits TypeScript SDK."
+---
+
# Vesting
Begin by importing `VestingClient` into your app. If you are using the
diff --git a/pages/sdk/warehouse.mdx b/pages/sdk/warehouse.mdx
index 6187b22..6647514 100644
--- a/pages/sdk/warehouse.mdx
+++ b/pages/sdk/warehouse.mdx
@@ -1,3 +1,7 @@
+---
+description: "Read and withdraw balances held in the SplitWarehouse contract with the WarehouseClient in the Splits TypeScript SDK."
+---
+
# Warehouse
Begin by importing `WarehouseClient` into your app.
diff --git a/pages/sdk/waterfall.mdx b/pages/sdk/waterfall.mdx
index 49adbfd..043d068 100644
--- a/pages/sdk/waterfall.mdx
+++ b/pages/sdk/waterfall.mdx
@@ -1,3 +1,7 @@
+---
+description: "Create and manage waterfall payment flows with the WaterfallClient in the Splits TypeScript SDK."
+---
+
# Waterfall
Begin by importing `WaterfallClient` into your app. If you are using the
diff --git a/pages/splits-kit.mdx b/pages/splits-kit.mdx
index 3fccadb..9143a57 100644
--- a/pages/splits-kit.mdx
+++ b/pages/splits-kit.mdx
@@ -1,3 +1,7 @@
+---
+description: "SplitsKit, the pre-built React component library for displaying and creating splits, with Storybook examples."
+---
+
import { Tab, Tabs, Callout } from 'nextra-theme-docs'
# SplitsKit
diff --git a/pages/templates.mdx b/pages/templates.mdx
index aab88be..580c8ea 100644
--- a/pages/templates.mdx
+++ b/pages/templates.mdx
@@ -1,3 +1,7 @@
+---
+description: "Composed payment flows such as Recoup, Liquid Split and Diversifier, built by combining Splits core contracts."
+---
+
# Templates
This section describes more complicated payment flows that are built by composing multiple building blocks.
diff --git a/pages/templates/diversifier.mdx b/pages/templates/diversifier.mdx
index 055e839..ca9e885 100644
--- a/pages/templates/diversifier.mdx
+++ b/pages/templates/diversifier.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Diversifier template automatically swaps and splits incoming tokens across a diversified set of assets."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/pages/templates/liquid.mdx b/pages/templates/liquid.mdx
index bf10bb9..669f553 100644
--- a/pages/templates/liquid.mdx
+++ b/pages/templates/liquid.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Liquid Split template is a mutable split whose recipients are governed by NFT ownership."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
import { Callout } from 'nextra-theme-docs'
diff --git a/pages/templates/recoup.mdx b/pages/templates/recoup.mdx
index fe5667f..438fc71 100644
--- a/pages/templates/recoup.mdx
+++ b/pages/templates/recoup.mdx
@@ -1,3 +1,7 @@
+---
+description: "The Recoup template repays an initial investment through a waterfall before splitting remaining funds among recipients."
+---
+
import { Toggle } from '../../components/toggle'
import { Tab, Tabs } from 'nextra-theme-docs'
diff --git a/theme.config.tsx b/theme.config.tsx
index 89dfb13..d9b63f7 100644
--- a/theme.config.tsx
+++ b/theme.config.tsx
@@ -3,7 +3,6 @@ import type { DocsThemeConfig } from 'nextra-theme-docs'
import { useConfig } from 'nextra-theme-docs'
import { useRouter } from 'next/router'
import Image from 'next/image'
-import { CLIENT_ORIGIN } from './util/requests'
const logo = (
<>
@@ -20,13 +19,30 @@ const logo = (
>
)
+// Nextra's default icon carries an SVG , which site auditors count as a
+// second document title.
+const githubIcon = (
+
+)
+
const config: DocsThemeConfig = {
project: {
link: 'https://github.com/0xSplits',
+ icon: githubIcon,
},
docsRepositoryBase: 'https://github.com/0xSplits/docs',
useNextSeoProps() {
const { asPath } = useRouter()
+ const { title } = useConfig()
// The docs are reverse-proxied to splits.org/protocol/docs but the origin
// deployment is also directly reachable, so declare the splits.org URL as
// canonical. splits.org serves the trailing-slash form (308 otherwise), so
@@ -36,80 +52,48 @@ const config: DocsThemeConfig = {
const canonical = `https://splits.org/protocol/docs${
path === '/' ? '' : path
}/`
- if (asPath !== '/') {
- return {
- titleTemplate: '%s | Protocol',
- canonical,
- }
- }
- return { canonical }
- },
- logo,
- head: function useHead() {
- const { title } = useConfig()
- // basePath ('/protocol/docs') moves the OG route handler under that prefix,
- // and OG scrapers need an absolute URL, so include it explicitly.
- const ogImage = `${CLIENT_ORIGIN}/protocol/docs/api/og?title=${encodeURIComponent(
+ // The OG route lives under basePath and scrapers need an absolute URL on
+ // the public host, not the per-deploy Vercel hostname (which is noindexed).
+ const ogImage = `https://splits.org/protocol/docs/api/og/?title=${encodeURIComponent(
title,
)}`
-
- return (
- <>
- {/* Basic metadata */}
-
-
-
-
-
- {/* Page description */}
-
-
- {/* Twitter */}
-
-
-
-
-
-
-
- {/* Title */}
-
-
- {/* Open Graph */}
-
-
-
-
-
-
- {/* Raw tags are not basePath-prefixed automatically, so the
- '/protocol/docs' prefix is included explicitly. */}
-
- >
- )
+ const shared = {
+ canonical,
+ openGraph: {
+ url: canonical,
+ siteName: 'Splits',
+ images: [{ url: ogImage, width: 1200, height: 630, alt: title }],
+ },
+ twitter: { site: '@0xsplits', cardType: 'summary_large_image' },
+ }
+ if (path !== '/') {
+ return { ...shared, titleTemplate: '%s | Protocol' }
+ }
+ // The index H1 is "Docs"; keep it short on the page and in the OG image
+ // but give search results a descriptive title. next-seo remembers the last
+ // titleTemplate it saw across prerenders, so reset it explicitly.
+ return {
+ ...shared,
+ title: 'Splits Protocol docs: Split, Waterfall and Swapper contracts',
+ titleTemplate: '%s',
+ }
},
+ logo,
+ head: (
+ <>
+
+
+
+
+ {/* Raw tags are not basePath-prefixed automatically, so the
+ '/protocol/docs' prefix is included explicitly. */}
+
+ >
+ ),
primaryHue: 215,
editLink: {
text: 'Edit this page on GitHub',
From b6f4aaf289b2e404496a04ac46866768becded90 Mon Sep 17 00:00:00 2001
From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com>
Date: Mon, 14 Sep 2026 15:37:33 -0700
Subject: [PATCH 2/4] fix(seo): shorten index description to fit search
snippets
Review nit: the description was 173 characters and Google truncates
around 160.
---
pages/index.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pages/index.mdx b/pages/index.mdx
index 63af1fa..4e099de 100644
--- a/pages/index.mdx
+++ b/pages/index.mdx
@@ -1,5 +1,5 @@
---
-description: "Documentation for the Splits protocol: open-source, audited Split, Waterfall and Swapper smart contracts for managing onchain revenue, with a TypeScript SDK and React hooks."
+description: "Documentation for the Splits protocol: open-source, audited Split, Waterfall and Swapper contracts for onchain revenue, plus a TypeScript SDK and React hooks."
---
# Docs
From 28e412ae8647dc9ffdc738fcf447b896b9f8c302 Mon Sep 17 00:00:00 2001
From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com>
Date: Mon, 14 Sep 2026 15:37:33 -0700
Subject: [PATCH 3/4] docs(sdk): say V2 splits instead of SplitV2 contracts in
description
Review nit: plain wording matches the V1 page's "legacy V1 splits".
---
pages/sdk/splits-v2.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pages/sdk/splits-v2.mdx b/pages/sdk/splits-v2.mdx
index f2819b8..6207fe0 100644
--- a/pages/sdk/splits-v2.mdx
+++ b/pages/sdk/splits-v2.mdx
@@ -1,5 +1,5 @@
---
-description: "Create, update, distribute and withdraw from SplitV2 contracts with the SplitV2Client in the Splits TypeScript SDK."
+description: "Create, update, distribute and withdraw from V2 splits with the SplitV2Client in the Splits TypeScript SDK."
---
# Splits V2
From 39c01551aa7fd38203d21e76af9175dff557ab05 Mon Sep 17 00:00:00 2001
From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com>
Date: Mon, 14 Sep 2026 15:37:33 -0700
Subject: [PATCH 4/4] fix(seo): set og:type on every page
Review nit: next-seo only emits og:type when given one, so scrapers
saw no type.
---
theme.config.tsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/theme.config.tsx b/theme.config.tsx
index d9b63f7..adb1de4 100644
--- a/theme.config.tsx
+++ b/theme.config.tsx
@@ -61,6 +61,7 @@ const config: DocsThemeConfig = {
canonical,
openGraph: {
url: canonical,
+ type: 'website',
siteName: 'Splits',
images: [{ url: ogImage, width: 1200, height: 630, alt: title }],
},