diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 00000000..fb03efdc
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,28 @@
+User-agent: *
+Allow: /
+
+User-agent: GPTBot
+Allow: /
+
+User-agent: OAI-SearchBot
+Allow: /
+
+User-agent: ChatGPT-User
+Allow: /
+
+User-agent: PerplexityBot
+Allow: /
+
+User-agent: ClaudeBot
+Allow: /
+
+User-agent: Claude-User
+Allow: /
+
+User-agent: Google-Extended
+Allow: /
+
+User-agent: Applebot
+Allow: /
+
+Sitemap: https://docs.tempo.xyz/sitemap.xml
diff --git a/src/components/DocsJsonLd.tsx b/src/components/DocsJsonLd.tsx
new file mode 100644
index 00000000..e05a701b
--- /dev/null
+++ b/src/components/DocsJsonLd.tsx
@@ -0,0 +1,68 @@
+const tempoSameAs = [
+ 'https://x.com/tempo',
+ 'https://twitter.com/tempo',
+ 'https://github.com/tempoxyz',
+ 'https://www.linkedin.com/company/tempoxyz',
+ 'https://www.crunchbase.com/organization/tempo-87e4',
+]
+
+const tempoKnowsAbout = [
+ 'stablecoin payments',
+ 'cross-border payments',
+ 'global payouts',
+ 'agentic payments',
+ 'machine payments',
+ 'enterprise settlement',
+ 'payment blockchains',
+ 'Layer 1 blockchain',
+ 'stablecoin infrastructure',
+]
+
+const description =
+ 'Tempo is a payments-first Layer 1 blockchain incubated by Stripe and Paradigm. Tempo documentation covers stablecoin payments, global payouts, agentic payments, APIs, wallets, and protocol specifications.'
+
+export default function DocsJsonLd(props: { path?: string }) {
+ const path = props.path || '/docs'
+ const pathname = path.startsWith('/') ? path : `/${path}`
+ const url = `https://docs.tempo.xyz${pathname}`
+ const schema = {
+ '@context': 'https://schema.org',
+ '@graph': [
+ {
+ '@type': 'Organization',
+ '@id': 'https://tempo.xyz/#organization',
+ name: 'Tempo',
+ url: 'https://tempo.xyz',
+ description,
+ sameAs: tempoSameAs,
+ knowsAbout: tempoKnowsAbout,
+ },
+ {
+ '@type': 'WebSite',
+ '@id': 'https://docs.tempo.xyz/#website',
+ name: 'Tempo Docs',
+ url: 'https://docs.tempo.xyz',
+ description,
+ publisher: { '@id': 'https://tempo.xyz/#organization' },
+ },
+ {
+ '@type': 'TechArticle',
+ '@id': url,
+ url,
+ headline: 'Tempo documentation',
+ description,
+ isPartOf: { '@id': 'https://docs.tempo.xyz/#website' },
+ about: { '@id': 'https://tempo.xyz/#organization' },
+ publisher: { '@id': 'https://tempo.xyz/#organization' },
+ },
+ ],
+ }
+
+ return (
+
+ )
+}
diff --git a/src/pages/docs/_layout.tsx b/src/pages/docs/_layout.tsx
index c6cac89f..62f6940f 100644
--- a/src/pages/docs/_layout.tsx
+++ b/src/pages/docs/_layout.tsx
@@ -2,6 +2,7 @@
import { lazy, type PropsWithChildren, Suspense } from 'react'
import DocsHeader from '../../components/DocsHeader'
+import DocsJsonLd from '../../components/DocsJsonLd'
import DocsSectionNav from '../../components/DocsSectionNav'
import DocsSidebarDrawer from '../../components/DocsSidebarDrawer'
import { usePageSettled } from '../../lib/pageSettled'
@@ -28,7 +29,7 @@ if (typeof window !== 'undefined') {
export default function DocsLayout(
props: PropsWithChildren<{
- path: string
+ path?: string
frontmatter?: { interactive?: boolean; mipd?: boolean }
}>,
) {
@@ -37,6 +38,7 @@ export default function DocsLayout(
return (
<>
+