diff --git a/.gitignore b/.gitignore
index 6633b28a..0499f8e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@ public/sitemap.xml
 # Scraped documentation for LLM training
 scraped-docs/
 /public/_scraped-docs
+public/_seo-audit.json
diff --git a/app/[[...mdxPath]]/page.jsx b/app/[[...mdxPath]]/page.jsx
index 5d15a51c..5fb2d3ab 100644
--- a/app/[[...mdxPath]]/page.jsx
+++ b/app/[[...mdxPath]]/page.jsx
@@ -6,7 +6,36 @@ export const generateStaticParams = generateStaticParamsFor('mdxPath');
 export async function generateMetadata(props) {
 	const params = await props.params;
 	const { metadata } = await importPage(params.mdxPath);
-	return metadata;
+
+	const siteUrl = 'https://docs.sei.io';
+	const path = Array.isArray(params?.mdxPath) && params.mdxPath.length > 0 ? `/${params.mdxPath.join('/')}` : '/';
+	const frontmatterCanonical = metadata?.canonical;
+	const canonicalUrl = frontmatterCanonical
+		? frontmatterCanonical.startsWith('http')
+			? frontmatterCanonical
+			: `${siteUrl}${frontmatterCanonical}`
+		: `${siteUrl}${path}`;
+
+	const noindex = Boolean(metadata?.noindex);
+
+	return {
+		...metadata,
+		alternates: {
+			...(metadata?.alternates ?? {}),
+			canonical: canonicalUrl
+		},
+		openGraph: {
+			...(metadata?.openGraph ?? {}),
+			url: canonicalUrl
+		},
+		robots: noindex
+			? {
+					index: false,
+					follow: false,
+					googleBot: { index: false, follow: false }
+				}
+			: metadata?.robots
+	};
 }
 
 const Wrapper = getMDXComponents().wrapper;
@@ -15,8 +44,88 @@ export default async function Page(props) {
 	const params = await props.params;
 	const result = await importPage(params.mdxPath);
 	const { default: MDXContent, toc, metadata } = result;
+
+	const siteUrl = 'https://docs.sei.io';
+	const path = Array.isArray(params?.mdxPath) && params.mdxPath.length > 0 ? `/${params.mdxPath.join('/')}` : '/';
+	const canonicalUrl = metadata?.canonical ? (metadata.canonical.startsWith('http') ? metadata.canonical : `${siteUrl}${metadata.canonical}`) : `${siteUrl}${path}`;
+
+	const toTitleCase = (segment) =>
+		segment
+			.split('-')
+			.map((s) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : s))
+			.join(' ');
+
+	const segments = Array.isArray(params?.mdxPath) ? params.mdxPath : [];
+
+	const breadcrumbItems = [
+		{
+			'@type': 'ListItem',
+			position: 1,
+			name: 'Home',
+			item: siteUrl + '/'
+		},
+		...segments.map((seg, idx) => {
+			const href = `${siteUrl}/${segments.slice(0, idx + 1).join('/')}`;
+			const isLast = idx === segments.length - 1;
+			return {
+				'@type': 'ListItem',
+				position: idx + 2,
+				name: isLast && metadata?.title ? metadata.title : toTitleCase(seg),
+				item: href
+			};
+		})
+	];
+
+	const toISO8601WithTZ = (value) => {
+		if (!value) return undefined;
+		const date = new Date(value);
+		if (Number.isNaN(date.getTime())) {
+			if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value)) {
+				return `${value}T00:00:00Z`;
+			}
+			return undefined;
+		}
+		return date.toISOString();
+	};
+
+	const authorJson = metadata?.author
+		? typeof metadata.author === 'string'
+			? { '@type': 'Person', name: metadata.author }
+			: metadata.author
+		: { '@type': 'Organization', name: 'Sei Network', url: 'https://sei.io' };
+
+	const techArticleJsonLd = {
+		'@context': 'https://schema.org',
+		'@type': 'TechArticle',
+		headline: metadata?.title ?? 'Sei Documentation',
+		description: metadata?.description ?? 'Documentation for Sei Network',
+		url: canonicalUrl,
+		inLanguage: 'en',
+		mainEntityOfPage: { '@type': 'WebPage', '@id': canonicalUrl },
+		author: authorJson,
+		datePublished: toISO8601WithTZ(metadata?.date),
+		dateModified: toISO8601WithTZ(metadata?.updated ?? metadata?.date),
+		image: metadata?.image ? (metadata.image.startsWith('http') ? metadata.image : `${siteUrl}${metadata.image}`) : `${siteUrl}/assets/docs-banner.png`,
+		publisher: {
+			'@type': 'Organization',
+			name: 'Sei Network',
+			logo: {
+				'@type': 'ImageObject',
+				url: `${siteUrl}/icon.png`
+			}
+		}
+	};
+
+	const breadcrumbJsonLd = {
+		'@context': 'https://schema.org',
+		'@type': 'BreadcrumbList',
+		itemListElement: breadcrumbItems
+	};
+
 	return (
 		
+			
+			
 			
 		
 	);
