From 17877e5bfd832d0cfa4096969d1a88a37938d8a2 Mon Sep 17 00:00:00 2001 From: Brendan Ryan <1572504+brendanjryan@users.noreply.github.com> Date: Fri, 13 Nov 2026 10:42:15 -0800 Subject: [PATCH] docs: add canonical and title lints --- AGENTS.md | 9 + e2e/document-semantics.test.ts | 6 +- e2e/seo-head.test.ts | 6 +- package.json | 3 +- scripts/check-seo.ts | 129 +++++++++++ src/lib/docs-seo-metadata.test.ts | 19 +- src/lib/docs-structured-data.test.ts | 14 +- src/lib/docs-structured-data.ts | 10 +- src/lib/seo-metadata.test.ts | 205 ++++++++++++++++++ src/lib/seo-metadata.ts | 65 ++++++ src/lib/vercel-routing.test.ts | 95 ++++++++ src/lib/vocs-config-seo.test.ts | 24 +- src/pages/docs/accounts.mdx | 2 +- src/pages/docs/accounts/access-keys.mdx | 4 +- .../access-keys/admin-access-keys.mdx | 2 +- .../docs/accounts/account-configuration.mdx | 2 +- .../account-configuration/account-upgrade.mdx | 2 +- .../configuration-updates.mdx | 4 +- src/pages/docs/accounts/apps.mdx | 2 +- .../docs/accounts/apps/recover-an-account.mdx | 4 +- .../accounts/apps/self-custodial-wallets.mdx | 4 +- src/pages/docs/accounts/authentication.mdx | 2 +- .../docs/accounts/authentication/passkeys.mdx | 2 +- .../accounts/authentication/private-keys.mdx | 2 +- src/pages/docs/accounts/automations.mdx | 2 +- .../pay-from-an-embedded-wallet.mdx | 4 +- .../automations/pay-out-from-a-backend.mdx | 2 +- src/pages/docs/accounts/create.mdx | 4 +- .../accounts/custodians/omnibus-accounts.mdx | 4 +- .../accounts/custodians/team-multisig.mdx | 2 +- src/pages/docs/accounts/fees.mdx | 2 +- src/pages/docs/accounts/fees/fee-tokens.mdx | 2 +- src/pages/docs/accounts/how-it-works.mdx | 2 +- src/pages/docs/accounts/keys.mdx | 2 +- src/pages/docs/accounts/policies.mdx | 4 +- .../accounts/policies/signing-thresholds.mdx | 2 +- src/pages/docs/accounts/security.mdx | 2 +- src/pages/docs/accounts/wallets.mdx | 4 +- .../wallets/add-tempo-to-your-wallet.mdx | 2 +- src/pages/docs/agents.mdx | 2 +- src/pages/docs/api.mdx | 4 +- src/pages/docs/api/authentication.mdx | 1 + src/pages/docs/api/console.mdx | 2 +- .../api/console/projects-and-environments.mdx | 2 +- src/pages/docs/api/console/team.mdx | 2 +- src/pages/docs/api/errors.mdx | 2 +- src/pages/docs/api/faq.mdx | 1 + src/pages/docs/api/fee-payer.mdx | 1 + src/pages/docs/api/indexer-api.mdx | 1 + src/pages/docs/api/json-rpc.mdx | 1 + src/pages/docs/api/rate-limits.mdx | 2 +- src/pages/docs/api/reference.mdx | 2 +- src/pages/docs/api/transactions.mdx | 4 +- src/pages/docs/api/versioning-policy.mdx | 2 +- src/pages/docs/cli/api.mdx | 2 +- .../docs/development/account-keychain.mdx | 4 +- .../development/configurable-accounts.mdx | 4 +- .../docs/development/single-key-accounts.mdx | 2 +- src/pages/docs/guide/bridge-layerzero.mdx | 2 +- src/pages/docs/guide/issuance/index.mdx | 2 +- .../docs/guide/issuance/manage-stablecoin.mdx | 2 +- .../docs/guide/node/consensus-and-dkg.mdx | 2 +- src/pages/docs/guide/node/installation.mdx | 2 +- src/pages/docs/guide/node/upgrade-cadence.mdx | 2 +- src/pages/docs/guide/node/validator-setup.mdx | 2 +- .../guide/node/validator-troubleshooting.mdx | 2 +- src/pages/docs/guide/node/validator.mdx | 2 +- .../docs/guide/payments/send-a-payment.mdx | 2 +- .../payments/send-a-payment/examples.mdx | 2 +- .../docs/guide/payments/transfer-memos.mdx | 6 +- .../guide/private-zones/connect-to-a-zone.mdx | 2 +- .../guide/private-zones/deposit-to-a-zone.mdx | 2 +- .../private-zones/withdraw-from-a-zone.mdx | 2 +- .../docs/partners/explorers-and-debugging.mdx | 2 +- src/pages/docs/partners/stablecoins.mdx | 4 +- src/pages/docs/partners/wallets.mdx | 6 +- src/pages/docs/payments.mdx | 2 +- .../docs/protocol/blockspace/consensus.mdx | 2 +- .../protocol/exchange/executing-swaps.mdx | 2 +- src/pages/docs/protocol/exchange/index.mdx | 2 +- .../protocol/exchange/providing-liquidity.mdx | 2 +- .../docs/protocol/fees/fee-amm/index.mdx | 2 +- src/pages/docs/protocol/fees/index.mdx | 2 +- src/pages/docs/protocol/fees/spec-fee-amm.mdx | 2 +- src/pages/docs/protocol/index.mdx | 2 +- src/pages/docs/protocol/rpc/index.mdx | 2 +- src/pages/docs/protocol/tip20/overview.mdx | 2 +- src/pages/docs/protocol/tips/tip-1002.mdx | 3 +- src/pages/docs/protocol/tips/tip-1007.mdx | 2 +- src/pages/docs/protocol/tips/tip-1016.mdx | 2 +- src/pages/docs/protocol/tips/tip-1031.mdx | 2 +- src/pages/docs/protocol/tips/tip-1047.mdx | 1 + .../docs/protocol/transactions/eip-4337.mdx | 2 +- .../docs/protocol/transactions/eip-7702.mdx | 2 +- src/pages/docs/protocol/upgrades/t12.mdx | 2 +- src/pages/docs/protocol/upgrades/t13.mdx | 2 +- src/pages/docs/protocol/upgrades/t14.mdx | 2 +- src/pages/docs/protocol/upgrades/t2.mdx | 2 +- src/pages/docs/protocol/upgrades/t7.mdx | 2 +- src/pages/docs/protocol/zones/accounts.mdx | 2 +- src/pages/docs/protocol/zones/bridging.mdx | 2 +- src/pages/docs/protocol/zones/execution.mdx | 2 +- src/pages/docs/protocol/zones/index.mdx | 2 +- src/pages/docs/protocol/zones/proving.mdx | 2 +- src/pages/docs/protocol/zones/rpc.mdx | 2 +- .../docs/quickstart/connection-details.mdx | 2 +- .../docs/quickstart/evm-compatibility.mdx | 2 +- src/pages/docs/quickstart/integrate-tempo.mdx | 2 +- .../docs/quickstart/predeployed-contracts.mdx | 2 +- .../docs/quickstart/verify-contracts.mdx | 2 +- .../resources/guides/402-payment-required.mdx | 2 +- .../guides/add-tempo-to-metamask.mdx | 2 +- .../docs/resources/guides/batch-payments.mdx | 2 +- .../resources/guides/blockchain-payments.mdx | 2 +- .../resources/guides/compliance-controls.mdx | 2 +- .../guides/connect-tempo-wallet-to-an-app.mdx | 2 +- .../resources/guides/corporate-treasury.mdx | 2 +- .../cross-border-payments-latin-america.mdx | 2 +- .../guides/cross-border-payments.mdx | 4 +- .../resources/guides/embedded-wallets.mdx | 2 +- .../docs/resources/guides/fbo-accounts.mdx | 2 +- .../resources/guides/funding-and-payouts.mdx | 2 +- .../docs/resources/guides/genius-act.mdx | 2 +- .../guides/get-stablecoins-on-tempo.mdx | 2 +- .../docs/resources/guides/global-payouts.mdx | 2 +- .../how-to-accept-stablecoin-payments.mdx | 2 +- src/pages/docs/resources/guides/index.mdx | 2 +- .../resources/guides/microtransactions.mdx | 2 +- .../resources/guides/move-funds-off-tempo.mdx | 2 +- .../guides/nostro-vostro-accounts.mdx | 2 +- .../pay-network-fees-in-stablecoins.mdx | 2 +- .../docs/resources/guides/payment-links.mdx | 2 +- .../docs/resources/guides/payment-rails.mdx | 2 +- .../guides/payment-reconciliation.mdx | 2 +- .../resources/guides/payment-screening.mdx | 2 +- .../docs/resources/guides/prefunding.mdx | 2 +- src/pages/docs/resources/guides/refunds.mdx | 2 +- .../docs/resources/guides/remittances.mdx | 2 +- .../guides/set-an-agent-spending-limit.mdx | 2 +- .../docs/resources/guides/stablecoin-fees.mdx | 2 +- ...ayment-infrastructure-enterprise-scale.mdx | 2 +- .../stablecoin-payroll-for-global-teams.mdx | 2 +- .../guides/stablecoin-settlement.mdx | 4 +- .../guides/stablecoins-for-business.mdx | 2 +- .../guides/subscriptions-on-tempo.mdx | 2 +- src/pages/docs/sdk/index.mdx | 2 +- src/pages/docs/sdk/python/index.mdx | 2 +- src/pages/docs/sdk/typescript/index.mdx | 2 +- src/pages/docs/sdk/typescript/prool/setup.mdx | 2 +- src/pages/index.mdx | 2 +- vercel.json | 47 ++++ vocs.config.ts | 8 +- 152 files changed, 766 insertions(+), 185 deletions(-) create mode 100644 scripts/check-seo.ts create mode 100644 src/lib/seo-metadata.test.ts create mode 100644 src/lib/seo-metadata.ts diff --git a/AGENTS.md b/AGENTS.md index 7a1e3066f..12f25e898 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -341,6 +341,15 @@ Use one term for one concept. Adapted from the [Design System word list](https:/ - Do not restate the title in the description; add context or outcome. - Dynamic OG images are generated by `/api/og.tsx` using frontmatter and `vocs.config.ts`. +These rules are enforced. `src/lib/seo-metadata.test.ts` lints every page's frontmatter in `pnpm test`, and `scripts/check-seo.ts` checks the built HTML in `pnpm build`: + +- **Document title.** The rendered title (`seoTitle`, or `title` plus the template suffix) ends with ` | Tempo Docs` and is at most 60 characters. Resources explainers under `/docs/resources/guides/` may end with ` | Tempo`. +- **Unique titles.** No two pages render the same document title. +- **Title patterns.** Write `seoTitle` as ` on Tempo: `, `Tempo : `, ` on Tempo`, or ` API Reference`, then the suffix. Shorten the `seoTitle`, not the H1 or URL. +- **Description.** Every page has a single-line `description` of 50 to 160 characters. +- **Canonical URL.** Every built page has exactly one ``, equal to its sitemap URL: `https://tempo.xyz/developers` plus the path, with no trailing slash. `src/lib/docs-structured-data.ts` emits it. +- **Markdown twins.** `vercel.json` sends a `Link: <…>; rel="canonical"` header from each `.md` twin to its HTML page. `src/lib/vercel-routing.test.ts` covers the patterns. + ## Examples and Code - Examples must be tied to a real tool, workflow, API, command, or protocol detail. diff --git a/e2e/document-semantics.test.ts b/e2e/document-semantics.test.ts index 59462c610..f3d9e3b43 100644 --- a/e2e/document-semantics.test.ts +++ b/e2e/document-semantics.test.ts @@ -80,7 +80,7 @@ for (const route of sampleBySection(publicRoutes)) { test('keeps one route title through docs and OpenAPI client navigation', async ({ page }) => { await page.goto('/docs/quickstart/integrate-tempo', { waitUntil: 'networkidle' }) - await expectSingleTitle(page, 'Integrate Tempo with Apps, Wallets, and Services | Tempo Docs') + await expectSingleTitle(page, 'Integrate Tempo into Apps and Services | Tempo Docs') await page .getByRole('navigation', { name: 'Documentation sections', exact: true }) @@ -94,11 +94,11 @@ test('keeps one route title through docs and OpenAPI client navigation', async ( .getByRole('link', { name: 'API reference', exact: true }) .click() await page.waitForURL(/\/docs\/api\/?$/) - await expectSingleTitle(page, 'Tempo API: Sponsor Gas Fees and Route Stablecoins | Tempo Docs') + await expectSingleTitle(page, 'Tempo API: Sponsor Fees and Route Stablecoins | Tempo Docs') await page.locator('a[href="/docs/api/transactions"]:visible').first().click() await page.waitForURL(/\/docs\/api\/transactions\/?$/) - await expectSingleTitle(page, 'Tempo Transactions API Reference | Docs') + await expectSingleTitle(page, 'Tempo Transactions API Reference | Tempo Docs') await page.locator('a[href="/docs/api/transfers"]:visible').first().click() await page.waitForURL(/\/docs\/api\/transfers\/?$/) diff --git a/e2e/seo-head.test.ts b/e2e/seo-head.test.ts index 8d299add5..e1dab4d3a 100644 --- a/e2e/seo-head.test.ts +++ b/e2e/seo-head.test.ts @@ -43,7 +43,7 @@ const cases: { }[] = [ { path: '/', - title: 'Tempo Developer Docs: APIs, SDKs & Guides', + title: 'Developer Documentation: APIs, SDKs, and Guides | Tempo Docs', ogTitle: 'Documentation', descriptionIncludes: 'Build with Tempo Accounts, Earn, Routes, and Zones', ogImageIncludes: '/og/2026-q4/og_2026-q4_developers_developers_title-f5_v02.png', @@ -72,14 +72,14 @@ const cases: { }, { path: '/docs/api', - title: 'Tempo API: Sponsor Gas Fees and Route Stablecoins | Tempo Docs', + title: 'Tempo API: Sponsor Fees and Route Stablecoins | Tempo Docs', ogTitle: 'Tempo API', descriptionIncludes: 'gas with a hosted fee payer, and move stablecoins onto Tempo', ogImageIncludes: '/og/2026-q4/og_2026-q4_docs_api_linework-000_v02.png', }, { path: '/docs/api/console', - title: 'How to Use the Tempo Console | Docs', + title: 'How to Use the Tempo Console | Tempo Docs', ogTitle: 'Tempo Console', descriptionIncludes: 'create projects and API keys', ogImageIncludes: '/og/2026-q4/og_2026-q4_docs_api-console_title-f5_v02.png', diff --git a/package.json b/package.json index 2c63abaab..2af317e0e 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,9 @@ "scripts": { "dev": "node --env-file-if-exists=.env --import=tsx --import=./scripts/native-json-imports.mjs node_modules/vite/bin/vite.js", "build": "node scripts/guard-vocs-config.mjs && pnpm run check:types && pnpm run build:site", - "build:site": "pnpm run check:styles && vite build && node --experimental-strip-types scripts/finalize-sitemap.ts", + "build:site": "pnpm run check:styles && vite build && node --experimental-strip-types scripts/finalize-sitemap.ts && node --experimental-strip-types scripts/check-seo.ts", "check": "biome check --write --unsafe . && pnpm run check:styles", + "check:seo": "node --experimental-strip-types scripts/check-seo.ts", "check:anchors": "node --experimental-strip-types scripts/check-internal-anchors.ts", "check:markdown": "node scripts/check-markdown-components.mjs && tsx scripts/check-ai-docs.ts", "check:types": "tsgo --project tsconfig.app.json --noEmit && tsgo --project tsconfig.node.json --noEmit", diff --git a/scripts/check-seo.ts b/scripts/check-seo.ts new file mode 100644 index 000000000..2f02e4852 --- /dev/null +++ b/scripts/check-seo.ts @@ -0,0 +1,129 @@ +import fs from 'node:fs/promises' +import path from 'node:path' +import { canonicalUrlForRoute, titleProblems } from '../src/lib/seo-metadata.ts' + +// Checks the prerendered HTML after `vite build`: every docs page in the +// sitemap, and every built docs page, has exactly one canonical link equal to +// its public sitemap URL and one document title that follows the title rules. + +const publicDirectory = path.resolve(process.argv[2] ?? 'dist/public') +const sitemapPath = path.join(publicDirectory, 'sitemap.xml') +// Vocs titles generated OpenAPI groups " · " without the +// site title template. Report them, but only fail on authored page titles. +const generatedOpenApiTitle = /^[^|]+ · Tempo API$/ + +const sitemap = await fs.readFile(sitemapPath, 'utf-8').catch((error: NodeJS.ErrnoException) => { + if (error.code !== 'ENOENT') throw error + return undefined +}) +if (!sitemap) { + if (process.env.VITE_E2E === 'true' || process.env.VERCEL_ENV !== 'production') { + console.log( + `Skipped the SEO check: no sitemap at ${path.relative(process.cwd(), sitemapPath)}.`, + ) + process.exit(0) + } + throw new Error(`Missing production sitemap at ${sitemapPath}`) +} + +const locations = Array.from(sitemap.matchAll(/([^<]+)<\/loc>/g), ([, location]) => location) +const indexLocation = locations.find((location) => /\/(?:get-started|docs\/api)\/?$/.test(location)) +if (!indexLocation) throw new Error('Could not resolve the site base URL from the sitemap') +const siteBase = indexLocation.replace(/\/(?:get-started|docs\/api)\/?$/, '') + +const sitemapRoutes = new Map() +for (const location of locations) { + if (!location.startsWith(siteBase)) continue + const route = decodeURIComponent(location.slice(siteBase.length)).replace(/\/+$/, '') || '/' + sitemapRoutes.set(route, location) +} + +async function builtRoutes(directory: string): Promise { + const entries = await fs.readdir(directory, { withFileTypes: true }).catch(() => []) + const routes = await Promise.all( + entries.map(async (entry) => { + const entryPath = path.join(directory, entry.name) + if (entry.isDirectory()) return builtRoutes(entryPath) + if (!entry.isFile() || entry.name !== 'index.html') return [] + return [`/${path.relative(publicDirectory, directory).split(path.sep).join('/')}`] + }), + ) + return routes.flat() +} + +const routes = [ + ...new Set([ + ...sitemapRoutes.keys(), + '/', + ...(await builtRoutes(path.join(publicDirectory, 'docs'))), + ...(await builtRoutes(path.join(publicDirectory, 'get-started'))), + ]), +].sort((a, b) => a.localeCompare(b)) + +const errors: string[] = [] +const generatedTitles: string[] = [] + +for (const route of routes) { + const file = path.join( + publicDirectory, + route === '/' ? 'index.html' : route.slice(1), + route === '/' ? '' : 'index.html', + ) + const html = await fs.readFile(file, 'utf-8').catch(() => undefined) + if (html === undefined) { + errors.push( + `${route}: listed in the sitemap but no built HTML at ${path.relative(process.cwd(), file)}`, + ) + continue + } + if (!sitemapRoutes.has(route)) errors.push(`${route}: built page is missing from the sitemap`) + + const head = html.slice(0, Math.max(html.indexOf(''), 0)) + const canonicals = Array.from( + head.matchAll(/]*\brel=["']canonical["'][^>]*>/gi), + ([tag]) => tag.match(/\bhref=["']([^"']*)["']/i)?.[1], + ) + const expected = canonicalUrlForRoute(route) + if (canonicals.length !== 1) { + errors.push(`${route}: expected one canonical link, found ${canonicals.length}`) + } else if (canonicals[0] !== expected) { + errors.push(`${route}: canonical ${canonicals[0]} does not match ${expected}`) + } + const sitemapUrl = sitemapRoutes.get(route) + if (sitemapUrl && siteBase === canonicalUrlForRoute('/') && sitemapUrl !== expected) { + errors.push(`${route}: sitemap URL ${sitemapUrl} does not match canonical ${expected}`) + } + + const titles = Array.from( + head.matchAll(/]*)?>([\s\S]*?)<\/title>/gi), + ([, title]) => + (title ?? '') + .replaceAll('&', '&') + .replaceAll(''', "'") + .replaceAll(''', "'") + .replaceAll('"', '"'), + ) + if (titles.length !== 1) { + errors.push(`${route}: expected one document title, found ${titles.length}`) + continue + } + const [title] = titles as [string] + if (generatedOpenApiTitle.test(title)) { + generatedTitles.push(`${route}: ${title}`) + continue + } + for (const problem of titleProblems(route, title)) errors.push(`${route}: ${problem} (${title})`) +} + +if (errors.length > 0) { + throw new Error(`SEO check failed for ${errors.length} issue(s):\n${errors.join('\n')}`) +} + +console.log( + `Validated canonical links and titles for ${routes.length} built pages in ${path.relative(process.cwd(), publicDirectory)}.`, +) +if (generatedTitles.length > 0) { + console.log( + `${generatedTitles.length} generated OpenAPI pages keep Vocs' " · Tempo API" title:\n${generatedTitles.join('\n')}`, + ) +} diff --git a/src/lib/docs-seo-metadata.test.ts b/src/lib/docs-seo-metadata.test.ts index ca3732510..870191a72 100644 --- a/src/lib/docs-seo-metadata.test.ts +++ b/src/lib/docs-seo-metadata.test.ts @@ -32,8 +32,13 @@ const migratedOpenApiTitleFiles = [ 'api/versioning-policy.mdx', ] -const preservedJxomFiles = [ +// Vocs renders pages under the OpenAPI mount with its own layout, which uses +// seoTitle or the bare title and skips the site title template. These +// jxom-authored pages keep their title and H1, and set an seoTitle only so the +// document title gets the docs suffix that seo-metadata.test.ts enforces. +const openApiLayoutSeoTitleFiles = [ 'api/authentication.mdx', + 'api/faq.mdx', 'api/fee-payer.mdx', 'api/indexer-api.mdx', 'api/json-rpc.mdx', @@ -95,7 +100,11 @@ describe('docs SEO metadata', () => { .map((file) => ({ file, source: fs.readFileSync(file, 'utf8') })) .filter( ({ file, source }) => - /^seoTitle:/m.test(source) && path.relative(docsRoot, file) !== 'api/reference.mdx', + /^seoTitle:/m.test(source) && + path.relative(docsRoot, file) !== 'api/reference.mdx' && + !openApiLayoutSeoTitleFiles.includes(path.relative(docsRoot, file)) && + // TIP pages keep the proposal's title and a numbered H1. + !path.relative(docsRoot, file).startsWith('protocol/tips/'), ) expect(auditedPages.length).toBeGreaterThanOrEqual(115) @@ -112,10 +121,10 @@ describe('docs SEO metadata', () => { } }) - test('keeps jxom-authored API metadata outside the audit rewrite', () => { - for (const file of preservedJxomFiles) { + test('gives jxom-authored OpenAPI pages a suffixed SEO title', () => { + for (const file of openApiLayoutSeoTitleFiles) { const source = fs.readFileSync(path.join(docsRoot, file), 'utf8') - expect(frontmatterString(source, 'seoTitle'), file).toBeUndefined() + expect(frontmatterString(source, 'seoTitle'), file).toMatch(/ \| Tempo Docs$/) } }) diff --git a/src/lib/docs-structured-data.test.ts b/src/lib/docs-structured-data.test.ts index 05d1affde..3ad8b58f9 100644 --- a/src/lib/docs-structured-data.test.ts +++ b/src/lib/docs-structured-data.test.ts @@ -49,7 +49,19 @@ describe('docs structured data', () => { expect(docsStructuredDataHead('/', {})).toMatchObject({ canonical: 'https://tempo.xyz/developers', }) - expect(docsStructuredDataHead('/get-started', {})).not.toHaveProperty('canonical') + }) + + test.each([ + ['/get-started', 'https://tempo.xyz/developers/get-started'], + ['/get-started/use-cases', 'https://tempo.xyz/developers/get-started/use-cases'], + ['/docs/accounts/access-keys', 'https://tempo.xyz/developers/docs/accounts/access-keys'], + ['/docs/api/activities', 'https://tempo.xyz/developers/docs/api/activities'], + ['/docs/guide/payments/', 'https://tempo.xyz/developers/docs/guide/payments'], + ['docs/partners', 'https://tempo.xyz/developers/docs/partners'], + ])('emits an explicit no-slash canonical for %s', (route, canonical) => { + expect(docsStructuredDataHead(route, {})?.canonical).toBe(canonical) + const schema = graph(route, { title: 'Page' }) + expect(node(schema, 'TechArticle').url).toBe(canonical) }) test('uses authored page metadata for TechArticle semantics', () => { diff --git a/src/lib/docs-structured-data.ts b/src/lib/docs-structured-data.ts index 8162d22e1..ea906ed74 100644 --- a/src/lib/docs-structured-data.ts +++ b/src/lib/docs-structured-data.ts @@ -86,9 +86,11 @@ export function docsStructuredDataHead( return { base: false, meta: ogImage } } - // The public mount has no trailing slash. Match its redirect policy and the - // URLs used by the docs graph instead of Vocs' default baseUrl + "/". - const canonical = pagePath === '/' ? { canonical: developersUrl } : {} + // Every docs page names its public URL explicitly, so preview and proxy hosts + // never become canonical. The public mount has no trailing slash: match its + // redirect policy and the sitemap instead of Vocs' default baseUrl + path. + const canonicalUrl = `${developersUrl}${pagePath === '/' ? '' : pagePath.replace(/\/+$/, '')}` + const canonical = { canonical: canonicalUrl } // Advertise the existing generated text without requiring hydration or a // reader to discover the page-tools menu. Use the canonical public mount. const markdownRoute = pagePath === '/' ? '/index' : pagePath.replace(/\/$/, '') @@ -120,7 +122,7 @@ export function docsStructuredDataHead( const websiteId = 'https://tempo.xyz/#website' const entityDescription = 'Tempo is a payments-first Layer 1 blockchain built for stablecoin payments, global payouts, agentic payments, and enterprise settlement.' - const url = `${developersUrl}${pagePath === '/' ? '' : pagePath}` + const url = canonicalUrl const description = frontmatter?.description?.trim() const breadcrumbId = `${url}#breadcrumb` const breadcrumbs = [ diff --git a/src/lib/seo-metadata.test.ts b/src/lib/seo-metadata.test.ts new file mode 100644 index 000000000..b9d5739ed --- /dev/null +++ b/src/lib/seo-metadata.test.ts @@ -0,0 +1,205 @@ +import fs from 'node:fs' +import path from 'node:path' +import { describe, expect, test } from 'vitest' +import vocsConfig from '../../vocs.config' +import { canonicalDevelopersOrigin } from './docs-routing' +import { + canonicalUrlForRoute, + descriptionProblems, + docsTitleSuffix, + duplicateTitles, + explainerTitleSuffix, + seoCanonicalOrigin, + titleProblems, +} from './seo-metadata' + +const pagesRoot = path.resolve('src/pages') + +type PageMetadata = { + description: string | undefined + error?: string | undefined + file: string + renderedTitle: string | undefined + route: string + title: string | undefined +} + +function markdownFiles(directory: string): string[] { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const filepath = path.join(directory, entry.name) + if (entry.isDirectory()) return markdownFiles(filepath) + return entry.isFile() && /\.mdx?$/.test(entry.name) ? [filepath] : [] + }) +} + +function frontmatterValue(frontmatter: string, key: string): string | undefined { + const serialized = frontmatter.match(new RegExp(`^${key}:(.*)$`, 'm'))?.[1]?.trim() + if (serialized === undefined) return undefined + // The lint reads single-line scalars only. Block scalars hide length problems. + if (/^[|>]/.test(serialized)) throw new Error(`${key} must be a single-line string`) + if (serialized.startsWith('"')) return JSON.parse(serialized) + if (serialized.startsWith("'") && serialized.endsWith("'")) + return serialized.slice(1, -1).replaceAll("''", "'") + // A plain scalar can't hold ": ", which YAML reads as a nested mapping. + if (/: /.test(serialized)) throw new Error(`${key} must be quoted: ${serialized}`) + return serialized.replace(/\s+#.*$/, '') +} + +function routeFor(file: string) { + const route = `/${path.relative(pagesRoot, file).split(path.sep).join('/')}` + .replace(/\.mdx?$/, '') + .replace(/(?:^|\/)index$/, '') + return route || '/' +} + +/** Mirrors Vocs' resolveTitleTemplate + replace('%s', title). */ +function renderTitle(route: string, frontmatter: Record) { + const title = typeof frontmatter.title === 'string' ? frontmatter.title : vocsConfig.title + // Pages under the OpenAPI mount render through Vocs' OpenAPI layout, which + // uses seoTitle or the bare title and skips the title template. + if (route === '/docs/api' || route.startsWith('/docs/api/')) { + return typeof frontmatter.seoTitle === 'string' ? frontmatter.seoTitle.trim() : title + } + const template = + typeof vocsConfig.titleTemplate === 'function' + ? vocsConfig.titleTemplate(route, { frontmatter, siteTitle: vocsConfig.title, title }) + : vocsConfig.titleTemplate + const resolved = title.includes(vocsConfig.title) ? undefined : template + return resolved ? resolved.replace('%s', title) : title +} + +function readPages(): PageMetadata[] { + return markdownFiles(pagesRoot).map((file) => { + const source = fs.readFileSync(file, 'utf8') + const frontmatter = source.match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1] ?? '' + const route = routeFor(file) + const relative = path.relative(process.cwd(), file) + try { + const title = frontmatterValue(frontmatter, 'title') + const seoTitle = frontmatterValue(frontmatter, 'seoTitle') + return { + description: frontmatterValue(frontmatter, 'description'), + file: relative, + renderedTitle: title ? renderTitle(route, { seoTitle, title }) : undefined, + route, + title, + } + } catch (error) { + return { + description: undefined, + error: (error as Error).message, + file: relative, + renderedTitle: undefined, + route, + title: undefined, + } + } + }) +} + +describe('docs SEO lint', () => { + const pages = readPages() + + test('reads every authored page', () => { + expect(pages.length).toBeGreaterThan(300) + expect(pages.map((page) => page.route)).toContain('/') + expect(pages.map((page) => page.route)).toContain('/docs/accounts/access-keys') + }) + + test('writes title, seoTitle, and description as single-line YAML strings', () => { + expect(pages.flatMap(({ file, error }) => (error ? [`${file}: ${error}`] : []))).toEqual([]) + }) + + test('gives every page a title and a description', () => { + const missing = pages.flatMap(({ file, title, description }) => [ + ...(title?.trim() ? [] : [`${file}: missing title`]), + ...(description?.trim() ? [] : [`${file}: missing description`]), + ]) + expect(missing).toEqual([]) + }) + + test('renders every title with the docs suffix in 60 characters or fewer', () => { + const problems = pages.flatMap(({ file, route, renderedTitle }) => + titleProblems(route, renderedTitle).map( + (problem) => `${file}: ${problem} (${renderedTitle})`, + ), + ) + expect(problems).toEqual([]) + }) + + test('renders a unique title for every page', () => { + const duplicates = duplicateTitles( + pages.flatMap(({ route, renderedTitle }) => + renderedTitle ? [{ route, title: renderedTitle }] : [], + ), + ) + expect(duplicates).toEqual([]) + }) + + test('keeps every description between 50 and 160 characters', () => { + const problems = pages.flatMap(({ file, description }) => + descriptionProblems(description).map((problem) => `${file}: ${problem}`), + ) + expect(problems).toEqual([]) + }) +}) + +describe('docs SEO rules', () => { + test('uses the docs title suffix in the Vocs title template', () => { + expect(renderTitle('/docs/guide/payments/send-a-payment', { title: 'Send a Payment' })).toBe( + `Send a Payment${docsTitleSuffix}`, + ) + expect(renderTitle('/get-started', { title: 'Get Started' })).toBe( + `Get Started${docsTitleSuffix}`, + ) + expect( + renderTitle('/docs/api', { + title: 'Tempo API', + seoTitle: 'Tempo API Reference | Tempo Docs', + }), + ).toBe('Tempo API Reference | Tempo Docs') + }) + + test('flags long titles, wrong suffixes, and the explainer exception', () => { + expect(titleProblems('/docs/api', 'Tempo API | Tempo Docs')).toEqual([]) + expect(titleProblems('/docs/api', 'Tempo API ⋅ Tempo Docs')).toEqual([ + 'title must end with " | Tempo Docs"', + ]) + expect(titleProblems('/docs/api', 'Tempo API | Docs')).toHaveLength(1) + expect(titleProblems('/docs/api', `${'x'.repeat(48)}${docsTitleSuffix}`)).toEqual([ + 'title is 61 characters (max 60)', + ]) + expect(titleProblems('/docs/api', undefined)).toEqual(['missing title']) + expect( + titleProblems('/docs/resources/guides/prefunding', `Prefunding${explainerTitleSuffix}`), + ).toEqual([]) + expect(titleProblems('/docs/resources/guides', `Guides${explainerTitleSuffix}`)).toHaveLength(1) + }) + + test('flags missing, short, and long descriptions', () => { + expect(descriptionProblems(undefined)).toEqual(['missing description']) + expect(descriptionProblems('Too short.')).toEqual(['description is 10 characters (min 50)']) + expect(descriptionProblems('x'.repeat(161))).toEqual([ + 'description is 161 characters (max 160)', + ]) + expect(descriptionProblems('x'.repeat(50))).toEqual([]) + }) + + test('finds duplicate titles regardless of case', () => { + expect( + duplicateTitles([ + { route: '/a', title: 'Wallets | Tempo Docs' }, + { route: '/b', title: 'wallets | Tempo Docs' }, + { route: '/c', title: 'Bridges | Tempo Docs' }, + ]), + ).toEqual([{ title: 'wallets | tempo docs', routes: ['/a', '/b'] }]) + }) + + test('builds no-slash canonical URLs on the public docs mount', () => { + expect(seoCanonicalOrigin).toBe(canonicalDevelopersOrigin) + expect(canonicalUrlForRoute('/')).toBe('https://tempo.xyz/developers') + expect(canonicalUrlForRoute('')).toBe('https://tempo.xyz/developers') + expect(canonicalUrlForRoute('/docs/api/')).toBe('https://tempo.xyz/developers/docs/api') + expect(canonicalUrlForRoute('get-started')).toBe('https://tempo.xyz/developers/get-started') + }) +}) diff --git a/src/lib/seo-metadata.ts b/src/lib/seo-metadata.ts new file mode 100644 index 000000000..5561e78c9 --- /dev/null +++ b/src/lib/seo-metadata.ts @@ -0,0 +1,65 @@ +/** + * Search metadata rules shared by the frontmatter lint (`seo-metadata.test.ts`) + * and the post-build HTML check (`scripts/check-seo.ts`). + * + * Keep this module free of imports so Node can run the build check with + * `--experimental-strip-types`. + */ + +/** Public origin of the docs mount. Mirrors `canonicalDevelopersOrigin`. */ +export const seoCanonicalOrigin = 'https://tempo.xyz/developers' +export const docsTitleSuffix = ' | Tempo Docs' +/** Shorter brand suffix allowed for the Resources explainers. */ +export const explainerTitleSuffix = ' | Tempo' +export const maxTitleLength = 60 +export const minDescriptionLength = 50 +export const maxDescriptionLength = 160 + +/** Returns the public canonical URL for a docs route, with no trailing slash. */ +export function canonicalUrlForRoute(route: string): string { + const pathname = `/${route.replace(/^\/+|\/+$/g, '')}` + return pathname === '/' ? seoCanonicalOrigin : `${seoCanonicalOrigin}${pathname}` +} + +/** Title suffixes a route may end with. Resources explainers may use the brand suffix. */ +export function allowedTitleSuffixes(route: string): readonly string[] { + return /^\/docs\/resources\/guides\/[^/]+$/.test(route) + ? [docsTitleSuffix, explainerTitleSuffix] + : [docsTitleSuffix] +} + +/** Lists the ways a rendered document title breaks the docs title rules. */ +export function titleProblems(route: string, title: string | undefined): string[] { + if (!title?.trim()) return ['missing title'] + const problems: string[] = [] + const suffixes = allowedTitleSuffixes(route) + if (!suffixes.some((suffix) => title.endsWith(suffix) && title.length > suffix.length)) + problems.push(`title must end with ${suffixes.map((suffix) => `"${suffix}"`).join(' or ')}`) + if (title.length > maxTitleLength) + problems.push(`title is ${title.length} characters (max ${maxTitleLength})`) + if (title !== title.trim() || /\s{2}/.test(title)) problems.push('title has extra whitespace') + return problems +} + +/** Lists the ways a page description breaks the docs description rules. */ +export function descriptionProblems(description: string | undefined): string[] { + if (!description?.trim()) return ['missing description'] + const { length } = description.trim() + if (length < minDescriptionLength) + return [`description is ${length} characters (min ${minDescriptionLength})`] + if (length > maxDescriptionLength) + return [`description is ${length} characters (max ${maxDescriptionLength})`] + return [] +} + +/** Finds titles used by more than one route, ignoring case. */ +export function duplicateTitles(pages: readonly { route: string; title: string }[]) { + const routesByTitle = new Map() + for (const { route, title } of pages) { + const key = title.trim().toLowerCase() + routesByTitle.set(key, [...(routesByTitle.get(key) ?? []), route]) + } + return [...routesByTitle.entries()] + .filter(([, routes]) => routes.length > 1) + .map(([title, routes]) => ({ title, routes })) +} diff --git a/src/lib/vercel-routing.test.ts b/src/lib/vercel-routing.test.ts index 4a04714ef..1e8dd7354 100644 --- a/src/lib/vercel-routing.test.ts +++ b/src/lib/vercel-routing.test.ts @@ -30,3 +30,98 @@ describe('Vercel routing', () => { ]) }) }) + +type VercelHeaderRule = { + source: string + headers: Array<{ key: string; value: string }> +} + +/** + * Compiles the subset of Vercel's path-to-regexp source syntax that the header + * rules use: literals, `\\` escapes, unnamed groups, and `:name(pattern)` params. + */ +function compileVercelSource(source: string) { + let pattern = '' + const names: string[] = [] + const group = (start: number) => { + let depth = 0 + for (let index = start; index < source.length; index++) { + if (source[index] === '\\') index++ + else if (source[index] === '(') depth++ + else if (source[index] === ')' && --depth === 0) return index + } + throw new Error(`Unbalanced group in ${source}`) + } + for (let index = 0; index < source.length; index++) { + const char = source[index] as string + if (char === '\\') { + pattern += `\\${source[++index]}` + } else if (char === ':') { + const name = /^\w+/.exec(source.slice(index + 1))?.[0] + if (!name) throw new Error(`Unnamed parameter in ${source}`) + index += name.length + names.push(name) + if (source[index + 1] === '(') { + const end = group(index + 1) + pattern += `(${source.slice(index + 2, end)})` + index = end + } else pattern += '([^/]+)' + } else if (char === '(') { + const end = group(index) + pattern += source.slice(index, end + 1) + index = end + } else pattern += char.replace(/[.*+?^${}|[\]/]/g, '\\$&') + } + return { names, regex: new RegExp(`^${pattern}$`) } +} + +function responseHeaders(rules: VercelHeaderRule[], pathname: string) { + const headers: Record = {} + for (const rule of rules) { + const { names, regex } = compileVercelSource(rule.source) + const match = regex.exec(pathname) + if (!match) continue + for (const { key, value } of rule.headers) { + const resolved = names.reduce( + (result, name, index) => result.replaceAll(`:${name}`, match[index + 1] ?? ''), + value, + ) + headers[key] = [...(headers[key] ?? []), resolved] + } + } + return headers +} + +describe('Vercel Markdown twin headers', () => { + const config = JSON.parse(fs.readFileSync('vercel.json', 'utf8')) as { + headers?: VercelHeaderRule[] + } + const rules = config.headers ?? [] + const canonical = (url: string) => [`<${url}>; rel="canonical"`] + + it.each([ + ['/index.md', 'https://tempo.xyz/developers'], + ['/developers/index.md', 'https://tempo.xyz/developers'], + ['/assets/md/index.md', 'https://tempo.xyz/developers'], + ['/developers/assets/md/index.md', 'https://tempo.xyz/developers'], + ['/get-started.md', 'https://tempo.xyz/developers/get-started'], + ['/docs/accounts/access-keys.md', 'https://tempo.xyz/developers/docs/accounts/access-keys'], + ['/developers/docs/accounts.md', 'https://tempo.xyz/developers/docs/accounts'], + ['/assets/md/docs/api/fee-payer.md', 'https://tempo.xyz/developers/docs/api/fee-payer'], + [ + '/developers/assets/md/docs/protocol/tips/tip-1000.md', + 'https://tempo.xyz/developers/docs/protocol/tips/tip-1000', + ], + ])('points %s at its HTML page with one canonical Link header', (pathname, url) => { + expect(responseHeaders(rules, pathname)).toEqual({ Link: canonical(url) }) + }) + + it.each([ + '/SKILL.md', + '/developers/SKILL.md', + '/docs/accounts', + '/llms.txt', + ])('leaves %s without a canonical Link header', (pathname) => { + expect(responseHeaders(rules, pathname)).toEqual({}) + }) +}) diff --git a/src/lib/vocs-config-seo.test.ts b/src/lib/vocs-config-seo.test.ts index 9b1313980..a79468151 100644 --- a/src/lib/vocs-config-seo.test.ts +++ b/src/lib/vocs-config-seo.test.ts @@ -22,39 +22,39 @@ describe('vocs.config docs SEO controls', () => { titleFor( '/docs/guide/payments/send-a-payment', 'How to send a stablecoin payment on Tempo', - 'Send a Stablecoin Payment on Tempo | Docs', + 'Send a Stablecoin Payment on Tempo | Tempo Docs', ), - ).toBe('Send a Stablecoin Payment on Tempo | Docs') + ).toBe('Send a Stablecoin Payment on Tempo | Tempo Docs') expect(titleFor('/', 'Build on Tempo', 'Tempo Developer Docs: APIs, SDKs & Guides')).toBe( 'Tempo Developer Docs: APIs, SDKs & Guides', ) }) test('uses Tempo Docs title suffix for docs pages', () => { - expect(titleFor('/', 'Documentation')).toBe('Documentation ⋅ Tempo Docs') + expect(titleFor('/', 'Documentation')).toBe('Documentation | Tempo Docs') expect(titleFor('/docs/guide/payments/send-a-payment', 'Send a Payment')).toBe( - 'Send a Payment ⋅ Tempo Docs', + 'Send a Payment | Tempo Docs', ) - expect(titleFor('/docs/api', 'Tempo API')).toBe('Tempo API ⋅ Tempo Docs') + expect(titleFor('/docs/api', 'Tempo API')).toBe('Tempo API | Tempo Docs') expect(titleFor('/docs/protocol/transactions', 'Tempo Transactions')).toBe( - 'Tempo Transactions ⋅ Tempo Docs', + 'Tempo Transactions | Tempo Docs', ) - expect(titleFor('/get-started', 'Get Started')).toBe('Get Started ⋅ Tempo Docs') - expect(titleFor('/blog', 'Blog')).toBe('Blog ⋅ Tempo') + expect(titleFor('/get-started', 'Get Started')).toBe('Get Started | Tempo Docs') + expect(titleFor('/blog', 'Blog')).toBe('Blog | Tempo') }) test('formats authored API titles when Vocs supplies routed metadata', () => { expect(titleFor('/docs/api/authentication', 'Authentication')).toBe( - 'Authentication ⋅ Tempo Docs', + 'Authentication | Tempo Docs', ) expect(titleFor('/docs/api/json-rpc', 'Tempo JSON-RPC API: Endpoints & Methods')).toBe( - 'Tempo JSON-RPC API: Endpoints & Methods ⋅ Tempo Docs', + 'Tempo JSON-RPC API: Endpoints & Methods | Tempo Docs', ) expect( titleFor('/docs/api/indexer-api', 'Tempo Indexer API: Query Blockchain Data with SQL'), - ).toBe('Tempo Indexer API: Query Blockchain Data with SQL ⋅ Tempo Docs') + ).toBe('Tempo Indexer API: Query Blockchain Data with SQL | Tempo Docs') expect(titleFor('/docs/api/fee-payer', 'Tempo Fee Payer API: Sponsor Transaction Fees')).toBe( - 'Tempo Fee Payer API: Sponsor Transaction Fees ⋅ Tempo Docs', + 'Tempo Fee Payer API: Sponsor Transaction Fees | Tempo Docs', ) }) diff --git a/src/pages/docs/accounts.mdx b/src/pages/docs/accounts.mdx index f3157d8c9..76f5680d2 100644 --- a/src/pages/docs/accounts.mdx +++ b/src/pages/docs/accounts.mdx @@ -1,7 +1,7 @@ --- title: Tempo Accounts seoTitle: "Tempo Accounts | Tempo Docs" -description: Give every customer and business a stablecoin account with its security rules built in. Users hold their keys, backends and agents pay within limits, and Tempo enforces every rule onchain. +description: Give every customer and business a stablecoin account with built-in security rules. Users hold their keys, and backends and agents pay within limits. ogImage: /og/2026-q4/og_2026-q4_docs_accounts_shape-000_v02.jpg --- diff --git a/src/pages/docs/accounts/access-keys.mdx b/src/pages/docs/accounts/access-keys.mdx index 6c89a62dc..faab54089 100644 --- a/src/pages/docs/accounts/access-keys.mdx +++ b/src/pages/docs/accounts/access-keys.mdx @@ -1,7 +1,7 @@ --- title: Access Keys -seoTitle: Access Keys with Spending Limits, Scopes, and Expiry on Tempo | Tempo Docs -description: Let a customer's device, your backend, or an AI agent pay from a Tempo account without the signers approving each payment, within a spending limit, expiry, and scopes that Tempo enforces. +seoTitle: "Tempo Access Keys: Spending Limits and Scopes | Tempo Docs" +description: Let a customer's device, your backend, or an AI agent pay from a Tempo account within a spending limit, expiry, and scopes that Tempo enforces. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_accounts-access-keys_title-f5_v02.png --- diff --git a/src/pages/docs/accounts/access-keys/admin-access-keys.mdx b/src/pages/docs/accounts/access-keys/admin-access-keys.mdx index 2db0dd220..c98309ba3 100644 --- a/src/pages/docs/accounts/access-keys/admin-access-keys.mdx +++ b/src/pages/docs/accounts/access-keys/admin-access-keys.mdx @@ -1,7 +1,7 @@ --- title: Admin Access Keys seoTitle: Admin Access Keys for Key Management on Tempo | Tempo Docs -description: Let a customer's trusted device or your key-management service authorize, change, and revoke an account's other access keys without the signers approving each change. +description: Let a customer's trusted device or your key-management service authorize, change, and revoke an account's other access keys without signer approval. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/account-configuration.mdx b/src/pages/docs/accounts/account-configuration.mdx index 003787097..8dd3596cb 100644 --- a/src/pages/docs/accounts/account-configuration.mdx +++ b/src/pages/docs/accounts/account-configuration.mdx @@ -1,7 +1,7 @@ --- title: Account Configuration seoTitle: Change a Tempo Account's Signers and Threshold | Tempo Docs -description: Change a configurable Tempo account's signers, weights, and threshold in one configuration update that keeps its address, and choose weights so losing any one key doesn't lock the account. +description: Change a configurable Tempo account's signers, weights, and threshold without changing its address, and choose weights so no single lost key locks it. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/account-configuration/account-upgrade.mdx b/src/pages/docs/accounts/account-configuration/account-upgrade.mdx index 1011a37b7..d7cc0ee67 100644 --- a/src/pages/docs/accounts/account-configuration/account-upgrade.mdx +++ b/src/pages/docs/accounts/account-configuration/account-upgrade.mdx @@ -1,6 +1,6 @@ --- title: Account Upgrade -seoTitle: Upgrade a Single-Key Tempo Account to Configurable Signers | Tempo Docs +seoTitle: Upgrade a Tempo Account to Configurable Signers | Tempo Docs description: Add backup signers to a single-key (EOA) Tempo account at the same address, so a lost key no longer means a lost account or lost balances. interactive: true --- diff --git a/src/pages/docs/accounts/account-configuration/configuration-updates.mdx b/src/pages/docs/accounts/account-configuration/configuration-updates.mdx index 211a97bdd..387fe2006 100644 --- a/src/pages/docs/accounts/account-configuration/configuration-updates.mdx +++ b/src/pages/docs/accounts/account-configuration/configuration-updates.mdx @@ -1,7 +1,7 @@ --- title: Configuration Updates -seoTitle: Add, Remove, or Replace Signers with a Configuration Update on Tempo | Tempo Docs -description: Add a backup or recovery signer, remove a departing or compromised one, or rotate a key, in one configuration update that keeps the account's address, balance, and access keys. +seoTitle: Add, Remove, or Replace Signers on Tempo | Tempo Docs +description: Add a backup signer, remove a compromised one, or rotate a key in one configuration update that keeps the account's address, balance, and access keys. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/apps.mdx b/src/pages/docs/accounts/apps.mdx index 1d0d29c51..254849968 100644 --- a/src/pages/docs/accounts/apps.mdx +++ b/src/pages/docs/accounts/apps.mdx @@ -1,6 +1,6 @@ --- title: Apps -seoTitle: Build Consumer Apps on Tempo with Privy, Turnkey, and Dynamic Wallets | Tempo Docs +seoTitle: Build Consumer Apps with Tempo Accounts | Tempo Docs description: Give each user of your consumer app a Tempo account that your wallet provider signs for alongside the user, and that the user can recover or leave without you. --- diff --git a/src/pages/docs/accounts/apps/recover-an-account.mdx b/src/pages/docs/accounts/apps/recover-an-account.mdx index 07a7409c9..d710f764f 100644 --- a/src/pages/docs/accounts/apps/recover-an-account.mdx +++ b/src/pages/docs/accounts/apps/recover-an-account.mdx @@ -1,7 +1,7 @@ --- title: Recover a User's Account -seoTitle: Recover a Tempo Account After a Lost Passkey or Device | Tempo Docs -description: Replace a user's lost passkey or backup key with the two signers they still have, then revoke the lost phone's device key. The account keeps its address and balance. +seoTitle: Recover a Tempo Account After a Lost Passkey | Tempo Docs +description: Replace a user's lost passkey or backup key with the two signers they still have, then revoke the lost device key. The account keeps its address. interactive: true --- diff --git a/src/pages/docs/accounts/apps/self-custodial-wallets.mdx b/src/pages/docs/accounts/apps/self-custodial-wallets.mdx index 529519837..09aa1bd74 100644 --- a/src/pages/docs/accounts/apps/self-custodial-wallets.mdx +++ b/src/pages/docs/accounts/apps/self-custodial-wallets.mdx @@ -1,7 +1,7 @@ --- title: Set Up a Self-Custodial Wallet With a Provider -seoTitle: Self-Custodial Embedded Wallets with Privy or Turnkey on Tempo | Tempo Docs -description: Give each user a Tempo account where your wallet provider's key and the user's passkey approve payments together, and only the user can recover or leave without your app or the provider. +seoTitle: Self-Custodial Wallets with Privy or Turnkey | Tempo Docs +description: Give each user a Tempo account that your wallet provider's key and the user's passkey approve together, which only the user can recover or leave. ogImage: /og/2026-q4/og_2026-q4_docs_accounts-providers_title-f5_v02.png --- diff --git a/src/pages/docs/accounts/authentication.mdx b/src/pages/docs/accounts/authentication.mdx index 784eaf585..ffb3ec2e8 100644 --- a/src/pages/docs/accounts/authentication.mdx +++ b/src/pages/docs/accounts/authentication.mdx @@ -1,6 +1,6 @@ --- title: Signing Methods -seoTitle: Sign for Tempo Accounts with Private Keys, Device Keys, or Passkeys | Tempo Docs +seoTitle: Tempo Account Signing Methods and Passkeys | Tempo Docs description: Choose a private key, device key, or passkey for each key on a Tempo account by who should hold it, and set weights so no outside party can approve alone. --- diff --git a/src/pages/docs/accounts/authentication/passkeys.mdx b/src/pages/docs/accounts/authentication/passkeys.mdx index 1ecb09adb..47e579a4d 100644 --- a/src/pages/docs/accounts/authentication/passkeys.mdx +++ b/src/pages/docs/accounts/authentication/passkeys.mdx @@ -1,7 +1,7 @@ --- title: Passkeys seoTitle: Approve Tempo Account Payments with Passkeys | Tempo Docs -description: Let customers approve payments and configuration updates with Face ID, Touch ID, Windows Hello, an Android screen lock, or a security key, using a key only they control. +description: Let customers approve payments and configuration updates with Face ID, Touch ID, Windows Hello, an Android screen lock, or a security key they control. interactive: true --- diff --git a/src/pages/docs/accounts/authentication/private-keys.mdx b/src/pages/docs/accounts/authentication/private-keys.mdx index 71cc70328..b32774236 100644 --- a/src/pages/docs/accounts/authentication/private-keys.mdx +++ b/src/pages/docs/accounts/authentication/private-keys.mdx @@ -1,6 +1,6 @@ --- title: Private Keys -seoTitle: Use Wallet, KMS, and HSM Keys as Tempo Account Signers | Tempo Docs +seoTitle: Use Wallet, KMS, and HSM Keys as Tempo Signers | Tempo Docs description: Sign for a Tempo account with a key you already hold in a wallet, KMS, or HSM, as a weighted signer or as an access key with spending limits. --- diff --git a/src/pages/docs/accounts/automations.mdx b/src/pages/docs/accounts/automations.mdx index acbd18b27..4fc452196 100644 --- a/src/pages/docs/accounts/automations.mdx +++ b/src/pages/docs/accounts/automations.mdx @@ -1,6 +1,6 @@ --- title: Automations -seoTitle: Automate Payouts, Card Funding, and Agent Payments from Tempo Accounts | Tempo Docs +seoTitle: Automate Payouts and Agent Payments on Tempo | Tempo Docs description: Let a backend, a card program, or an AI agent pay from an account with its own access key, within limits, recipients, and an expiry that Tempo enforces. --- diff --git a/src/pages/docs/accounts/automations/pay-from-an-embedded-wallet.mdx b/src/pages/docs/accounts/automations/pay-from-an-embedded-wallet.mdx index 03f9e4dcd..ebfc7909e 100644 --- a/src/pages/docs/accounts/automations/pay-from-an-embedded-wallet.mdx +++ b/src/pages/docs/accounts/automations/pay-from-an-embedded-wallet.mdx @@ -1,7 +1,7 @@ --- title: Pay From a User's Embedded Wallet -seoTitle: Pay from a User's Privy or Turnkey Wallet with a Tempo Access Key | Tempo Docs -description: Have a user's Privy or Turnkey wallet authorize a limited access key once, so your card program or subscription backend pays from it without holding the user's key. +seoTitle: Pay from a Privy or Turnkey Wallet on Tempo | Tempo Docs +description: Have a user's Privy or Turnkey wallet authorize a limited access key once, so your backend pays from it without holding the user's key. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/automations/pay-out-from-a-backend.mdx b/src/pages/docs/accounts/automations/pay-out-from-a-backend.mdx index 200aa8d47..f10d2e281 100644 --- a/src/pages/docs/accounts/automations/pay-out-from-a-backend.mdx +++ b/src/pages/docs/accounts/automations/pay-out-from-a-backend.mdx @@ -1,6 +1,6 @@ --- title: Pay Out From a Backend -seoTitle: Send Payouts from a Backend with a Scoped Tempo Access Key | Tempo Docs +seoTitle: Send Payouts from a Backend with an Access Key | Tempo Docs description: Pay contractors, vendors, or sellers from a Tempo account with a KMS-held access key that pays only approved payees, up to a daily limit. interactive: true --- diff --git a/src/pages/docs/accounts/create.mdx b/src/pages/docs/accounts/create.mdx index 87a1c730f..af23c7d50 100644 --- a/src/pages/docs/accounts/create.mdx +++ b/src/pages/docs/accounts/create.mdx @@ -1,7 +1,7 @@ --- title: "Create an Account" -seoTitle: "Create a Tempo Account with a Passkey, Device Key, or Private Key | Tempo Docs" -description: Create a single-key Tempo account with a passkey on testnet, with no API call or transaction, then try configurable accounts with several signers on the Tempo Accounts devnet. +seoTitle: "Create a Tempo Account with a Passkey or Key | Tempo Docs" +description: Create a single-key Tempo account with a passkey on testnet with no API call or transaction, then try configurable accounts on the Tempo Accounts devnet. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_accounts-create_title-f5_v02.png --- diff --git a/src/pages/docs/accounts/custodians/omnibus-accounts.mdx b/src/pages/docs/accounts/custodians/omnibus-accounts.mdx index a8cae3d04..1f4c1f875 100644 --- a/src/pages/docs/accounts/custodians/omnibus-accounts.mdx +++ b/src/pages/docs/accounts/custodians/omnibus-accounts.mdx @@ -1,7 +1,7 @@ --- title: Hold Customer Funds in an Omnibus Account -seoTitle: Run an Omnibus Account with Customer Deposit Addresses on Tempo | Tempo Docs -description: Give each customer a virtual deposit address that pays into one Tempo account, accept only the stablecoins you list, and credit each deposit to the right customer once. +seoTitle: Run an Omnibus Account with Deposit Addresses | Tempo Docs +description: Give each customer a virtual deposit address that pays into one Tempo account, accept only the stablecoins you list, and credit each deposit once. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/custodians/team-multisig.mdx b/src/pages/docs/accounts/custodians/team-multisig.mdx index fcb3e441d..922a50fa6 100644 --- a/src/pages/docs/accounts/custodians/team-multisig.mdx +++ b/src/pages/docs/accounts/custodians/team-multisig.mdx @@ -1,6 +1,6 @@ --- title: Set Up a Team Multisig -seoTitle: Set Up a Team Multisig with Several Approvers on Tempo | Tempo Docs +seoTitle: Set Up a Team Multisig on Tempo | Tempo Docs description: Create one Tempo account that three approvers control, where any two approve each payment and no single key can move funds. --- diff --git a/src/pages/docs/accounts/fees.mdx b/src/pages/docs/accounts/fees.mdx index d58f17b85..fd5ef913b 100644 --- a/src/pages/docs/accounts/fees.mdx +++ b/src/pages/docs/accounts/fees.mdx @@ -1,6 +1,6 @@ --- title: Fee Management -seoTitle: Pay or Sponsor Tempo Account Fees in Stablecoins | Tempo Docs +seoTitle: Pay or Sponsor Account Fees in Stablecoins | Tempo Docs description: Pay network fees from the USD stablecoins an account already holds, or sponsor them with a fee payer that can't move the account's funds. --- diff --git a/src/pages/docs/accounts/fees/fee-tokens.mdx b/src/pages/docs/accounts/fees/fee-tokens.mdx index e1c43b8de..48c61698e 100644 --- a/src/pages/docs/accounts/fees/fee-tokens.mdx +++ b/src/pages/docs/accounts/fees/fee-tokens.mdx @@ -1,6 +1,6 @@ --- title: Fee Tokens -seoTitle: Choose the Stablecoin a Tempo Account Pays Fees In | Tempo Docs +seoTitle: Choose a Fee Token for a Tempo Account | Tempo Docs description: Set the USD stablecoin an account pays network fees in once, and override it on any transaction that should pay in a different one. --- diff --git a/src/pages/docs/accounts/how-it-works.mdx b/src/pages/docs/accounts/how-it-works.mdx index 976cdfa08..ce927d179 100644 --- a/src/pages/docs/accounts/how-it-works.mdx +++ b/src/pages/docs/accounts/how-it-works.mdx @@ -1,6 +1,6 @@ --- title: How It Works -seoTitle: How Tempo Accounts Work and Why They're Non-Custodial | Tempo Docs +seoTitle: How Non-Custodial Tempo Accounts Work | Tempo Docs description: Only a Tempo account's own keys can move its stablecoins. Signers approve together, access keys pay alone within limits, and Tempo has no override. --- diff --git a/src/pages/docs/accounts/keys.mdx b/src/pages/docs/accounts/keys.mdx index 4140b59a2..c21c9ac72 100644 --- a/src/pages/docs/accounts/keys.mdx +++ b/src/pages/docs/accounts/keys.mdx @@ -1,6 +1,6 @@ --- title: Account Model -seoTitle: Tempo EVM Account Model, Account Types, and Signature Types | Tempo Docs +seoTitle: Tempo Account Model and Signature Types | Tempo Docs description: Tempo EVM accounts are approved by one key or by weighted owners, can hand limited signing power to access keys, and use five signature formats. ogImage: /og/2026-q4/og_2026-q4_docs_accounts-keys_title-f5_v02.png --- diff --git a/src/pages/docs/accounts/policies.mdx b/src/pages/docs/accounts/policies.mdx index 7481615d3..45a179b5c 100644 --- a/src/pages/docs/accounts/policies.mdx +++ b/src/pages/docs/accounts/policies.mdx @@ -1,7 +1,7 @@ --- title: Account Policies -seoTitle: Account Policies for Approvals and Incoming Payments on Tempo | Tempo Docs -description: A signing threshold decides who can move a Tempo account's funds, and a receive policy decides which stablecoins and senders can pay it. Tempo enforces both onchain. +seoTitle: "Tempo Account Policies: Approvals and Receiving | Tempo Docs" +description: A signing threshold decides who can move a Tempo account's funds, and a receive policy decides who can pay it. Tempo enforces both onchain. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/policies/signing-thresholds.mdx b/src/pages/docs/accounts/policies/signing-thresholds.mdx index 5b1afb747..49ac5396f 100644 --- a/src/pages/docs/accounts/policies/signing-thresholds.mdx +++ b/src/pages/docs/accounts/policies/signing-thresholds.mdx @@ -1,6 +1,6 @@ --- title: Signing Thresholds -seoTitle: Signer Weights and Signing Thresholds for Tempo Accounts | Tempo Docs +seoTitle: Signer Weights and Signing Thresholds on Tempo | Tempo Docs description: Give each signer a weight and set the total weight a transaction needs, so no outside party can pay alone and losing one signer doesn't lock the account. --- diff --git a/src/pages/docs/accounts/security.mdx b/src/pages/docs/accounts/security.mdx index 9d668a091..4063d5eff 100644 --- a/src/pages/docs/accounts/security.mdx +++ b/src/pages/docs/accounts/security.mdx @@ -1,7 +1,7 @@ --- title: Security seoTitle: Tempo Account Security and Who Can Move Funds | Tempo Docs -description: Tempo's validators enforce each account's signers, thresholds, and access key limits on every transaction. See what your app secures, and what to do when a key or service is compromised. +description: Tempo validators enforce every account's signers, thresholds, and access key limits. Learn what your app secures and what to do after a compromise. --- import { Card, Cards } from 'vocs' diff --git a/src/pages/docs/accounts/wallets.mdx b/src/pages/docs/accounts/wallets.mdx index 1930fba47..1d0da96ff 100644 --- a/src/pages/docs/accounts/wallets.mdx +++ b/src/pages/docs/accounts/wallets.mdx @@ -1,7 +1,7 @@ --- title: Wallets -seoTitle: Add Tempo to a Wallet, or Connect MetaMask and Rabby to Your App | Tempo Docs -description: Add Tempo networks, stablecoin balances, and Tempo Transactions to a wallet, or let your app's users pay with MetaMask, Rabby, or another wallet they already have. +seoTitle: Add Tempo to a Wallet or Connect MetaMask | Tempo Docs +description: Add Tempo networks, stablecoin balances, and Tempo Transactions to a wallet, or let your app's users pay with MetaMask, Rabby, or another wallet. interactive: true mipd: true --- diff --git a/src/pages/docs/accounts/wallets/add-tempo-to-your-wallet.mdx b/src/pages/docs/accounts/wallets/add-tempo-to-your-wallet.mdx index 748772ee4..5b8af6b59 100644 --- a/src/pages/docs/accounts/wallets/add-tempo-to-your-wallet.mdx +++ b/src/pages/docs/accounts/wallets/add-tempo-to-your-wallet.mdx @@ -1,6 +1,6 @@ --- title: Add Tempo to Your Wallet -seoTitle: Add Tempo Networks, Stablecoin Balances, and Tempo Transactions to a Wallet | Tempo Docs +seoTitle: Add Tempo Networks and Balances to a Wallet | Tempo Docs description: Add Tempo mainnet and testnet to a wallet, show stablecoin balances without a native gas token, let users pay fees in stablecoins, and send Tempo Transactions. --- diff --git a/src/pages/docs/agents.mdx b/src/pages/docs/agents.mdx index ba56e7b46..400ce5f2e 100644 --- a/src/pages/docs/agents.mdx +++ b/src/pages/docs/agents.mdx @@ -1,6 +1,6 @@ --- title: Machine payments -seoTitle: Machine Payments | Tempo Docs +seoTitle: "Tempo MPP: Machine Payments Protocol | Tempo Docs" description: Pay for APIs from an application or agent, accept payments for your service, and meter usage with payment sessions. ogImage: /og/2026-q4/og_2026-q4_docs_agents_shape-000_v02.jpg --- diff --git a/src/pages/docs/api.mdx b/src/pages/docs/api.mdx index 49859388e..d7392894e 100644 --- a/src/pages/docs/api.mdx +++ b/src/pages/docs/api.mdx @@ -1,7 +1,7 @@ --- title: "Tempo API" -seoTitle: "Tempo API: Sponsor Gas Fees and Route Stablecoins | Tempo Docs" -description: "Tempo API: pay your customers' gas with a hosted fee payer, and move stablecoins onto Tempo from other chains with Routes. One API key, REST endpoints, and guides." +seoTitle: "Tempo API: Sponsor Fees and Route Stablecoins | Tempo Docs" +description: "Tempo API: pay your customers' gas with a hosted fee payer, and move stablecoins onto Tempo from other chains with Routes, using one API key." ogImage: /og/2026-q4/og_2026-q4_docs_api_linework-000_v02.png --- diff --git a/src/pages/docs/api/authentication.mdx b/src/pages/docs/api/authentication.mdx index c9f39bb10..782b3ee81 100644 --- a/src/pages/docs/api/authentication.mdx +++ b/src/pages/docs/api/authentication.mdx @@ -1,5 +1,6 @@ --- title: Authentication +seoTitle: "Tempo API Authentication: Keys and MPP | Tempo Docs" description: Authenticate requests to the Tempo blockchain API with public access, production or sandbox API keys, or MPP pay-per-request credentials. ogImage: /og/2026-q4/og_2026-q4_docs_api-authentication_title-f5_v02.png --- diff --git a/src/pages/docs/api/console.mdx b/src/pages/docs/api/console.mdx index f15e6fa0b..b48312186 100644 --- a/src/pages/docs/api/console.mdx +++ b/src/pages/docs/api/console.mdx @@ -1,6 +1,6 @@ --- title: "Tempo Console" -seoTitle: "How to Use the Tempo Console | Docs" +seoTitle: "How to Use the Tempo Console | Tempo Docs" description: Use Tempo Console to create projects and API keys, switch environments, monitor usage, configure billing, and manage organization access in one place. ogImage: /og/2026-q4/og_2026-q4_docs_api-console_title-f5_v02.png --- diff --git a/src/pages/docs/api/console/projects-and-environments.mdx b/src/pages/docs/api/console/projects-and-environments.mdx index 931498d1b..70c946d50 100644 --- a/src/pages/docs/api/console/projects-and-environments.mdx +++ b/src/pages/docs/api/console/projects-and-environments.mdx @@ -1,6 +1,6 @@ --- title: "Managing projects and environments in the API Console" -seoTitle: "Tempo API Projects & Environments | Docs" +seoTitle: "Tempo API Projects & Environments | Tempo Docs" description: Organize Tempo API integrations into projects and keep production credentials, usage, billing, and sponsored transactions separate from sandbox activity. ogImage: /og/2026-q4/og_2026-q4_docs_api-console-projects-and-environments_title-f5_v02.png --- diff --git a/src/pages/docs/api/console/team.mdx b/src/pages/docs/api/console/team.mdx index 4890c5e32..707b7c498 100644 --- a/src/pages/docs/api/console/team.mdx +++ b/src/pages/docs/api/console/team.mdx @@ -1,6 +1,6 @@ --- title: "Managing teams and access in the API Console" -seoTitle: "Teams & Access in the API Console | Docs" +seoTitle: "Teams & Access in the API Console | Tempo Docs" description: Invite people to a Tempo API organization, assign owner, admin, or member roles, review pending invitations, and safely remove organization access when needed. ogImage: /og/2026-q4/og_2026-q4_docs_api-console-team_title-f5_v02.png --- diff --git a/src/pages/docs/api/errors.mdx b/src/pages/docs/api/errors.mdx index c5d729dc1..83755110e 100644 --- a/src/pages/docs/api/errors.mdx +++ b/src/pages/docs/api/errors.mdx @@ -1,6 +1,6 @@ --- title: "Tempo API errors and response format" -seoTitle: "API Errors & Response Format | Docs" +seoTitle: "API Errors & Response Format | Tempo Docs" description: How the Tempo API signals errors, including HTTP status codes, the error envelope, and the full catalog of machine-readable error codes. ogImage: /og/2026-q4/og_2026-q4_docs_api-errors_title-f5_v02.png --- diff --git a/src/pages/docs/api/faq.mdx b/src/pages/docs/api/faq.mdx index 8111df2b1..e2e45450c 100644 --- a/src/pages/docs/api/faq.mdx +++ b/src/pages/docs/api/faq.mdx @@ -1,5 +1,6 @@ --- title: Tempo API FAQ +seoTitle: Tempo API FAQ | Tempo Docs description: Answers to common Tempo API questions about hosted services, RPC, authentication, webhooks, asset routes, exchange quotes, and API endpoints. ogImage: /og/2026-q4/og_2026-q4_docs_api-faq_title-f5_v02.png --- diff --git a/src/pages/docs/api/fee-payer.mdx b/src/pages/docs/api/fee-payer.mdx index 69690d5e1..672091e0c 100644 --- a/src/pages/docs/api/fee-payer.mdx +++ b/src/pages/docs/api/fee-payer.mdx @@ -1,5 +1,6 @@ --- title: "Sponsor your users' fees" +seoTitle: "Tempo Fee Payer API: Sponsor User Fees | Tempo Docs" description: Pay network fees for your users with Tempo's hosted fee payer. Try the demo, create an API key, and send a sponsored transaction in three steps. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_api-fee-payer_title-f5_v02.png diff --git a/src/pages/docs/api/indexer-api.mdx b/src/pages/docs/api/indexer-api.mdx index 1376bf966..2f5347a27 100644 --- a/src/pages/docs/api/indexer-api.mdx +++ b/src/pages/docs/api/indexer-api.mdx @@ -1,5 +1,6 @@ --- title: "Tempo Indexer API: Query Blockchain Data with SQL" +seoTitle: "Tempo Indexer API: Query Chain Data with SQL | Tempo Docs" description: Query indexed Tempo blockchain data with read-only SQL over HTTP, including blocks, transactions, logs, receipts, balances, and DEX analytics. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_api-indexer-api_title-f5_v02.png diff --git a/src/pages/docs/api/json-rpc.mdx b/src/pages/docs/api/json-rpc.mdx index 5e2292eb2..6ded79125 100644 --- a/src/pages/docs/api/json-rpc.mdx +++ b/src/pages/docs/api/json-rpc.mdx @@ -1,5 +1,6 @@ --- title: "Tempo JSON-RPC API: Endpoints & Methods" +seoTitle: "Tempo JSON-RPC API: Endpoints and Methods | Tempo Docs" description: Connect to Tempo JSON-RPC from Viem, Wagmi, Foundry, or Rust for standard Ethereum methods and Tempo-specific blockchain access. ogImage: /og/2026-q4/og_2026-q4_docs_api-json-rpc_title-f5_v02.png --- diff --git a/src/pages/docs/api/rate-limits.mdx b/src/pages/docs/api/rate-limits.mdx index 49a7197ab..799e665e8 100644 --- a/src/pages/docs/api/rate-limits.mdx +++ b/src/pages/docs/api/rate-limits.mdx @@ -1,6 +1,6 @@ --- title: "Tempo API rate limits and quota structure" -seoTitle: "API Rate Limits & Quota Structure | Docs" +seoTitle: "API Rate Limits & Quota Structure | Tempo Docs" description: How the Tempo API rate limits requests, the headers it returns, and best practices for staying within quota. ogImage: /og/2026-q4/og_2026-q4_docs_api-rate-limits_title-f5_v02.png --- diff --git a/src/pages/docs/api/reference.mdx b/src/pages/docs/api/reference.mdx index 6509cc5a8..3c7171856 100644 --- a/src/pages/docs/api/reference.mdx +++ b/src/pages/docs/api/reference.mdx @@ -1,6 +1,6 @@ --- title: Tempo API Reference -seoTitle: "Tempo API Reference ⋅ Tempo Docs" +seoTitle: "Tempo API Reference | Tempo Docs" description: Browse every Tempo API endpoint for blockchain data, asset routes, exchange, webhooks, organizations, billing, MPP, MCP, and JSON-RPC requests and responses. ogImage: /og/2026-q4/og_2026-q4_docs_api-reference_title-f5_v02.png --- diff --git a/src/pages/docs/api/transactions.mdx b/src/pages/docs/api/transactions.mdx index 20eade026..19438af8f 100644 --- a/src/pages/docs/api/transactions.mdx +++ b/src/pages/docs/api/transactions.mdx @@ -1,7 +1,7 @@ --- title: "Working with transactions via the Tempo API" -seoTitle: "Tempo Transactions API Reference | Docs" -description: List and inspect transactions submitted to Tempo. +seoTitle: "Tempo Transactions API Reference | Tempo Docs" +description: List and inspect transactions submitted to Tempo, and query the token transfers each transaction produced. ogImage: /og/2026-q4/og_2026-q4_docs_api-transactions_title-f5_v02.png --- diff --git a/src/pages/docs/api/versioning-policy.mdx b/src/pages/docs/api/versioning-policy.mdx index 37555a049..3802ea76d 100644 --- a/src/pages/docs/api/versioning-policy.mdx +++ b/src/pages/docs/api/versioning-policy.mdx @@ -1,6 +1,6 @@ --- title: "Tempo API versioning policy" -seoTitle: "Tempo API Versioning Policy | Docs" +seoTitle: "Tempo API Versioning Policy | Tempo Docs" description: Learn how Tempo API versions, breaking changes, deprecations, and sunset notices work. ogImage: /og/2026-q4/og_2026-q4_docs_api-versioning-policy_title-f5_v02.png --- diff --git a/src/pages/docs/cli/api.mdx b/src/pages/docs/cli/api.mdx index 04deb1c72..38f2732cf 100644 --- a/src/pages/docs/cli/api.mdx +++ b/src/pages/docs/cli/api.mdx @@ -1,6 +1,6 @@ --- title: "tempo api" -seoTitle: "tempo api: CLI Reference | Tempo Docs" +seoTitle: "tempo api: Manage API Keys from the CLI | Tempo Docs" description: Sign in to the Tempo API from your terminal, create API keys, and call any Tempo API endpoint as a command. --- diff --git a/src/pages/docs/development/account-keychain.mdx b/src/pages/docs/development/account-keychain.mdx index 36840e7d0..2a227c6eb 100644 --- a/src/pages/docs/development/account-keychain.mdx +++ b/src/pages/docs/development/account-keychain.mdx @@ -1,7 +1,7 @@ --- title: Account Keychain -seoTitle: Tempo Account Keychain Access Keys, Spending Limits, and Scopes | Tempo Docs -description: The rules Tempo enforces on access keys, covering key types, TIP-20 spending limits, expiry, call scopes, authorization, the 0x04 signature, revocation, and admin keys. +seoTitle: Account Keychain Rules for Access Keys | Tempo Docs +description: "The rules Tempo enforces on access keys: key types, TIP-20 spending limits, expiry, call scopes, the 0x04 signature, revocation, and admin keys." --- import { AccountDiagram } from '../../../components/AccountDiagram' diff --git a/src/pages/docs/development/configurable-accounts.mdx b/src/pages/docs/development/configurable-accounts.mdx index f59a9c879..39152a753 100644 --- a/src/pages/docs/development/configurable-accounts.mdx +++ b/src/pages/docs/development/configurable-accounts.mdx @@ -1,7 +1,7 @@ --- title: Configurable accounts -seoTitle: Tempo Configurable Accounts, Owners, Thresholds, and Multisig Signatures | Tempo Docs -description: Control one Tempo address with weighted owner keys and a threshold, approve with 0x05 multisig signatures, change owners without moving funds, and verify approvals onchain. +seoTitle: Tempo Configurable Accounts and Multisig Rules | Tempo Docs +description: Control one Tempo address with weighted owner keys and a threshold, approve with 0x05 multisig signatures, and change owners without moving funds. --- import { AccountDiagram } from '../../../components/AccountDiagram' diff --git a/src/pages/docs/development/single-key-accounts.mdx b/src/pages/docs/development/single-key-accounts.mdx index 9a2a7e6c9..b52140668 100644 --- a/src/pages/docs/development/single-key-accounts.mdx +++ b/src/pages/docs/development/single-key-accounts.mdx @@ -1,6 +1,6 @@ --- title: Single-key accounts -seoTitle: Tempo Single-Key Accounts, Root Keys, and In-Place Upgrades | Tempo Docs +seoTitle: Tempo Single-Key Accounts and Root Keys | Tempo Docs description: Derive a Tempo address from one secp256k1, P-256, or WebAuthn key, sign and authorize access keys with it, and upgrade to weighted owners at the same address. --- diff --git a/src/pages/docs/guide/bridge-layerzero.mdx b/src/pages/docs/guide/bridge-layerzero.mdx index bf1cd20fb..038b9e9e0 100644 --- a/src/pages/docs/guide/bridge-layerzero.mdx +++ b/src/pages/docs/guide/bridge-layerzero.mdx @@ -1,6 +1,6 @@ --- title: "Bridging stablecoins and USDT0 via LayerZero" -seoTitle: "Bridge via LayerZero: USDT0 & More | Docs" +seoTitle: "Bridge via LayerZero: USDT0 & More | Tempo Docs" description: Bridge tokens to and from Tempo using LayerZero. Covers Stargate pools and standard OFT adapters with cast commands and TypeScript examples. ogImage: /og/2026-q4/og_2026-q4_docs_guide-bridge-layerzero_title-f5_v02.png --- diff --git a/src/pages/docs/guide/issuance/index.mdx b/src/pages/docs/guide/issuance/index.mdx index 4125dcdfa..afc01845b 100644 --- a/src/pages/docs/guide/issuance/index.mdx +++ b/src/pages/docs/guide/issuance/index.mdx @@ -1,6 +1,6 @@ --- title: "Stablecoin issuance using the TIP-20 standard" -seoTitle: "Stablecoin Issuance with TIP-20 | Docs" +seoTitle: "Stablecoin Issuance with TIP-20 | Tempo Docs" description: Create and manage your own stablecoin on Tempo. Issue tokens, manage supply, and integrate with Tempo's payment infrastructure. ogImage: /og/2026-q4/og_2026-q4_docs_guide-issuance_title-f5_v02.png --- diff --git a/src/pages/docs/guide/issuance/manage-stablecoin.mdx b/src/pages/docs/guide/issuance/manage-stablecoin.mdx index f7031e80b..551fa1378 100644 --- a/src/pages/docs/guide/issuance/manage-stablecoin.mdx +++ b/src/pages/docs/guide/issuance/manage-stablecoin.mdx @@ -1,6 +1,6 @@ --- title: "Managing your TIP-20 stablecoin" -seoTitle: "Manage Your TIP-20 Stablecoin | Docs" +seoTitle: "Manage Your TIP-20 Stablecoin | Tempo Docs" description: Configure stablecoin permissions, supply limits, and compliance policies. Grant roles, set transfer policies, and control pause/unpause functionality. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_guide-issuance-manage-stablecoin_title-f5_v02.png diff --git a/src/pages/docs/guide/node/consensus-and-dkg.mdx b/src/pages/docs/guide/node/consensus-and-dkg.mdx index 0c16b1fc6..6de56069a 100644 --- a/src/pages/docs/guide/node/consensus-and-dkg.mdx +++ b/src/pages/docs/guide/node/consensus-and-dkg.mdx @@ -1,6 +1,6 @@ --- title: Consensus, DKG, and network identity -description: Learn how Tempo validators share a threshold signing key through DKG, how nodes verify finalizations with the network identity, and what to do when the identity rotates. +description: Learn how Tempo validators share a threshold signing key through DKG, how nodes verify finalizations, and what to do when the network identity rotates. ogImage: /og/2026-q4/og_2026-q4_docs_guide-node-consensus-and-dkg_title-f5_v02.png --- diff --git a/src/pages/docs/guide/node/installation.mdx b/src/pages/docs/guide/node/installation.mdx index d9383eadb..6e673bc24 100644 --- a/src/pages/docs/guide/node/installation.mdx +++ b/src/pages/docs/guide/node/installation.mdx @@ -1,6 +1,6 @@ --- title: "Install and configure a Tempo node" -seoTitle: "Install & Configure a Tempo Node | Docs" +seoTitle: "Install & Configure a Tempo Node | Tempo Docs" description: Install Tempo node using pre-built binaries, build from source with Rust, or run with Docker. Get started in minutes with tempoup. ogImage: /og/2026-q4/og_2026-q4_docs_guide-node-installation_title-f5_v02.png --- diff --git a/src/pages/docs/guide/node/upgrade-cadence.mdx b/src/pages/docs/guide/node/upgrade-cadence.mdx index 8525962f4..8c7d30aca 100644 --- a/src/pages/docs/guide/node/upgrade-cadence.mdx +++ b/src/pages/docs/guide/node/upgrade-cadence.mdx @@ -1,6 +1,6 @@ --- title: "Upgrade cadence and rollout timeline" -seoTitle: "Upgrade Cadence & Rollout Timeline | Docs" +seoTitle: "Upgrade Cadence & Rollout Timeline | Tempo Docs" description: How Tempo schedules and communicates network upgrades, including timelines, notification windows, and what to expect as a node operator. ogImage: /og/2026-q4/og_2026-q4_docs_guide-node-upgrade-cadence_title-f5_v02.png --- diff --git a/src/pages/docs/guide/node/validator-setup.mdx b/src/pages/docs/guide/node/validator-setup.mdx index 92b10cbd3..da3afca32 100644 --- a/src/pages/docs/guide/node/validator-setup.mdx +++ b/src/pages/docs/guide/node/validator-setup.mdx @@ -1,6 +1,6 @@ --- title: "Validator onboarding" -seoTitle: "Tempo Validator Onboarding | Docs" +seoTitle: "Tempo Validator Onboarding | Tempo Docs" description: Generate signing keys and run your Tempo validator node for the first time. ogImage: /og/2026-q4/og_2026-q4_docs_guide-node-validator-setup_title-f5_v02.png --- diff --git a/src/pages/docs/guide/node/validator-troubleshooting.mdx b/src/pages/docs/guide/node/validator-troubleshooting.mdx index 7082d4f00..6c6651242 100644 --- a/src/pages/docs/guide/node/validator-troubleshooting.mdx +++ b/src/pages/docs/guide/node/validator-troubleshooting.mdx @@ -1,6 +1,6 @@ --- title: "Tempo validator troubleshooting and FAQ" -seoTitle: "Tempo Validator Troubleshooting & FAQ | Docs" +seoTitle: "Tempo Validator Troubleshooting & FAQ | Tempo Docs" description: Common issues and solutions for Tempo validator operators. ogImage: /og/2026-q4/og_2026-q4_docs_guide-node-validator-troubleshooting_title-f5_v02.png --- diff --git a/src/pages/docs/guide/node/validator.mdx b/src/pages/docs/guide/node/validator.mdx index bad4dea44..af4c22e57 100644 --- a/src/pages/docs/guide/node/validator.mdx +++ b/src/pages/docs/guide/node/validator.mdx @@ -1,6 +1,6 @@ --- title: Running a Validator Node -description: Overview of running a Tempo validator node. +description: Set up, monitor, and operate a Tempo validator node, from initial registration and keys to status checks and network topology. ogImage: /og/2026-q4/og_2026-q4_docs_guide-node-validator_title-f5_v02.png --- diff --git a/src/pages/docs/guide/payments/send-a-payment.mdx b/src/pages/docs/guide/payments/send-a-payment.mdx index 28a58c723..4e58f0226 100644 --- a/src/pages/docs/guide/payments/send-a-payment.mdx +++ b/src/pages/docs/guide/payments/send-a-payment.mdx @@ -120,7 +120,7 @@ tx_hash = w3.eth.send_raw_transaction(signed_tx.encode()) :::: -See [Payment references](/docs/guide/payments/transfer-memos) for encoding rules and reconciliation. +See [Transfer memos](/docs/guide/payments/transfer-memos) for encoding rules and reconciliation. diff --git a/src/pages/docs/guide/payments/send-a-payment/examples.mdx b/src/pages/docs/guide/payments/send-a-payment/examples.mdx index c8c011d50..0486c3dc8 100644 --- a/src/pages/docs/guide/payments/send-a-payment/examples.mdx +++ b/src/pages/docs/guide/payments/send-a-payment/examples.mdx @@ -264,7 +264,7 @@ Send a payment using the standard `transfer` function. The Solidity examples are ## Add a payment reference -Include a memo for payment reconciliation and tracking. Use a short invoice or order ID. Follow [Payment references](/docs/guide/payments/transfer-memos#encode-a-payment-reference) for the shared UTF-8 encoding and length checks. +Include a memo for payment reconciliation and tracking. Use a short invoice or order ID. Follow [Transfer memos](/docs/guide/payments/transfer-memos#encode-a-payment-reference) for the shared UTF-8 encoding and length checks. diff --git a/src/pages/docs/guide/payments/transfer-memos.mdx b/src/pages/docs/guide/payments/transfer-memos.mdx index c2c638f9d..c768c6e3c 100644 --- a/src/pages/docs/guide/payments/transfer-memos.mdx +++ b/src/pages/docs/guide/payments/transfer-memos.mdx @@ -1,6 +1,6 @@ --- -title: Payment references -seoTitle: Payment References and Transfer Memos | Tempo Docs +title: Transfer memos +seoTitle: Transfer Memos for Payment References | Tempo Docs interactive: true description: Attach a 32-byte memo to a TIP-20 payment and use transfer events to match it to a customer, invoice, or order. ogImage: /og/2026-q4/og_2026-q4_docs_guide-payments-transfer-memos_title-f5_v02.png @@ -14,7 +14,7 @@ import { SendPaymentWithMemo } from '../../../../components/guides/steps/payment -# Payment references +# Transfer memos Attach a 32-byte transfer memo to a [TIP-20 payment](/get-started/stablecoins) to identify an invoice, order, or customer record. Store the reference with your payment record, then match it to confirmed transfer events. diff --git a/src/pages/docs/guide/private-zones/connect-to-a-zone.mdx b/src/pages/docs/guide/private-zones/connect-to-a-zone.mdx index d1235dfae..2cb9f1e12 100644 --- a/src/pages/docs/guide/private-zones/connect-to-a-zone.mdx +++ b/src/pages/docs/guide/private-zones/connect-to-a-zone.mdx @@ -1,6 +1,6 @@ --- title: Connect to the Sandbox -seoTitle: "Connect to a Tempo Zone on Testnet | Docs" +seoTitle: "Connect to a Tempo Zone on Testnet | Tempo Docs" description: Connect to Tempo Zones on testnet using Zone A and Zone B RPC URLs, chain IDs, and a minimal viem client setup for private flows. ogImage: /og/2026-q4/og_2026-q4_docs_guide-private-zones-connect-to-a-zone_title-f5_v02.png --- diff --git a/src/pages/docs/guide/private-zones/deposit-to-a-zone.mdx b/src/pages/docs/guide/private-zones/deposit-to-a-zone.mdx index 0ba7ee23d..f3cfb91fd 100644 --- a/src/pages/docs/guide/private-zones/deposit-to-a-zone.mdx +++ b/src/pages/docs/guide/private-zones/deposit-to-a-zone.mdx @@ -1,6 +1,6 @@ --- title: Deposit OUSD -seoTitle: "Deposit OUSD to a Tempo Zone on Testnet | Docs" +seoTitle: "Deposit OUSD to a Tempo Zone on Testnet | Tempo Docs" description: Deposit OUSD from your Tempo balance into Zone A and confirm the resulting Zone balance. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_guide-private-zones-deposit-to-a-zone_title-f5_v02.png diff --git a/src/pages/docs/guide/private-zones/withdraw-from-a-zone.mdx b/src/pages/docs/guide/private-zones/withdraw-from-a-zone.mdx index 28caacbc2..57ef563a6 100644 --- a/src/pages/docs/guide/private-zones/withdraw-from-a-zone.mdx +++ b/src/pages/docs/guide/private-zones/withdraw-from-a-zone.mdx @@ -1,6 +1,6 @@ --- title: Withdraw OUSD -seoTitle: "Withdraw OUSD from a Tempo Zone on Testnet | Docs" +seoTitle: "Withdraw OUSD from a Tempo Zone on Testnet | Tempo Docs" description: Withdraw OUSD from Zone A back to your Tempo balance with a direct withdrawal through the Zone outbox. interactive: true ogImage: /og/2026-q4/og_2026-q4_docs_guide-private-zones-withdraw-from-a-zone_title-f5_v02.png diff --git a/src/pages/docs/partners/explorers-and-debugging.mdx b/src/pages/docs/partners/explorers-and-debugging.mdx index a92c634ad..8a5b4ef33 100644 --- a/src/pages/docs/partners/explorers-and-debugging.mdx +++ b/src/pages/docs/partners/explorers-and-debugging.mdx @@ -1,6 +1,6 @@ --- title: "Block explorers: using the Tempo Explorer" -seoTitle: "Tempo Explorer: Browse Block Data | Docs" +seoTitle: "Tempo Explorer: Browse Block Data | Tempo Docs" description: View transactions, blocks, accounts, and token activity on the Tempo network with block explorers. ogImage: /og/2026-q4/og_2026-q4_docs_partners-explorers-and-debugging_title-image_v02.jpg --- diff --git a/src/pages/docs/partners/stablecoins.mdx b/src/pages/docs/partners/stablecoins.mdx index d96671054..354dc3dd6 100644 --- a/src/pages/docs/partners/stablecoins.mdx +++ b/src/pages/docs/partners/stablecoins.mdx @@ -1,5 +1,5 @@ --- -title: "Stablecoins" +title: "Stablecoin issuers" seoTitle: "Stablecoins and Issuers on Tempo | Tempo Docs" description: Find stablecoin assets and issuers on Tempo, then connect token metadata, funding, and payments to your application. ogImage: /og/2026-q4/og_2026-q4_docs_partners-stablecoins_title-image_v02.jpg @@ -9,7 +9,7 @@ import { partnerLogo, partnerLogoOpenUsdOusd, partnerLogoAllunity } from '../../ import { Cards, Card } from 'vocs' -# Stablecoins +# Stablecoin issuers Choose a stablecoin for the currencies and payment flows your application supports. Start with OUSD for USD balances and payments, or choose an asset that matches your funding source and settlement currency. For tokenized Treasuries and other yield-bearing assets, see [RWAs](/docs/partners/rwas). diff --git a/src/pages/docs/partners/wallets.mdx b/src/pages/docs/partners/wallets.mdx index f7caf7be5..6749915ec 100644 --- a/src/pages/docs/partners/wallets.mdx +++ b/src/pages/docs/partners/wallets.mdx @@ -1,6 +1,6 @@ --- -title: "Wallets" -seoTitle: "Embedded & External Wallets | Tempo Docs" +title: "Wallet providers" +seoTitle: "Embedded and External Wallet Providers | Tempo Docs" description: Integrate embedded, custodial, and institutional wallet infrastructure into your Tempo application. ogImage: /og/2026-q4/og_2026-q4_docs_partners-wallets_title-image_v02.jpg --- @@ -9,7 +9,7 @@ import { partnerLogo, partnerLogoBlockradar, partnerLogoCrossmint, partnerLogoDy -# Wallets +# Wallet providers Choose how users connect accounts and how signing keys are managed. The providers below cover embedded wallets, custody, self-custodial wallets, and agent wallets. diff --git a/src/pages/docs/payments.mdx b/src/pages/docs/payments.mdx index 5d27d3919..e4794227e 100644 --- a/src/pages/docs/payments.mdx +++ b/src/pages/docs/payments.mdx @@ -45,7 +45,7 @@ Payments are part of [Accounts](/docs/accounts). Start with the [quickstart](/ge Choose the payment reference that fits your application: -- **[Payment references](/docs/guide/payments/transfer-memos)** use a 32-byte transfer memo to identify a payment. Use a memo to match a transfer to an invoice, order, or other record. +- **[Transfer memos](/docs/guide/payments/transfer-memos)** use a 32-byte transfer memo to identify a payment. Use a memo to match a transfer to an invoice, order, or other record. - **[Customer deposit addresses](/docs/guide/payments/virtual-addresses)** give each customer a distinct virtual address. Deposits credit one registered account, while transfer events preserve the address needed to identify the customer. These deposit addresses receive TIP-20 payments on Tempo. To receive funds from another network, use [Routes deposit addresses](/docs/routes/deposits). diff --git a/src/pages/docs/protocol/blockspace/consensus.mdx b/src/pages/docs/protocol/blockspace/consensus.mdx index 0135e4344..2297bf3c2 100644 --- a/src/pages/docs/protocol/blockspace/consensus.mdx +++ b/src/pages/docs/protocol/blockspace/consensus.mdx @@ -1,6 +1,6 @@ --- title: "Consensus and finality using Simplex BFT" -seoTitle: "Consensus & Finality: Simplex BFT | Docs" +seoTitle: "Consensus & Finality: Simplex BFT | Tempo Docs" description: "Tempo uses Simplex BFT via Commonware for deterministic sub-second finality with Byzantine fault tolerance." ogImage: /og/2026-q4/og_2026-q4_docs_protocol-blockspace-consensus_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/exchange/executing-swaps.mdx b/src/pages/docs/protocol/exchange/executing-swaps.mdx index b09618fdf..83b48d0b1 100644 --- a/src/pages/docs/protocol/exchange/executing-swaps.mdx +++ b/src/pages/docs/protocol/exchange/executing-swaps.mdx @@ -1,6 +1,6 @@ --- title: "Executing swaps | Protocol reference" -seoTitle: "Executing Swaps: Protocol Reference | Docs" +seoTitle: "Executing Swaps: Protocol Reference | Tempo Docs" description: Learn how to execute swaps and quote prices on Tempo's Stablecoin DEX with exact-in and exact-out swap functions and slippage protection. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-exchange-executing-swaps_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/exchange/index.mdx b/src/pages/docs/protocol/exchange/index.mdx index 21a284a2c..e5059bca7 100644 --- a/src/pages/docs/protocol/exchange/index.mdx +++ b/src/pages/docs/protocol/exchange/index.mdx @@ -1,6 +1,6 @@ --- title: "Exchanging stablecoins: DEX vs. Fee AMM" -seoTitle: "DEX vs. Fee AMM for Stablecoins | Docs" +seoTitle: "DEX vs. Fee AMM for Stablecoins | Tempo Docs" description: Tempo's enshrined decentralized exchange for trading between stablecoins with optimal pricing, limit orders, and flip orders for liquidity provision. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-exchange_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/exchange/providing-liquidity.mdx b/src/pages/docs/protocol/exchange/providing-liquidity.mdx index 6cc6a0e38..57752ad3a 100644 --- a/src/pages/docs/protocol/exchange/providing-liquidity.mdx +++ b/src/pages/docs/protocol/exchange/providing-liquidity.mdx @@ -1,6 +1,6 @@ --- title: "Providing liquidity | Protocol reference" -seoTitle: "Providing Liquidity: Protocol Reference | Docs" +seoTitle: "Providing Liquidity: Protocol Reference | Tempo Docs" description: Provide liquidity on Tempo's DEX using limit orders and flip orders. Earn spreads while facilitating stablecoin trades with price-time priority. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-exchange-providing-liquidity_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/fees/fee-amm/index.mdx b/src/pages/docs/protocol/fees/fee-amm/index.mdx index 03d16e261..1d31177cc 100644 --- a/src/pages/docs/protocol/fees/fee-amm/index.mdx +++ b/src/pages/docs/protocol/fees/fee-amm/index.mdx @@ -1,6 +1,6 @@ --- title: "Fee AMM overview: converting stablecoin fees" -seoTitle: "How the Tempo Fee AMM Converts Fees | Docs" +seoTitle: "How the Tempo Fee AMM Converts Fees | Tempo Docs" description: Understand how the Fee AMM automatically converts transaction fees between stablecoins, enabling users to pay in any supported token. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-fees-fee-amm_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/fees/index.mdx b/src/pages/docs/protocol/fees/index.mdx index a36b922bd..b9478038a 100644 --- a/src/pages/docs/protocol/fees/index.mdx +++ b/src/pages/docs/protocol/fees/index.mdx @@ -1,6 +1,6 @@ --- title: "Understanding transaction fees on Tempo" -seoTitle: "How Transaction Fees Work on Tempo | Docs" +seoTitle: "How Transaction Fees Work on Tempo | Tempo Docs" description: Choose a supported USD-denominated TIP-20 token for transaction fees, configure sponsorship, and understand fee conversion. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-fees_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/fees/spec-fee-amm.mdx b/src/pages/docs/protocol/fees/spec-fee-amm.mdx index cab232468..c1025206d 100644 --- a/src/pages/docs/protocol/fees/spec-fee-amm.mdx +++ b/src/pages/docs/protocol/fees/spec-fee-amm.mdx @@ -1,6 +1,6 @@ --- title: "Fee AMM specification: how fee conversion works" -seoTitle: "Tempo Fee AMM Specification | Docs" +seoTitle: "Tempo Fee AMM Specification | Tempo Docs" description: Technical specification for the Fee AMM enabling automatic stablecoin conversion for transaction fees with fixed-rate swaps and liquidity accounting. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-fees-spec-fee-amm_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/index.mdx b/src/pages/docs/protocol/index.mdx index 63431874d..61e3ca567 100644 --- a/src/pages/docs/protocol/index.mdx +++ b/src/pages/docs/protocol/index.mdx @@ -1,6 +1,6 @@ --- title: "Specifications" -seoTitle: "Tempo Protocol Specifications | Docs" +seoTitle: "Tempo Protocol Specifications | Tempo Docs" description: Read Tempo protocol references for tokens, policies, fees, transactions, blockspace, exchange, zones, network upgrades, TIP specs, and implementation details. ogImage: /og/2026-q4/og_2026-q4_docs_protocol_linework-000_v02.png --- diff --git a/src/pages/docs/protocol/rpc/index.mdx b/src/pages/docs/protocol/rpc/index.mdx index c783cbce3..5d0aa971d 100644 --- a/src/pages/docs/protocol/rpc/index.mdx +++ b/src/pages/docs/protocol/rpc/index.mdx @@ -1,6 +1,6 @@ --- title: "Tempo RPC reference: the tempo_ namespace" -seoTitle: "Tempo RPC Reference: tempo_ Namespace | Docs" +seoTitle: "Tempo RPC Reference: tempo_ Namespace | Tempo Docs" description: Reference for Tempo-specific JSON-RPC methods in the tempo, consensus, and admin namespaces, plus modified eth_ behavior. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-rpc_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/tip20/overview.mdx b/src/pages/docs/protocol/tip20/overview.mdx index acb447ed9..0c7ed6250 100644 --- a/src/pages/docs/protocol/tip20/overview.mdx +++ b/src/pages/docs/protocol/tip20/overview.mdx @@ -1,6 +1,6 @@ --- title: "TIP-20 tokens: A stablecoin-native standard" -seoTitle: "TIP-20: Stablecoin-Native Tokens | Docs" +seoTitle: "TIP-20: Stablecoin-Native Tokens | Tempo Docs" description: TIP-20 tokens are Tempo's native token standard for stablecoins with built-in fee payment, payment lanes, transfer memos, and compliance policies. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-tip20-overview_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/tips/tip-1002.mdx b/src/pages/docs/protocol/tips/tip-1002.mdx index 37a8d5c95..ec260f042 100644 --- a/src/pages/docs/protocol/tips/tip-1002.mdx +++ b/src/pages/docs/protocol/tips/tip-1002.mdx @@ -1,7 +1,8 @@ --- id: TIP-1002 title: Prevent crossed orders and allow same-tick flip orders -description: Changes to the Stablecoin DEX that prevent placing orders that would cross existing orders on the opposite side of the book, and allow flip orders to flip to the same tick. +seoTitle: "TIP-1002: Prevent Crossed DEX Orders | Tempo Docs" +description: Changes the Stablecoin DEX to prevent orders that cross existing orders on the opposite side of the book, and allows flip orders to flip to the same tick. authors: Dan Robinson status: Draft ogImage: /og/2026-q4/og_2026-q4_docs_protocol-tips-tip-1002_title-f5_v02.png diff --git a/src/pages/docs/protocol/tips/tip-1007.mdx b/src/pages/docs/protocol/tips/tip-1007.mdx index 2d7508ea1..025dea4a1 100644 --- a/src/pages/docs/protocol/tips/tip-1007.mdx +++ b/src/pages/docs/protocol/tips/tip-1007.mdx @@ -1,7 +1,7 @@ --- id: TIP-1007 title: Fee Token Introspection -description: Addition of fee token introspection functionality to the FeeManager precompile, enabling smart contracts to query the fee token being used for the current transaction. +description: Adds fee token introspection to the FeeManager precompile so smart contracts can query the fee token used by the current transaction. authors: Georgios Konstantopoulos status: In Review related: N/A diff --git a/src/pages/docs/protocol/tips/tip-1016.mdx b/src/pages/docs/protocol/tips/tip-1016.mdx index 8cb883c90..d67f96fa9 100644 --- a/src/pages/docs/protocol/tips/tip-1016.mdx +++ b/src/pages/docs/protocol/tips/tip-1016.mdx @@ -1,7 +1,7 @@ --- id: TIP-1016 title: Exempt Storage Creation from Gas Limits -description: Storage creation gas costs are charged but don't count against transaction or block gas limits, using a reservoir model aligned with EIP-8037 for correct GAS opcode semantics and EVM compatibility. +description: Charges storage creation gas without counting it against transaction or block gas limits, using a reservoir model aligned with EIP-8037. authors: Dankrad Feist @dankrad status: Backlog related: TIP-1000, TIP-1010, EIP-8037, EIP-8011, EIP-7825, EIP-7623 diff --git a/src/pages/docs/protocol/tips/tip-1031.mdx b/src/pages/docs/protocol/tips/tip-1031.mdx index a1739bfa3..6ac9049bc 100644 --- a/src/pages/docs/protocol/tips/tip-1031.mdx +++ b/src/pages/docs/protocol/tips/tip-1031.mdx @@ -1,7 +1,7 @@ --- id: TIP-1031 title: Embed consensus context in the block Header -description: Embed consensus context into the block header +description: Adds consensus context (epoch, view, parent view, and proposer) as a trailing optional field in the Tempo block header. authors: Hamdi, Janis status: Approved related: N/A diff --git a/src/pages/docs/protocol/tips/tip-1047.mdx b/src/pages/docs/protocol/tips/tip-1047.mdx index 43cf9173f..b1c6dcc3c 100644 --- a/src/pages/docs/protocol/tips/tip-1047.mdx +++ b/src/pages/docs/protocol/tips/tip-1047.mdx @@ -1,6 +1,7 @@ --- id: TIP-1047 title: Revert code creation and set code at addresses with TIP-20 prefix +seoTitle: "TIP-1047: Block Code at TIP-20 Prefix Addresses | Tempo Docs" description: Reject contract creation and EIP-7702 delegations that produce addresses in the TIP-20 reserved prefix range authors: Howy (@howydev) status: Draft diff --git a/src/pages/docs/protocol/transactions/eip-4337.mdx b/src/pages/docs/protocol/transactions/eip-4337.mdx index 168fe13c3..d391e0fe6 100644 --- a/src/pages/docs/protocol/transactions/eip-4337.mdx +++ b/src/pages/docs/protocol/transactions/eip-4337.mdx @@ -1,6 +1,6 @@ --- title: "Comparing Tempo Transactions and EIP-4337" -seoTitle: "Tempo Transactions vs. EIP-4337 | Docs" +seoTitle: "Tempo Transactions vs. EIP-4337 | Tempo Docs" description: "How Tempo Transactions achieve EIP-4337 goals without bundlers, paymasters, or EntryPoint contracts." ogImage: /og/2026-q4/og_2026-q4_docs_protocol-transactions-eip-4337_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/transactions/eip-7702.mdx b/src/pages/docs/protocol/transactions/eip-7702.mdx index 236c44787..66859a3e5 100644 --- a/src/pages/docs/protocol/transactions/eip-7702.mdx +++ b/src/pages/docs/protocol/transactions/eip-7702.mdx @@ -1,6 +1,6 @@ --- title: "Comparing Tempo Transactions and EIP-7702" -seoTitle: "Tempo Transactions vs. EIP-7702 | Docs" +seoTitle: "Tempo Transactions vs. EIP-7702 | Tempo Docs" description: "How Tempo Transactions extend EIP-7702 delegation with additional signature schemes and native features." ogImage: /og/2026-q4/og_2026-q4_docs_protocol-transactions-eip-7702_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/upgrades/t12.mdx b/src/pages/docs/protocol/upgrades/t12.mdx index bcd020b10..e78fddb80 100644 --- a/src/pages/docs/protocol/upgrades/t12.mdx +++ b/src/pages/docs/protocol/upgrades/t12.mdx @@ -1,7 +1,7 @@ --- title: "T12 Network Upgrade" seoTitle: "T12 Network Upgrade | Tempo Docs" -description: T12 adds configurable nonces for parallel expiring transactions, enables MPP sessions with closed-loop stablecoins, restores compatibility with calldata suffixes, aligns quote and swap calculations, and adds authorized burns for TIP-20 tokens. +description: T12 adds configurable nonces for parallel expiring transactions, MPP sessions with closed-loop stablecoins, authorized TIP-20 burns, and quote and swap fixes. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-upgrades-t12_linework-000_v02.png --- diff --git a/src/pages/docs/protocol/upgrades/t13.mdx b/src/pages/docs/protocol/upgrades/t13.mdx index f2ec69b34..21699e352 100644 --- a/src/pages/docs/protocol/upgrades/t13.mdx +++ b/src/pages/docs/protocol/upgrades/t13.mdx @@ -1,7 +1,7 @@ --- title: "T13 Network Upgrade" seoTitle: "T13 Network Upgrade | Tempo Docs" -description: T13 ships the Zone prover with Nitro-backed settlement verification, multi-block Tempo imports for Zones, explicit block system calls, and an OUSD fee-token fallback. +description: T13 ships the Zone prover with Nitro-backed settlement verification, multi-block Tempo imports for Zones, explicit block system calls, and an OUSD fee fallback. --- import { ZoneDiagram } from '../../../../components/ZoneDiagram' diff --git a/src/pages/docs/protocol/upgrades/t14.mdx b/src/pages/docs/protocol/upgrades/t14.mdx index 2a73f8be5..6412d5af1 100644 --- a/src/pages/docs/protocol/upgrades/t14.mdx +++ b/src/pages/docs/protocol/upgrades/t14.mdx @@ -1,7 +1,7 @@ --- title: "T14 Network Upgrade" seoTitle: "T14 Network Upgrade | Tempo Docs" -description: T14 upgrades the Account Keychain so accounts on Tempo support multiple signers, with approval thresholds, key rotation, and recovery at the same address. It also ends admin access keys' key management and tightens validator, consensus, and Zone Portal rules. +description: T14 lets Tempo accounts use multiple signers with thresholds, key rotation, and recovery at the same address, and tightens validator, consensus, and Zone rules. --- # T14 Network Upgrade diff --git a/src/pages/docs/protocol/upgrades/t2.mdx b/src/pages/docs/protocol/upgrades/t2.mdx index 030049112..212a5d053 100644 --- a/src/pages/docs/protocol/upgrades/t2.mdx +++ b/src/pages/docs/protocol/upgrades/t2.mdx @@ -1,6 +1,6 @@ --- title: T2 Network Upgrade -description: Details and timeline for the T2 network upgrade including compound transfer policies, Validator Config V2, permit support for TIP-20, and audit-driven bug fixes. +description: "Details and timeline for the T2 network upgrade: compound transfer policies, Validator Config V2, TIP-20 permit support, and audit-driven bug fixes." ogImage: /og/2026-q4/og_2026-q4_docs_protocol-upgrades-t2_linework-000_v02.png --- diff --git a/src/pages/docs/protocol/upgrades/t7.mdx b/src/pages/docs/protocol/upgrades/t7.mdx index cf291d79a..d0d8b1c87 100644 --- a/src/pages/docs/protocol/upgrades/t7.mdx +++ b/src/pages/docs/protocol/upgrades/t7.mdx @@ -1,6 +1,6 @@ --- title: T7 Network Upgrade -description: Partner-focused overview and activation status for the T7 network upgrade, including storage savings, payment-channel savings, dynamic base fee behavior, and TIP-20 rewards deprecation. +description: Activation status for the T7 network upgrade, including storage savings, payment-channel savings, dynamic base fee behavior, and TIP-20 rewards deprecation. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-upgrades-t7_linework-000_v02.png --- diff --git a/src/pages/docs/protocol/zones/accounts.mdx b/src/pages/docs/protocol/zones/accounts.mdx index 0847f80af..d6bad94c7 100644 --- a/src/pages/docs/protocol/zones/accounts.mdx +++ b/src/pages/docs/protocol/zones/accounts.mdx @@ -1,6 +1,6 @@ --- title: Accounts and Privacy -seoTitle: "Accounts & Private Balances in Tempo Zones | Docs" +seoTitle: "Accounts & Private Balances in Tempo Zones | Tempo Docs" description: Account-scoped access control on Tempo Zones, including private balances, private allowances, and the two-layer privacy model. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-zones-accounts_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/zones/bridging.mdx b/src/pages/docs/protocol/zones/bridging.mdx index e90ade25d..c03a79d38 100644 --- a/src/pages/docs/protocol/zones/bridging.mdx +++ b/src/pages/docs/protocol/zones/bridging.mdx @@ -1,6 +1,6 @@ --- title: Bridging -seoTitle: "Zone Bridging: Deposits & Withdrawals | Docs" +seoTitle: "Zone Bridging: Deposits & Withdrawals | Tempo Docs" description: Deposit and withdraw TIP-20 tokens between Tempo and a Zone, including encrypted deposits and composable withdrawal callbacks. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-zones-bridging_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/zones/execution.mdx b/src/pages/docs/protocol/zones/execution.mdx index bd08675a9..ae7ce3d68 100644 --- a/src/pages/docs/protocol/zones/execution.mdx +++ b/src/pages/docs/protocol/zones/execution.mdx @@ -1,6 +1,6 @@ --- title: Execution and Gas -seoTitle: "Execution & Gas in Tempo Zones | Docs" +seoTitle: "Execution & Gas in Tempo Zones | Tempo Docs" description: Specification for gas accounting, fee tokens, fixed TIP-20 gas costs, contract creation limits, and token management on Tempo Zones. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-zones-execution_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/zones/index.mdx b/src/pages/docs/protocol/zones/index.mdx index 7253fd617..b3d960c33 100644 --- a/src/pages/docs/protocol/zones/index.mdx +++ b/src/pages/docs/protocol/zones/index.mdx @@ -1,6 +1,6 @@ --- title: "How Zones Work" -seoTitle: "Tempo Zones | Docs" +seoTitle: "Tempo Zones Protocol: How Zones Work | Tempo Docs" description: Learn how Tempo Zones keep stablecoin balances and account activity private while connecting to Tempo for deposits, withdrawals, settlement, and liquidity. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-zones_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/zones/proving.mdx b/src/pages/docs/protocol/zones/proving.mdx index 1a71bca04..c351ff415 100644 --- a/src/pages/docs/protocol/zones/proving.mdx +++ b/src/pages/docs/protocol/zones/proving.mdx @@ -1,6 +1,6 @@ --- title: Proving and Settlement -seoTitle: "Tempo Zone Proving & Settlement | Docs" +seoTitle: "Tempo Zone Proving & Settlement | Tempo Docs" description: Understand Tempo Zone settlement certificates, stateless execution validation, the Nitro enclave service, and the current onchain verification limits. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-zones-proving_title-f5_v02.png --- diff --git a/src/pages/docs/protocol/zones/rpc.mdx b/src/pages/docs/protocol/zones/rpc.mdx index d7ec7cc13..011d39c9f 100644 --- a/src/pages/docs/protocol/zones/rpc.mdx +++ b/src/pages/docs/protocol/zones/rpc.mdx @@ -1,6 +1,6 @@ --- title: RPC Reference -seoTitle: "Tempo Zone RPC & Authorization Tokens | Docs" +seoTitle: "Tempo Zone RPC & Authorization Tokens | Tempo Docs" description: Authenticated JSON-RPC interface for Tempo Zones with per-account scoping, response redaction, and event filtering. ogImage: /og/2026-q4/og_2026-q4_docs_protocol-zones-rpc_title-f5_v02.png --- diff --git a/src/pages/docs/quickstart/connection-details.mdx b/src/pages/docs/quickstart/connection-details.mdx index e5ee55033..f03dd7072 100644 --- a/src/pages/docs/quickstart/connection-details.mdx +++ b/src/pages/docs/quickstart/connection-details.mdx @@ -1,6 +1,6 @@ --- title: Network details -seoTitle: Tempo Network Details | Tempo Docs +seoTitle: Tempo Mainnet Chain ID and RPC | Tempo Docs description: Connect to Tempo mainnet or Moderato testnet with RPC endpoints, chain IDs, explorers, and browser wallets. mipd: true interactive: true diff --git a/src/pages/docs/quickstart/evm-compatibility.mdx b/src/pages/docs/quickstart/evm-compatibility.mdx index 59259106d..a9afb2ec5 100644 --- a/src/pages/docs/quickstart/evm-compatibility.mdx +++ b/src/pages/docs/quickstart/evm-compatibility.mdx @@ -1,6 +1,6 @@ --- title: "EVM differences" -seoTitle: "Tempo EVM Differences | Docs" +seoTitle: "Tempo EVM Differences | Tempo Docs" description: Learn how Tempo differs from Ethereum. Understand wallet behavior, fee token selection, VM layer changes, and fast finality consensus. ogImage: /og/2026-q4/og_2026-q4_docs_quickstart-evm-compatibility_title-f5_v02.png --- diff --git a/src/pages/docs/quickstart/integrate-tempo.mdx b/src/pages/docs/quickstart/integrate-tempo.mdx index 9782a4912..5f3c23a79 100644 --- a/src/pages/docs/quickstart/integrate-tempo.mdx +++ b/src/pages/docs/quickstart/integrate-tempo.mdx @@ -1,6 +1,6 @@ --- title: "Integrate Tempo" -seoTitle: "Integrate Tempo with Apps, Wallets, and Services | Tempo Docs" +seoTitle: "Integrate Tempo into Apps and Services | Tempo Docs" description: Connect applications and wallets to Tempo, review EVM and transaction behavior, deploy contracts, and integrate bridges and token discovery. ogImage: /og/2026-q4/og_2026-q4_docs_quickstart-integrate-tempo_title-f5_v02.png --- diff --git a/src/pages/docs/quickstart/predeployed-contracts.mdx b/src/pages/docs/quickstart/predeployed-contracts.mdx index 1caeb4323..31623ddd8 100644 --- a/src/pages/docs/quickstart/predeployed-contracts.mdx +++ b/src/pages/docs/quickstart/predeployed-contracts.mdx @@ -1,6 +1,6 @@ --- title: "Predeployed contracts on Tempo" -seoTitle: "Tempo Predeployed Contracts | Docs" +seoTitle: "Tempo Predeployed Contracts | Tempo Docs" description: Discover Tempo's predeployed system contracts including TIP-20 Factory, Fee Manager, Stablecoin DEX, and standard utilities like Multicall3. ogImage: /og/2026-q4/og_2026-q4_docs_quickstart-predeployed-contracts_title-f5_v02.png --- diff --git a/src/pages/docs/quickstart/verify-contracts.mdx b/src/pages/docs/quickstart/verify-contracts.mdx index d4a210fed..f6a9052f6 100644 --- a/src/pages/docs/quickstart/verify-contracts.mdx +++ b/src/pages/docs/quickstart/verify-contracts.mdx @@ -1,6 +1,6 @@ --- title: "Contract verification using Foundry" -seoTitle: "Verify Contracts with Foundry | Docs" +seoTitle: "Verify Contracts with Foundry | Tempo Docs" description: Verify your smart contracts on Tempo using contracts.tempo.xyz. Sourcify-compatible verification with Foundry integration. ogImage: /og/2026-q4/og_2026-q4_docs_quickstart-verify-contracts_title-f5_v02.png --- diff --git a/src/pages/docs/resources/guides/402-payment-required.mdx b/src/pages/docs/resources/guides/402-payment-required.mdx index b9a7a5441..55af1afc2 100644 --- a/src/pages/docs/resources/guides/402-payment-required.mdx +++ b/src/pages/docs/resources/guides/402-payment-required.mdx @@ -1,6 +1,6 @@ --- title: HTTP 402 Payment Required -seoTitle: HTTP 402 Payment Required for Machine Payments | Tempo Docs +seoTitle: HTTP 402 Payment Required for Machine Payments | Tempo description: Understand how HTTP 402 payment challenges work, choose an MPP payment flow, and handle authorization, retries, and receipts. --- diff --git a/src/pages/docs/resources/guides/add-tempo-to-metamask.mdx b/src/pages/docs/resources/guides/add-tempo-to-metamask.mdx index 71f5144a6..2b797de8c 100644 --- a/src/pages/docs/resources/guides/add-tempo-to-metamask.mdx +++ b/src/pages/docs/resources/guides/add-tempo-to-metamask.mdx @@ -1,6 +1,6 @@ --- title: Add Tempo to MetaMask -seoTitle: How to Add Tempo Network to MetaMask (Chain ID 4217) | Tempo Docs +seoTitle: How to Add Tempo Network to MetaMask (Chain ID 4217) | Tempo description: Add Tempo mainnet to MetaMask, Rabby, or another EVM wallet with chain ID 4217 and the official RPC, then see stablecoin balances and pay fees in stablecoins. interactive: true mipd: true diff --git a/src/pages/docs/resources/guides/batch-payments.mdx b/src/pages/docs/resources/guides/batch-payments.mdx index f27c8813f..aba8e5d25 100644 --- a/src/pages/docs/resources/guides/batch-payments.mdx +++ b/src/pages/docs/resources/guides/batch-payments.mdx @@ -1,6 +1,6 @@ --- title: "Plan batch and scheduled payouts" -seoTitle: "Batch and Scheduled Stablecoin Payments | Tempo Docs" +seoTitle: "Batch and Scheduled Stablecoin Payments | Tempo" description: "Choose atomic batches or independent payments, schedule submission, validate payout runs, and reconcile each delivered transfer." --- diff --git a/src/pages/docs/resources/guides/blockchain-payments.mdx b/src/pages/docs/resources/guides/blockchain-payments.mdx index 830125137..1053ee137 100644 --- a/src/pages/docs/resources/guides/blockchain-payments.mdx +++ b/src/pages/docs/resources/guides/blockchain-payments.mdx @@ -1,6 +1,6 @@ --- title: Blockchain payment workflows -seoTitle: Blockchain Payments and Stablecoin Integration Workflows | Tempo Docs +seoTitle: Blockchain Payments and Stablecoin Workflows | Tempo description: Map funding, signing, onchain delivery, and reconciliation responsibilities before integrating a stablecoin payment workflow on Tempo. --- diff --git a/src/pages/docs/resources/guides/compliance-controls.mdx b/src/pages/docs/resources/guides/compliance-controls.mdx index 965fd071c..a1e0bb452 100644 --- a/src/pages/docs/resources/guides/compliance-controls.mdx +++ b/src/pages/docs/resources/guides/compliance-controls.mdx @@ -1,6 +1,6 @@ --- title: Token and receive controls -seoTitle: Stablecoin Token Permissions and Receive Controls | Tempo Docs +seoTitle: Stablecoin Token Permissions and Receive Controls | Tempo description: Map TIP-20 roles, TIP-403 token policies, receive-policy holds, and payment references to your application's operating controls. --- diff --git a/src/pages/docs/resources/guides/connect-tempo-wallet-to-an-app.mdx b/src/pages/docs/resources/guides/connect-tempo-wallet-to-an-app.mdx index e3ec8e1ef..14e39a1a2 100644 --- a/src/pages/docs/resources/guides/connect-tempo-wallet-to-an-app.mdx +++ b/src/pages/docs/resources/guides/connect-tempo-wallet-to-an-app.mdx @@ -1,6 +1,6 @@ --- title: Connect Tempo Wallet to an app -seoTitle: How to Connect Tempo Wallet to an App or AI Agent | Tempo Docs +seoTitle: How to Connect Tempo Wallet to an App or AI Agent | Tempo description: Sign in to an app with Tempo Wallet, connect Claude Code, Codex, Amp, or Cursor to your wallet, and disconnect apps you no longer use. --- diff --git a/src/pages/docs/resources/guides/corporate-treasury.mdx b/src/pages/docs/resources/guides/corporate-treasury.mdx index 75c861de2..cc19c8482 100644 --- a/src/pages/docs/resources/guides/corporate-treasury.mdx +++ b/src/pages/docs/resources/guides/corporate-treasury.mdx @@ -1,6 +1,6 @@ --- title: Corporate treasury operations -seoTitle: Stablecoin Corporate Treasury Operations | Tempo Docs +seoTitle: Stablecoin Corporate Treasury Operations | Tempo description: Design a treasury pilot with entity-owned accounts, payment approvals, liquidity controls, and ERP or TMS reconciliation on Tempo. --- diff --git a/src/pages/docs/resources/guides/cross-border-payments-latin-america.mdx b/src/pages/docs/resources/guides/cross-border-payments-latin-america.mdx index e463ae6b7..67a12d03c 100644 --- a/src/pages/docs/resources/guides/cross-border-payments-latin-america.mdx +++ b/src/pages/docs/resources/guides/cross-border-payments-latin-america.mdx @@ -1,6 +1,6 @@ --- title: "Plan Latin America payment routes" -seoTitle: "Cross-Border Stablecoin Payments in Latin America | Tempo Docs" +seoTitle: "Cross-Border Stablecoin Payments in Latin America | Tempo" description: "Verify country-specific stablecoin funding, conversion, Pix or SPEI delivery, recipient access, and reconciliation in Latin America." --- diff --git a/src/pages/docs/resources/guides/cross-border-payments.mdx b/src/pages/docs/resources/guides/cross-border-payments.mdx index 28903b5db..554ced9ca 100644 --- a/src/pages/docs/resources/guides/cross-border-payments.mdx +++ b/src/pages/docs/resources/guides/cross-border-payments.mdx @@ -1,6 +1,6 @@ --- title: "Plan cross-border payments" -seoTitle: "Cross-Border Stablecoin Payments: Costs and Delivery | Tempo Docs" +seoTitle: "Cross-Border Stablecoin Payments: Costs and Delivery | Tempo" description: "Verify funding, asset support, conversion, recipient delivery, complete costs, and payment status for a cross-border route." --- @@ -62,7 +62,7 @@ A route completes when the destination receives funds; track its status through Define the evidence that closes the payment before launching the flow. A wallet payout requires verified delivery of the correct token and amount. A bank payout also needs confirmation from the payout provider or receiving institution. An API acknowledgment only means the request was accepted. -[Payment references](/docs/guide/payments/transfer-memos) can connect a payment to an invoice or internal record. Keep personal information, bank details, and sensitive business data off public ledgers. See [payment reconciliation](/docs/resources/guides/payment-reconciliation) for the operating workflow. +[Transfer memos](/docs/guide/payments/transfer-memos) can connect a payment to an invoice or internal record. Keep personal information, bank details, and sensitive business data off public ledgers. See [payment reconciliation](/docs/resources/guides/payment-reconciliation) for the operating workflow. ## Match the route to the business workflow diff --git a/src/pages/docs/resources/guides/embedded-wallets.mdx b/src/pages/docs/resources/guides/embedded-wallets.mdx index 890537c1a..1d67a8b93 100644 --- a/src/pages/docs/resources/guides/embedded-wallets.mdx +++ b/src/pages/docs/resources/guides/embedded-wallets.mdx @@ -1,6 +1,6 @@ --- title: "Choose embedded wallets" -seoTitle: "Choose Embedded Wallets for Tempo | Tempo Docs" +seoTitle: "Choose Embedded Wallets for Tempo | Tempo" description: "Choose a wallet integration for customer payments, backend signing, or custody, with provider-specific Tempo SDK and fee-sponsorship requirements." --- diff --git a/src/pages/docs/resources/guides/fbo-accounts.mdx b/src/pages/docs/resources/guides/fbo-accounts.mdx index e7c1caa6d..f5f3ff736 100644 --- a/src/pages/docs/resources/guides/fbo-accounts.mdx +++ b/src/pages/docs/resources/guides/fbo-accounts.mdx @@ -1,6 +1,6 @@ --- title: "FBO accounts in payment operations" -seoTitle: "FBO accounts in payment operations | Tempo Docs" +seoTitle: "FBO accounts in payment operations | Tempo" description: "Understand for-benefit-of accounts, beneficial-owner records, deposit insurance conditions, and how bank balances differ from stablecoin balances." --- diff --git a/src/pages/docs/resources/guides/funding-and-payouts.mdx b/src/pages/docs/resources/guides/funding-and-payouts.mdx index c62c4c63e..7fb7d9e15 100644 --- a/src/pages/docs/resources/guides/funding-and-payouts.mdx +++ b/src/pages/docs/resources/guides/funding-and-payouts.mdx @@ -1,6 +1,6 @@ --- title: "Funding and payout infrastructure" -seoTitle: "Funding and Payout Infrastructure for Tempo | Tempo Docs" +seoTitle: "Funding and Payout Infrastructure for Tempo | Tempo" description: "Connect bank deposits and payouts to Tempo through supported routes, customer onboarding, Bridge APIs, and payment completion records." --- diff --git a/src/pages/docs/resources/guides/genius-act.mdx b/src/pages/docs/resources/guides/genius-act.mdx index 9beb5241e..15a1faa0d 100644 --- a/src/pages/docs/resources/guides/genius-act.mdx +++ b/src/pages/docs/resources/guides/genius-act.mdx @@ -1,6 +1,6 @@ --- title: "The GENIUS Act and stablecoin payments" -seoTitle: "The GENIUS Act and stablecoin payments | Tempo Docs" +seoTitle: "The GENIUS Act and stablecoin payments | Tempo" description: "Evaluate issuer authorization, reserves, redemption, yield restrictions, and effective dates under the U.S. payment stablecoin law." --- diff --git a/src/pages/docs/resources/guides/get-stablecoins-on-tempo.mdx b/src/pages/docs/resources/guides/get-stablecoins-on-tempo.mdx index 6795544f8..db0cd964f 100644 --- a/src/pages/docs/resources/guides/get-stablecoins-on-tempo.mdx +++ b/src/pages/docs/resources/guides/get-stablecoins-on-tempo.mdx @@ -1,6 +1,6 @@ --- title: Get stablecoins on Tempo -seoTitle: How to Get USDC and Stablecoins on Tempo | Tempo Docs +seoTitle: How to Get USDC and Stablecoins on Tempo | Tempo description: Deposit USDC, USDT, or ETH from Base, Ethereum, Arbitrum, Solana, and other chains into Tempo Wallet, withdraw from Coinbase or Kraken on Tempo, or bridge. --- diff --git a/src/pages/docs/resources/guides/global-payouts.mdx b/src/pages/docs/resources/guides/global-payouts.mdx index 2cc92b4f1..6d67665a9 100644 --- a/src/pages/docs/resources/guides/global-payouts.mdx +++ b/src/pages/docs/resources/guides/global-payouts.mdx @@ -1,6 +1,6 @@ --- title: "Plan global payouts" -seoTitle: "Global Stablecoin Payouts: Integration and Delivery | Tempo Docs" +seoTitle: "Global Stablecoin Payouts: Integration and Delivery | Tempo" description: "Design contractor, merchant, and partner payouts around recipient access, complete costs, verified delivery, and reconciliation." --- diff --git a/src/pages/docs/resources/guides/how-to-accept-stablecoin-payments.mdx b/src/pages/docs/resources/guides/how-to-accept-stablecoin-payments.mdx index 536ad47d7..0c7bc8135 100644 --- a/src/pages/docs/resources/guides/how-to-accept-stablecoin-payments.mdx +++ b/src/pages/docs/resources/guides/how-to-accept-stablecoin-payments.mdx @@ -1,6 +1,6 @@ --- title: "Plan stablecoin payment acceptance" -seoTitle: "How to Accept Stablecoin Payments for B2B Invoices | Tempo Docs" +seoTitle: "How to Accept Stablecoin Payments for B2B Invoices | Tempo" description: "Plan B2B payment requests, verify stablecoin delivery, connect invoices to transfer events, and handle refunds and exceptions." --- diff --git a/src/pages/docs/resources/guides/index.mdx b/src/pages/docs/resources/guides/index.mdx index 2ad28d82d..c21147537 100644 --- a/src/pages/docs/resources/guides/index.mdx +++ b/src/pages/docs/resources/guides/index.mdx @@ -73,5 +73,5 @@ For a first test payment, use the [quickstart](/get-started/quickstart). [Partne These features are built into [TIP-20 tokens](/docs/protocol/tip20/overview), Tempo's native token standard for stablecoins. Each guide shows how to implement one: - [Sponsor user fees](/docs/api/fee-payer): let a fee payer, such as your backend, pay the network fee for a user's transaction, and authorize that sponsorship. -- [Payment references](/docs/guide/payments/transfer-memos): attach a 32-byte memo, such as an invoice ID, and match a confirmed transfer to your ledger. +- [Transfer memos](/docs/guide/payments/transfer-memos): attach a 32-byte memo, such as an invoice ID, and match a confirmed transfer to your ledger. - [Mint and burn TIP-20 tokens](/docs/guide/issuance/mint-stablecoins): manage your stablecoin's supply and distinguish token events from issuer funding and redemption. diff --git a/src/pages/docs/resources/guides/microtransactions.mdx b/src/pages/docs/resources/guides/microtransactions.mdx index 82dd330fc..7ee81ddfb 100644 --- a/src/pages/docs/resources/guides/microtransactions.mdx +++ b/src/pages/docs/resources/guides/microtransactions.mdx @@ -1,6 +1,6 @@ --- title: Microtransactions and metered billing -seoTitle: Stablecoin Microtransactions and Metered Billing | Tempo Docs +seoTitle: Stablecoin Microtransactions and Metered Billing | Tempo description: Choose direct charges, payment sessions, or recurring billing for small purchases, then meter usage and reconcile delivery on Tempo. --- diff --git a/src/pages/docs/resources/guides/move-funds-off-tempo.mdx b/src/pages/docs/resources/guides/move-funds-off-tempo.mdx index 570b12b4d..fa6212c66 100644 --- a/src/pages/docs/resources/guides/move-funds-off-tempo.mdx +++ b/src/pages/docs/resources/guides/move-funds-off-tempo.mdx @@ -1,6 +1,6 @@ --- title: Move funds off Tempo -seoTitle: How to Withdraw From Tempo to a Bank or Another Chain | Tempo Docs +seoTitle: How to Withdraw From Tempo to a Bank or Other Chain | Tempo description: Cash out stablecoins from Tempo through Coinbase or Kraken, bridge them to Base, Ethereum, or Solana, or send them to another wallet. --- diff --git a/src/pages/docs/resources/guides/nostro-vostro-accounts.mdx b/src/pages/docs/resources/guides/nostro-vostro-accounts.mdx index 8ed026a7a..e46be2caf 100644 --- a/src/pages/docs/resources/guides/nostro-vostro-accounts.mdx +++ b/src/pages/docs/resources/guides/nostro-vostro-accounts.mdx @@ -1,6 +1,6 @@ --- title: "Nostro and vostro accounts" -seoTitle: "Nostro and vostro accounts | Tempo Docs" +seoTitle: "Nostro and vostro accounts | Tempo" description: "Understand nostro and vostro accounts, how correspondent payments use them, and what stablecoin settlement changes for payment operations." --- diff --git a/src/pages/docs/resources/guides/pay-network-fees-in-stablecoins.mdx b/src/pages/docs/resources/guides/pay-network-fees-in-stablecoins.mdx index 384a95e72..52835e869 100644 --- a/src/pages/docs/resources/guides/pay-network-fees-in-stablecoins.mdx +++ b/src/pages/docs/resources/guides/pay-network-fees-in-stablecoins.mdx @@ -1,6 +1,6 @@ --- title: Pay fees in stablecoins -seoTitle: How to Pay Gas Fees on Tempo Without a Native Token | Tempo Docs +seoTitle: How to Pay Gas Fees on Tempo Without a Native Token | Tempo description: Tempo charges network fees in USD stablecoins, not a gas token. See which stablecoin pays, why a transaction fails for fees, and how sponsored fees work. --- diff --git a/src/pages/docs/resources/guides/payment-links.mdx b/src/pages/docs/resources/guides/payment-links.mdx index b16559fd2..693dd49ff 100644 --- a/src/pages/docs/resources/guides/payment-links.mdx +++ b/src/pages/docs/resources/guides/payment-links.mdx @@ -1,6 +1,6 @@ --- title: Create payment links -seoTitle: Create Stablecoin Payment Links and QR Codes | Tempo Docs +seoTitle: Create Stablecoin Payment Links and QR Codes | Tempo description: Create stablecoin payment links and QR codes, load trusted payment terms, preserve invoice references, and verify delivery before marking a request paid. --- diff --git a/src/pages/docs/resources/guides/payment-rails.mdx b/src/pages/docs/resources/guides/payment-rails.mdx index 0bf4bfe7d..5e02d2909 100644 --- a/src/pages/docs/resources/guides/payment-rails.mdx +++ b/src/pages/docs/resources/guides/payment-rails.mdx @@ -1,6 +1,6 @@ --- title: Compare payment rails -seoTitle: Compare ACH, Wires, Instant Payments, and Stablecoin Rails | Tempo Docs +seoTitle: ACH vs. Wires vs. Instant Payments vs. Stablecoins | Tempo description: Compare funding, settlement, recipient delivery, costs, and exception handling before adding a stablecoin payment route. --- diff --git a/src/pages/docs/resources/guides/payment-reconciliation.mdx b/src/pages/docs/resources/guides/payment-reconciliation.mdx index ede68ff60..bfbae7366 100644 --- a/src/pages/docs/resources/guides/payment-reconciliation.mdx +++ b/src/pages/docs/resources/guides/payment-reconciliation.mdx @@ -1,6 +1,6 @@ --- title: Reconcile payments -seoTitle: Stablecoin Payment Reconciliation and ERP Integration | Tempo Docs +seoTitle: Stablecoin Payment Reconciliation and ERP Sync | Tempo description: Match confirmed stablecoin transfers to invoices, prevent duplicate credits, and choose Tempo API, Goldsky pipelines, or Allium reports for reconciliation. --- diff --git a/src/pages/docs/resources/guides/payment-screening.mdx b/src/pages/docs/resources/guides/payment-screening.mdx index efdf2557c..64f1623c8 100644 --- a/src/pages/docs/resources/guides/payment-screening.mdx +++ b/src/pages/docs/resources/guides/payment-screening.mdx @@ -1,6 +1,6 @@ --- title: Screen blockchain payments -seoTitle: Blockchain Payment Screening and Compliance Tools | Tempo Docs +seoTitle: Blockchain Payment Screening and Compliance Tools | Tempo description: Choose address screening, transaction monitoring, or transaction simulation for Tempo payments, then connect provider results to payment controls. --- diff --git a/src/pages/docs/resources/guides/prefunding.mdx b/src/pages/docs/resources/guides/prefunding.mdx index d8e7d67e8..9b5b2fb63 100644 --- a/src/pages/docs/resources/guides/prefunding.mdx +++ b/src/pages/docs/resources/guides/prefunding.mdx @@ -1,6 +1,6 @@ --- title: "Prefunding in payment operations" -seoTitle: "Prefunding and Liquidity Buffers in Payment Operations | Tempo Docs" +seoTitle: "Prefunding and Liquidity Buffers for Payments | Tempo" description: "Evaluate why payment providers prefund accounts, how to estimate the cost of liquidity buffers, and where stablecoin settlement can help." --- diff --git a/src/pages/docs/resources/guides/refunds.mdx b/src/pages/docs/resources/guides/refunds.mdx index 964d666ca..39bcd09d6 100644 --- a/src/pages/docs/resources/guides/refunds.mdx +++ b/src/pages/docs/resources/guides/refunds.mdx @@ -1,6 +1,6 @@ --- title: Handle stablecoin refunds -seoTitle: Handle Stablecoin Refunds and Partial Refunds | Tempo Docs +seoTitle: Handle Stablecoin Refunds and Partial Refunds | Tempo description: Verify the original payment, reserve refundable amounts, approve a safe destination, and confirm each stablecoin refund without duplicate transfers. --- diff --git a/src/pages/docs/resources/guides/remittances.mdx b/src/pages/docs/resources/guides/remittances.mdx index 212e13f8a..857af8933 100644 --- a/src/pages/docs/resources/guides/remittances.mdx +++ b/src/pages/docs/resources/guides/remittances.mdx @@ -1,6 +1,6 @@ --- title: Remittance payment operations -seoTitle: Stablecoin Remittance Integration and Operations | Tempo Docs +seoTitle: Stablecoin Remittance Integration and Operations | Tempo description: Map a remittance corridor from sender funding to recipient payout, verify provider responsibilities, and reconcile a stablecoin settlement pilot. --- diff --git a/src/pages/docs/resources/guides/set-an-agent-spending-limit.mdx b/src/pages/docs/resources/guides/set-an-agent-spending-limit.mdx index 09d3b65bf..260069adc 100644 --- a/src/pages/docs/resources/guides/set-an-agent-spending-limit.mdx +++ b/src/pages/docs/resources/guides/set-an-agent-spending-limit.mdx @@ -1,6 +1,6 @@ --- title: Set an agent spending limit -seoTitle: How to Set a Spending Limit for an AI Agent on Tempo | Tempo Docs +seoTitle: How to Set a Spending Limit for an AI Agent | Tempo description: Approve an AI agent or app with a daily spending limit and an expiry in Tempo Wallet, lower its permissions before approving, and revoke it at any time. --- diff --git a/src/pages/docs/resources/guides/stablecoin-fees.mdx b/src/pages/docs/resources/guides/stablecoin-fees.mdx index 130cae99a..617182fa1 100644 --- a/src/pages/docs/resources/guides/stablecoin-fees.mdx +++ b/src/pages/docs/resources/guides/stablecoin-fees.mdx @@ -1,6 +1,6 @@ --- title: Stablecoin fee operations -seoTitle: Stablecoin Network Fees and Fee Token Operations | Tempo Docs +seoTitle: Stablecoin Network Fees and Fee Token Operations | Tempo description: Choose a Tempo fee token, check conversion liquidity, separate sponsorship from payment amounts, and reconcile actual network expenses. --- diff --git a/src/pages/docs/resources/guides/stablecoin-payment-infrastructure-enterprise-scale.mdx b/src/pages/docs/resources/guides/stablecoin-payment-infrastructure-enterprise-scale.mdx index a6828a80f..72db5107c 100644 --- a/src/pages/docs/resources/guides/stablecoin-payment-infrastructure-enterprise-scale.mdx +++ b/src/pages/docs/resources/guides/stablecoin-payment-infrastructure-enterprise-scale.mdx @@ -1,6 +1,6 @@ --- title: "Evaluate enterprise payment infrastructure" -seoTitle: "Enterprise Stablecoin Payment Infrastructure | Tempo Docs" +seoTitle: "Enterprise Stablecoin Payment Infrastructure | Tempo" description: "Evaluate settlement, accounts, liquidity, policy controls, fees, and reconciliation before operating stablecoin payments at scale." --- diff --git a/src/pages/docs/resources/guides/stablecoin-payroll-for-global-teams.mdx b/src/pages/docs/resources/guides/stablecoin-payroll-for-global-teams.mdx index 396ea07a2..0f5630679 100644 --- a/src/pages/docs/resources/guides/stablecoin-payroll-for-global-teams.mdx +++ b/src/pages/docs/resources/guides/stablecoin-payroll-for-global-teams.mdx @@ -1,6 +1,6 @@ --- title: "Plan stablecoin payroll" -seoTitle: "Stablecoin Payroll and Contractor Payouts | Tempo Docs" +seoTitle: "Stablecoin Payroll and Contractor Payouts | Tempo" description: "Connect approved payroll and contractor obligations to verified stablecoin payouts, recipient preferences, and finance records." --- diff --git a/src/pages/docs/resources/guides/stablecoin-settlement.mdx b/src/pages/docs/resources/guides/stablecoin-settlement.mdx index c06fc0fe0..cb31e6e6b 100644 --- a/src/pages/docs/resources/guides/stablecoin-settlement.mdx +++ b/src/pages/docs/resources/guides/stablecoin-settlement.mdx @@ -1,6 +1,6 @@ --- title: "Evaluate stablecoin settlement" -seoTitle: "Stablecoin Settlement: Finality, Fees, and Delivery | Tempo Docs" +seoTitle: "Stablecoin Settlement: Finality, Fees, and Delivery | Tempo" description: "Compare stablecoin assets, finality signals, delivered transfers, actual fees, liquidity, and reconciliation before selecting a settlement rail." --- @@ -76,7 +76,7 @@ The settlement layer doesn't decide who may approve a company payment, manage wa Tempo's [TIP-403 Policy Registry](/docs/protocol/tip403/overview) lets TIP-20 tokens share access-control policies. Identity checks, screening, and other obligations stay with the application and its providers. -[Payment references](/docs/guide/payments/transfer-memos) connect transfers with business references. Keep the full invoice, customer details, and sensitive records offchain. Use a reference that your internal systems can resolve, and define who can access those records. +[Transfer memos](/docs/guide/payments/transfer-memos) connect transfers with business references. Keep the full invoice, customer details, and sensitive records offchain. Use a reference that your internal systems can resolve, and define who can access those records. Record the network, transaction hash, and transfer log index as a unique event key. Connect it to the provider payment ID and invoice, and update the ledger once. Don't fulfill an order on a matching memo or a changed balance. See [payment reconciliation](/docs/resources/guides/payment-reconciliation) for the broader workflow. diff --git a/src/pages/docs/resources/guides/stablecoins-for-business.mdx b/src/pages/docs/resources/guides/stablecoins-for-business.mdx index 6471ce8b5..4a29a0e2a 100644 --- a/src/pages/docs/resources/guides/stablecoins-for-business.mdx +++ b/src/pages/docs/resources/guides/stablecoins-for-business.mdx @@ -1,6 +1,6 @@ --- title: "Evaluate stablecoins for business" -seoTitle: "Stablecoins for Business Payments and Treasury | Tempo Docs" +seoTitle: "Stablecoins for Business Payments and Treasury | Tempo" description: "Choose a bounded business payment pilot and evaluate funding, custody, recipient access, costs, integration, and operating risks." --- diff --git a/src/pages/docs/resources/guides/subscriptions-on-tempo.mdx b/src/pages/docs/resources/guides/subscriptions-on-tempo.mdx index cb8c1b79f..cdd22249b 100644 --- a/src/pages/docs/resources/guides/subscriptions-on-tempo.mdx +++ b/src/pages/docs/resources/guides/subscriptions-on-tempo.mdx @@ -1,6 +1,6 @@ --- title: Subscription billing with access keys -seoTitle: Stablecoin Subscriptions with Periodic Access Keys | Tempo Docs +seoTitle: Stablecoin Subscriptions with Periodic Access Keys | Tempo description: Design recurring stablecoin billing with periodic spending limits, scoped access keys, charge scheduling, delivery checks, and cancellation records. --- diff --git a/src/pages/docs/sdk/index.mdx b/src/pages/docs/sdk/index.mdx index 461bb6d45..8248a1f09 100644 --- a/src/pages/docs/sdk/index.mdx +++ b/src/pages/docs/sdk/index.mdx @@ -1,6 +1,6 @@ --- title: "Tempo SDKs: available languages and tools" -seoTitle: "Tempo SDKs: Go, Python, Rust & TS | Docs" +seoTitle: "Tempo SDKs: Go, Python, Rust & TS | Tempo Docs" description: Integrate Tempo into your applications with SDKs for TypeScript, Go, Python, Rust, and Foundry. Build blockchain apps in your preferred language. ogImage: /og/2026-q4/og_2026-q4_docs_sdk_linework-000_v02.png --- diff --git a/src/pages/docs/sdk/python/index.mdx b/src/pages/docs/sdk/python/index.mdx index 4e8d549b9..77171a7fd 100644 --- a/src/pages/docs/sdk/python/index.mdx +++ b/src/pages/docs/sdk/python/index.mdx @@ -1,6 +1,6 @@ --- title: "Tempo Python SDK: installing and using it" -seoTitle: "Python SDK: Install & Use | Docs" +seoTitle: "Python SDK: Install & Use | Tempo Docs" description: Build blockchain apps with the Tempo Python SDK. Send transactions, batch calls, and handle fee sponsorship using web3.py. ogImage: /og/2026-q4/og_2026-q4_docs_sdk-python_title-f5_v02.png --- diff --git a/src/pages/docs/sdk/typescript/index.mdx b/src/pages/docs/sdk/typescript/index.mdx index e7f982e14..b0e4c7a2f 100644 --- a/src/pages/docs/sdk/typescript/index.mdx +++ b/src/pages/docs/sdk/typescript/index.mdx @@ -1,6 +1,6 @@ --- title: "TypeScript SDKs: Viem extension and Account SDK" -seoTitle: "TypeScript SDKs: Viem & Account SDK | Docs" +seoTitle: "TypeScript SDKs: Viem & Account SDK | Tempo Docs" description: Build blockchain apps with Tempo using Viem and Wagmi. Send transactions, manage tokens, and use the stablecoin exchange with TypeScript. ogImage: /og/2026-q4/og_2026-q4_docs_sdk-typescript_title-f5_v02.png --- diff --git a/src/pages/docs/sdk/typescript/prool/setup.mdx b/src/pages/docs/sdk/typescript/prool/setup.mdx index f21bedeed..57742dfa8 100644 --- a/src/pages/docs/sdk/typescript/prool/setup.mdx +++ b/src/pages/docs/sdk/typescript/prool/setup.mdx @@ -1,6 +1,6 @@ --- title: "Prool setup: local Tempo test environment" -seoTitle: "Set Up a Local Test Env with Prool | Docs" +seoTitle: "Set Up a Local Test Env with Prool | Tempo Docs" description: Set up pooled Tempo node instances in TypeScript with Prool for testing and local development of blockchain applications. ogImage: /og/2026-q4/og_2026-q4_docs_sdk-typescript-prool-setup_title-f5_v02.png --- diff --git a/src/pages/index.mdx b/src/pages/index.mdx index 01e3084c2..18d46b4db 100644 --- a/src/pages/index.mdx +++ b/src/pages/index.mdx @@ -1,6 +1,6 @@ --- title: "Documentation" -seoTitle: "Tempo Developer Docs: APIs, SDKs & Guides" +seoTitle: "Developer Documentation: APIs, SDKs, and Guides | Tempo Docs" description: Build with Tempo Accounts, Earn, Routes, and Zones. Try developer walkthroughs, build machine payments, and explore the network and API reference. ogImage: /og/2026-q4/og_2026-q4_developers_developers_title-f5_v02.png --- diff --git a/vercel.json b/vercel.json index 4af94d122..77cfdfc30 100644 --- a/vercel.json +++ b/vercel.json @@ -2641,5 +2641,52 @@ "source": "/v1/auth/:path(.*)", "destination": "https://console.tempo.xyz/v1/auth/:path" } + ], + "headers": [ + { + "source": "/:prefix((?:developers/)?(?:assets/md/)?)index.md", + "headers": [ + { + "key": "Link", + "value": "; rel=\"canonical\"" + } + ] + }, + { + "source": "/assets/md/:path((?!index\\.md$).+)\\.md", + "headers": [ + { + "key": "Link", + "value": "; rel=\"canonical\"" + } + ] + }, + { + "source": "/developers/assets/md/:path((?!index\\.md$).+)\\.md", + "headers": [ + { + "key": "Link", + "value": "; rel=\"canonical\"" + } + ] + }, + { + "source": "/developers/:path((?!assets/md/|index\\.md$|SKILL\\.md$).+)\\.md", + "headers": [ + { + "key": "Link", + "value": "; rel=\"canonical\"" + } + ] + }, + { + "source": "/:path((?!assets/md/|developers/|index\\.md$|SKILL\\.md$).+)\\.md", + "headers": [ + { + "key": "Link", + "value": "; rel=\"canonical\"" + } + ] + } ] } diff --git a/vocs.config.ts b/vocs.config.ts index cf47bef52..e2285e939 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -215,10 +215,10 @@ export default defineConfig({ const seoTitle = typeof frontmatter?.seoTitle === 'string' ? frontmatter.seoTitle.trim() : undefined if (seoTitle) return seoTitle - if (pagePath === '/' || /^\/get-started(?:\/|$)/.test(pagePath)) return '%s ⋅ Tempo Docs' - if (pagePath.startsWith('/docs/')) return '%s ⋅ Tempo Docs' + if (pagePath === '/' || /^\/get-started(?:\/|$)/.test(pagePath)) return '%s | Tempo Docs' + if (pagePath.startsWith('/docs/')) return '%s | Tempo Docs' if (title?.includes('Tempo')) return undefined - return '%s ⋅ Tempo' + return '%s | Tempo' }, description: aiDocsDescription, renderStrategy: 'partial-static', @@ -1209,7 +1209,7 @@ export default defineConfig({ text: 'Customer deposit addresses', link: '/docs/guide/payments/virtual-addresses', }, - { text: 'Payment references', link: '/docs/guide/payments/transfer-memos' }, + { text: 'Transfer memos', link: '/docs/guide/payments/transfer-memos' }, { text: 'Verify payments', link: '/docs/guide/payments/accept-a-payment/examples',