diff --git a/app/layout.tsx b/app/layout.tsx
index ab00c5b4..6aa808ac 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -27,7 +27,7 @@ export const metadata: Metadata = {
 		locale: 'en_US',
 		images: [
 			{
-				url: 'https://www.docs.sei.io/assets/docs-banner.png',
+				url: 'https://docs.sei.io/assets/docs-banner.png',
 				alt: 'Sei Docs'
 			}
 		],
@@ -37,7 +37,7 @@ export const metadata: Metadata = {
 		// Make sure not to specify `title` or description` as they are automatically generated from the main description and title template
 		card: 'summary_large_image',
 		creator: '@SeiNetwork',
-		images: ['https://www.docs.sei.io/assets/docs-banner.png']
+		images: ['https://docs.sei.io/assets/docs-banner.png']
 	},
 	referrer: 'origin-when-cross-origin',
 	keywords: ['Sei', 'Sei Network', 'Sei Blockchain', 'Sei Docs', 'Sei Documentation', 'EVM', 'ERC20', 'ERC721'],
@@ -72,8 +72,36 @@ export default async function RootLayout({ children }) {
 		
 			
 				
-				
 				{/* Performance: avoid early preconnects to heavy third-parties */}
+				
+				
 			
 			
 				
diff --git a/content/cosmos-sdk/index.mdx b/content/cosmos-sdk/index.mdx
index cceda4e4..e2eca721 100644
--- a/content/cosmos-sdk/index.mdx
+++ b/content/cosmos-sdk/index.mdx
@@ -1,3 +1,13 @@
+---
+title: 'Cosmos SDK (Deprecated)'
+description: 'Cosmos SDK and CosmWasm functionality on Sei is deprecated in favor of EVM-only per SIP-3.'
+noindex: true
+canonical: /evm
+date: 2024-01-01
+updated: 2025-10-06
+image: /assets/docs-banner.png
+---
+
 import { IconArrowsExchange, IconBrain, IconCoins, IconCode, IconLayoutDashboard, IconTools } from '@tabler/icons-react';
 import { LinkCard } from '../../src/components/LinkCard';
 import { Callout } from 'nextra/components';
diff --git a/content/evm/index.mdx b/content/evm/index.mdx
index 3fefbf56..be2c3ddf 100644
--- a/content/evm/index.mdx
+++ b/content/evm/index.mdx
@@ -7,6 +7,9 @@ keywords:
   - web3 development
   - blockchain development
   - fast evm
+image: /assets/docs-banner.png
+date: 2024-01-01
+updated: 2025-10-06
 ---
 
 import { IconArrowsExchange, IconBrain, IconWand, IconCode, IconLayoutDashboard, IconTools, IconSettingsAutomation, IconPackage, IconDashboard, IconRocket, IconServer, IconChevronRight, IconBolt, IconArrowRight, IconTerminal2, IconNetwork, IconExternalLink, IconChartBar, IconBrandGithub, IconGitBranch, IconDeviceDesktop, IconClock, IconBuildingBridge, IconCloud, IconInfoCircle } from '@tabler/icons-react';
diff --git a/content/index.mdx b/content/index.mdx
index 9c322fe7..626930b9 100644
--- a/content/index.mdx
+++ b/content/index.mdx
@@ -1,5 +1,9 @@
 ---
 title: 'Home'
+description: 'Sei documentation: guides, references, and tutorials for building on the Sei EVM and ecosystem.'
+image: /assets/docs-banner.png
+date: 2024-01-01
+updated: 2025-10-06
 ---
 
 import { IconBolt, IconCode, IconClipboardText, IconLock, IconWallet, IconBook, IconTerminal2, IconServer, IconDeviceDesktop, IconExternalLink, IconChevronRight, IconRocket, IconCoins, IconRobot, IconCreditCard, IconCpu, IconDatabase, IconClock } from '@tabler/icons-react';
diff --git a/content/learn/index.mdx b/content/learn/index.mdx
index f69203a8..3b506abe 100644
--- a/content/learn/index.mdx
+++ b/content/learn/index.mdx
@@ -2,6 +2,9 @@
 title: 'Learn About Sei'
 description: "Discover Sei Network's architecture, performance features, and ecosystem, with detailed resources on consensus, tokenomics, governance, and development frameworks."
 keywords: ['sei blockchain', 'performance blockchain', 'evm compatibility', 'blockchain architecture', 'consensus mechanism', 'developer resources']
+image: /assets/docs-banner.png
+date: 2024-01-01
+updated: 2025-10-06
 ---
 
 import { IconHexagons, IconArrowsShuffle, IconBolt, IconWallet, IconRocket, IconArrowRight, IconCoins, IconGasStation, IconUsersGroup, IconKey, IconGavel, IconClock, IconNetwork, IconWorldWww, IconServer, IconCpu, IconDatabase, IconChartLine, IconDeviceMobile, IconUsers } from '@tabler/icons-react';
diff --git a/package.json b/package.json
index 48085725..b6dec90d 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
 		"check-links": "node scripts/check-links.mjs",
 		"scrape-docs": "node scripts/scrape-docs-html.js",
 		"upload-to-trieve": "node scripts/upload-to-trieve.js",
+		"seo:audit": "node scripts/audit-content-seo.mjs",
 		"test": "jest",
 		"test:watch": "jest --watch",
 		"prepare": "husky"
diff --git a/scripts/audit-content-seo.mjs b/scripts/audit-content-seo.mjs
new file mode 100644
index 00000000..371c17fd
--- /dev/null
+++ b/scripts/audit-content-seo.mjs
@@ -0,0 +1,160 @@
+import fs from 'fs/promises';
+import path from 'path';
+
+const CONTENT_DIR = path.resolve('./content');
+const OUTPUT_JSON = path.resolve('./public/_seo-audit.json');
+
+async function findMdxFiles(dir) {
+	const dirents = await fs.readdir(dir, { withFileTypes: true });
+	const files = [];
+	for (const d of dirents) {
+		const full = path.join(dir, d.name);
+		if (d.isDirectory()) {
+			files.push(...(await findMdxFiles(full)));
+		} else if (d.isFile() && d.name.endsWith('.mdx')) {
+			files.push(full);
+		}
+	}
+	return files;
+}
+
+function extractFrontmatter(content) {
+	const match = content.match(/^---\n([\s\S]*?)\n---/);
+	if (!match) return null;
+	const body = match[1];
+	const lines = body.split('\n');
+	const meta = {};
+	let currentKey = null;
+	let inArray = false;
+	let arrayValues = [];
+	for (const raw of lines) {
+		const line = raw.trim();
+		if (!line) continue;
+		const keyVal = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
+		if (keyVal && !inArray) {
+			if (currentKey && inArray) {
+				meta[currentKey] = arrayValues;
+				arrayValues = [];
+			}
+			currentKey = keyVal[1];
+			const val = keyVal[2];
+			if (val === '' || val === '|') {
+				meta[currentKey] = '';
+			} else if (val === 'true' || val === 'false') {
+				meta[currentKey] = val === 'true';
+			} else if (val.startsWith('[') && val.endsWith(']')) {
+				try {
+					meta[currentKey] = JSON.parse(val.replace(/'/g, '"'));
+				} catch {
+					meta[currentKey] = val;
+				}
+			} else if (val === '-') {
+				inArray = true;
+				arrayValues = [];
+			} else {
+				meta[currentKey] = val.replace(/^['"]|['"]$/g, '');
+			}
+		} else if (inArray) {
+			if (line.startsWith('- ')) {
+				arrayValues.push(line.slice(2).replace(/^['"]|['"]$/g, ''));
+			} else {
+				inArray = false;
+				if (currentKey) meta[currentKey] = arrayValues;
+				arrayValues = [];
+			}
+		}
+	}
+	if (currentKey && inArray) meta[currentKey] = arrayValues;
+	return meta;
+}
+
+function stripFrontmatter(content) {
+	return content.replace(/^---[\s\S]*?---\n?/, '');
+}
+
+function countWords(text) {
+	const cleaned = text
+		.replace(/```[\s\S]*?```/g, ' ')
+		.replace(/<[^>]+>/g, ' ')
+		.replace(/\{\/[\s\S]*?\}/g, ' ')
+		.replace(/\s+/g, ' ') // collapse whitespace
+		.trim();
+	if (!cleaned) return 0;
+	return cleaned.split(' ').length;
+}
+
+function normalizeTitle(title) {
+	if (!title) return '';
+	return title
+		.toLowerCase()
+		.replace(/[^a-z0-9]+/g, '-')
+		.replace(/^-+|-+$/g, '');
+}
+
+async function main() {
+	const files = await findMdxFiles(CONTENT_DIR);
+	const results = [];
+	const titleIndex = new Map();
+
+	for (const file of files) {
+		const raw = await fs.readFile(file, 'utf8');
+		const fm = extractFrontmatter(raw) || {};
+		const body = stripFrontmatter(raw);
+		const words = countWords(body);
+		const titleKey = normalizeTitle(fm.title || '');
+
+		results.push({
+			file,
+			url:
+				'https://docs.sei.io' +
+				file
+					.replace(CONTENT_DIR, '')
+					.replace(/index\.mdx$/, '')
+					.replace(/\.mdx$/, ''),
+			hasFrontmatter: Boolean(extractFrontmatter(raw)),
+			title: fm.title || null,
+			description: fm.description || null,
+			date: fm.date || null,
+			updated: fm.updated || null,
+			canonical: fm.canonical || null,
+			noindex: fm.noindex === true,
+			words,
+			isThin: words < 200
+		});
+
+		if (titleKey) {
+			const arr = titleIndex.get(titleKey) || [];
+			arr.push(file);
+			titleIndex.set(titleKey, arr);
+		}
+	}
+
+	const duplicates = [];
+	for (const [key, group] of titleIndex.entries()) {
+		if (group.length > 1) {
+			duplicates.push({ titleSlug: key, files: group });
+		}
+	}
+
+	const report = {
+		generatedAt: new Date().toISOString(),
+		totals: {
+			mdxCount: files.length,
+			withFrontmatter: results.filter((r) => r.hasFrontmatter).length,
+			thinPages: results.filter((r) => r.isThin).length,
+			missingDescriptions: results.filter((r) => !r.description).length
+		},
+		duplicates,
+		pages: results
+	};
+
+	await fs.writeFile(OUTPUT_JSON, JSON.stringify(report, null, 2));
+	// eslint-disable-next-line no-console
+	console.log(`SEO audit written to ${OUTPUT_JSON}`);
+}
+
+main().catch((err) => {
+	// eslint-disable-next-line no-console
+	console.error(err);
+	process.exit(1);
+});