From 51614ee86eaab30280c795a6b5cc47bfde25b895 Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Fri, 11 Sep 2026 16:49:46 -0700 Subject: [PATCH 1/6] fix(llms): shape llms.txt to spec and unescape twin headings Extend patches/vocs.patch (Vocs stays at 2.3.2): - llms.txt: description as a blockquote, one H2 per sidebar section, and every entry links the page's Markdown twin with an absolute URL. The old first link (/docs/index) 404'd. - llms-full.txt: each page is preceded by a --- separator and a Source: https://splits.org/docs// line; in-page links are absolute. - .md twins and llms-full.txt: a text-pipeline counterpart of remarkSubheading turns "# Title [subtitle]" into a heading plus a paragraph instead of leaking "\[subtitle]" into every H1. --- patches/vocs.patch | 127 ++++++++++++++++++++++++++++++++++++++------- pnpm-lock.yaml | 6 +-- 2 files changed, 112 insertions(+), 21 deletions(-) diff --git a/patches/vocs.patch b/patches/vocs.patch index 8fed460..72e3525 100644 --- a/patches/vocs.patch +++ b/patches/vocs.patch @@ -1,17 +1,18 @@ diff --git a/dist/internal/llms.d.ts b/dist/internal/llms.d.ts -index 42a1b6d82f03226961d8a1ad91160620139e7518..f5a1896260e404f10b07620ab773267524f5a3f9 100644 +index 42a1b6d82f03226961d8a1ad91160620139e7518..8fdf3fb328aae24d75e450f8561e6e9eb7f030a3 100644 --- a/dist/internal/llms.d.ts +++ b/dist/internal/llms.d.ts -@@ -19,6 +19,7 @@ export declare function buildLlmsContent(options: buildLlmsContent.Options): Pro +@@ -19,6 +19,8 @@ export declare function buildLlmsContent(options: buildLlmsContent.Options): Pro }>; export declare namespace buildLlmsContent { type Options = { + basePath?: string | undefined; ++ baseUrl?: string | undefined; pages: Page[]; title: string; description?: string | undefined; diff --git a/dist/internal/llms.js b/dist/internal/llms.js -index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..70cfae0441623c1c2b79f9ee248945fdc691e650 100644 +index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..10e70729684a54410e2ea2683ddb0825df689f4e 100644 --- a/dist/internal/llms.js +++ b/dist/internal/llms.js @@ -6,7 +6,7 @@ import { unified } from 'unified'; @@ -19,11 +20,11 @@ index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..70cfae0441623c1c2b79f9ee248945fd import * as OpenApiMarkdown from './openapi/markdown.js'; export async function buildLlmsContent(options) { - const { title, description, rehypePlugins, remarkPlugins, sidebar } = options; -+ const { basePath = '/', title, description, rehypePlugins, remarkPlugins, sidebar } = options; ++ const { basePath = '/', baseUrl, title, description, rehypePlugins, remarkPlugins, sidebar } = options; // Dedupe by path (first occurrence wins), so consumer-authored source pages // take precedence over generated pages (e.g. OpenAPI) mounted at the same path. const seen = new Set(); -@@ -59,12 +59,25 @@ export async function buildLlmsContent(options) { +@@ -59,15 +59,49 @@ export async function buildLlmsContent(options) { })) .then((data) => data.filter((data) => data !== null)) .then((data) => sortResults(data, sidebar)); @@ -33,23 +34,74 @@ index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..70cfae0441623c1c2b79f9ee248945fd + const prefixPath = (path) => basePath === '/' || path === prefix || path.startsWith(`${prefix}/`) + ? path + : `${prefix}${path}`; -+ const prefixLinks = (content) => basePath === '/' ++ // Markdown output is read off-site (llms.txt, AI crawlers), so links are made ++ // absolute when a baseUrl is known; without one (dev, previews) they stay ++ // root-relative. ++ const origin = (baseUrl ?? '').replace(/\/$/, ''); ++ const absolutePath = (path) => `${origin}${prefixPath(path)}`; ++ const pageUrl = (path) => absolutePath(path).replace(/\/?$/, '/'); ++ const twinUrl = (path) => `${absolutePath(path === '/' ? '/index' : path)}.md`; ++ const prefixLinks = (content) => basePath === '/' && !origin + ? content + : content -+ .replace(/(\]\()(\/(?!\/)[^)\s]*)/g, (_match, open, path) => `${open}${prefixPath(path)}`) -+ .replace(/\b(href|src)=(["'])(\/(?!\/)[^"']*)/g, (_match, attr, quote, path) => `${attr}=${quote}${prefixPath(path)}`); ++ .replace(/(\]\()(\/(?!\/)[^)\s]*)/g, (_match, open, path) => `${open}${absolutePath(path)}`) ++ .replace(/\b(href|src)=(["'])(\/(?!\/)[^"']*)/g, (_match, attr, quote, path) => `${attr}=${quote}${absolutePath(path)}`); + for (const result of results) + result.content = prefixLinks(result.content); const llmsTxtContent = [`# ${title}`, '']; if (description) - llmsTxtContent.push(description, ''); +- llmsTxtContent.push(description, ''); ++ llmsTxtContent.push(`> ${description}`, ''); ++ // llmstxt.org shape: H2 per sidebar section, each entry linking the page's ++ // Markdown twin rather than its HTML. ++ const sectionOf = getSidebarSections(sidebar); const nav = []; - for (const { title, description, path } of results) +- for (const { title, description, path } of results) - nav.push(`- [${title}](${path === '/' ? '/index' : path})${description ? `: ${description}` : ''}`); -+ nav.push(`- [${title}](${prefixPath(path === '/' ? '/index' : path)})${description ? `: ${description}` : ''}`); ++ let section; ++ for (const { title, description, path } of results) { ++ const next = sectionOf.get(normalizePath(path)); ++ if (next !== section) { ++ section = next; ++ nav.push(...(nav.length ? [''] : []), `## ${section ?? 'Other'}`, ''); ++ } ++ nav.push(`- [${title}](${twinUrl(path)})${description ? `: ${description}` : ''}`); ++ } const sitemap = ['', ''].join('\n'); const short = [...llmsTxtContent, ...nav]; - const full = [...llmsTxtContent, sitemap, ...results.map((r) => r.content)]; +- const full = [...llmsTxtContent, sitemap, ...results.map((r) => r.content)]; ++ const full = [ ++ ...llmsTxtContent, ++ sitemap, ++ ...results.map((r) => ['---', '', `Source: ${pageUrl(r.path)}`, '', r.content].join('\n')), ++ ]; + return { full: full.join('\n'), results, short: short.join('\n') }; + } + /** +@@ -102,6 +136,23 @@ function sortResults(results, sidebar) { + return a.path.localeCompare(b.path); + }); + } ++function getSidebarSections(sidebar) { ++ const sections = Array.isArray(sidebar) ++ ? sidebar ++ : Object.values(sidebar ?? {}).flatMap((value) => (Array.isArray(value) ? value : (value.items ?? []))); ++ const sectionOf = new Map(); ++ const collect = (items, text) => { ++ for (const item of items ?? []) { ++ const link = item.link && normalizePath(item.link); ++ if (link && !isExternalLink(link) && !sectionOf.has(link)) ++ sectionOf.set(link, text); ++ collect(item.items, text); ++ } ++ }; ++ for (const section of sections) ++ collect([section], section.text); ++ return sectionOf; ++} + function getSidebarOrder(sidebar) { + const order = new Map(); + let index = 0; diff --git a/dist/internal/markdown-negotiation.js b/dist/internal/markdown-negotiation.js index 01c753f7cd9b0043629bd8ff3ea609a6df4f32a6..edba4ef27608ffb45124e77bed34519480bbc25e 100644 --- a/dist/internal/markdown-negotiation.js @@ -63,19 +115,58 @@ index 01c753f7cd9b0043629bd8ff3ea609a6df4f32a6..edba4ef27608ffb45124e77bed345194 'claude-web', 'PerplexityBot', 'Perplexity-User', +diff --git a/dist/internal/mdx.js b/dist/internal/mdx.js +index 287415a6bb59d7388ee6b3b796196cfe08d17490..6a6e36f738fb0b74dfcb108be550a6ca5c6bdd7b 100644 +--- a/dist/internal/mdx.js ++++ b/dist/internal/mdx.js +@@ -178,6 +178,7 @@ export function getCompileOptions(type, config) { + // round-trip back to their source form on stringify. + remarkDirective, + [remarkChangelogMarkdown, config], ++ remarkSubheadingText, + // User plugins extend the parser (e.g. `remark-math`) so syntax + // recognized in the React build also parses for llms/search. + ...(markdown?.remarkPlugins ?? []), +@@ -992,6 +993,25 @@ export function remarkSubheading() { + }); + }; + } ++/** ++ * Text-pipeline counterpart of {@link remarkSubheading}: splits `# Title [Subheading]` ++ * into a plain heading plus a paragraph, so remark-stringify has no bracket to escape. ++ */ ++export function remarkSubheadingText() { ++ return (tree) => { ++ UnistUtil.visit(tree, 'heading', (node, index, parent) => { ++ if (index === undefined || !parent || node.depth !== 1) ++ return; ++ const subheading = extractSubheading(node.children); ++ if (!subheading) ++ return; ++ node.children = subheading.headingChildren; ++ if (subheading.subheadingChildren.length > 0) ++ parent.children.splice(index + 1, 0, { type: 'paragraph', children: subheading.subheadingChildren }); ++ return UnistUtil.SKIP; ++ }); ++ }; ++} + export function extractSubheading(children) { + const lastChild = children[children.length - 1]; + if (!isText(lastChild) || !lastChild.value.endsWith(']')) diff --git a/dist/internal/vite-plugins.js b/dist/internal/vite-plugins.js -index 060cff216573fd043d5fd801e18ad581020e3139..e90efe3b5fc547da7cb0e173bdaac52a7d97a8b0 100644 +index 060cff216573fd043d5fd801e18ad581020e3139..58e6d1697d8292d23470b0af873a9cec5a11e7ff 100644 --- a/dist/internal/vite-plugins.js +++ b/dist/internal/vite-plugins.js -@@ -175,6 +175,7 @@ export function llms(config) { +@@ -175,6 +175,8 @@ export function llms(config) { // same generated route (`.md` serves the full reference); authored-only guide // pages under the section keep their own content. return Llms.buildLlmsContent({ + basePath: config.basePath, ++ baseUrl: config.baseUrl, pages: [...openapiPages, ...pages], title, description, -@@ -191,16 +192,30 @@ export function llms(config) { +@@ -191,16 +193,30 @@ export function llms(config) { }, configureServer(server) { let content; @@ -110,7 +201,7 @@ index 060cff216573fd043d5fd801e18ad581020e3139..e90efe3b5fc547da7cb0e173bdaac52a const result = content.results.find((r) => r.path.replace(/\/$/, '') === pagePath.replace(/\/index$/, '')); if (result) { res.setHeader('Content-Type', 'text/markdown; charset=utf-8'); -@@ -329,7 +344,7 @@ export function mdx(config) { +@@ -329,7 +345,7 @@ export function mdx(config) { * @returns Plugin. */ export function sitemap(config) { @@ -119,7 +210,7 @@ index 060cff216573fd043d5fd801e18ad581020e3139..e90efe3b5fc547da7cb0e173bdaac52a let built = false; let viteConfig; function getSiteUrl() { -@@ -340,7 +355,7 @@ export function sitemap(config) { +@@ -340,7 +356,7 @@ export function sitemap(config) { 'User-agent: *', 'Allow: /', '', @@ -128,7 +219,7 @@ index 060cff216573fd043d5fd801e18ad581020e3139..e90efe3b5fc547da7cb0e173bdaac52a '', ].join('\n'); } -@@ -378,7 +393,10 @@ export function sitemap(config) { +@@ -378,7 +394,10 @@ export function sitemap(config) { .replace(/\.(mdx?|tsx?)$/, '') .replace(/\/index$/, '/') .replace(/\/$/, '') || '/'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf426e0..d4241ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: patchedDependencies: vocs: - hash: 61b537b808d385c9d3943395efb161b7f6b913ff03695e50c5c9f2eb0d3ec3a0 + hash: 9bf4bf2a4c84dcceaff72b0ba959ead7c75d8ace3a9110eed0c6c56283a4971f path: patches/vocs.patch importers: @@ -21,7 +21,7 @@ importers: version: 19.2.7(react@19.2.7) vocs: specifier: 2.3.2 - version: 2.3.2(patch_hash=61b537b808d385c9d3943395efb161b7f6b913ff03695e50c5c9f2eb0d3ec3a0)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)) + version: 2.3.2(patch_hash=9bf4bf2a4c84dcceaff72b0ba959ead7c75d8ace3a9110eed0c6c56283a4971f)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)) waku: specifier: ^1.0.0-beta.3 version: 1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0) @@ -7098,7 +7098,7 @@ snapshots: optionalDependencies: vite: 8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0) - vocs@2.3.2(patch_hash=61b537b808d385c9d3943395efb161b7f6b913ff03695e50c5c9f2eb0d3ec3a0)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)): + vocs@2.3.2(patch_hash=9bf4bf2a4c84dcceaff72b0ba959ead7c75d8ace3a9110eed0c6c56283a4971f)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)): dependencies: '@base-ui/react': 1.6.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) From 7e6864a777d032c46b09c60e8e6a8a005cf766a7 Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Fri, 11 Sep 2026 16:49:46 -0700 Subject: [PATCH 2/6] fix(seo): drop the og image redirect and link marketing pages from the nav The og image URL lacked the trailing slash splits.org canonicalizes to, so every social scrape paid a 308 first. The top nav now links Pricing and Treasury, and Changelog gets its trailing slash for the same reason. --- vocs.config.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vocs.config.ts b/vocs.config.ts index 8ba73d0..6d162fa 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -23,7 +23,7 @@ export default defineConfig({ trailingSlashRedirect: false, // baseUrl is undefined in dev (vocs blanks it); relative is correct there. ogImageUrl: (path, { baseUrl }) => - `${baseUrl ?? ''}/docs/api/og?title=%title&path=${encodeURIComponent(path)}`, + `${baseUrl ?? ''}/docs/api/og/?title=%title&path=${encodeURIComponent(path)}`, accentColor: 'light-dark(#2143FA, #5B78FF)', iconUrl: { light: '/docs/splits_compressed.svg', @@ -31,7 +31,9 @@ export default defineConfig({ }, topNav: [ { text: 'splits.org', link: 'https://splits.org' }, - { text: 'Changelog', link: 'https://splits.org/changelog' }, + { text: 'Pricing', link: 'https://splits.org/pricing/' }, + { text: 'Treasury', link: 'https://splits.org/treasury/' }, + { text: 'Changelog', link: 'https://splits.org/changelog/' }, ], socials: [ { icon: 'github', link: 'https://github.com/0xSplits' }, From 53f8ee71b46caae82fe06634ed2d9a357b66977a Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Fri, 11 Sep 2026 16:49:46 -0700 Subject: [PATCH 3/6] docs: trim eight descriptions to 160 characters --- src/pages/accounts/editing.mdx | 2 +- src/pages/accounts/signers.mdx | 2 +- src/pages/banking/offramping.mdx | 2 +- src/pages/integrations/bankr.mdx | 2 +- src/pages/introduction/agents.mdx | 2 +- src/pages/teams/recovery.mdx | 2 +- src/pages/transactions/sends.mdx | 2 +- src/pages/transactions/swaps.mdx | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pages/accounts/editing.mdx b/src/pages/accounts/editing.mdx index fca2f70..9129351 100644 --- a/src/pages/accounts/editing.mdx +++ b/src/pages/accounts/editing.mdx @@ -1,6 +1,6 @@ --- title: Editing -description: "How an account changes after creation: renaming, changing signers and thresholds with the account's own signers, and resetting signers through the account's owner." +description: "How an account changes after creation: renaming, changing signers and thresholds with the account's own signers, and resetting signers through its owner." --- # Editing [Change an account's name, signers, or threshold, or reset lost signers] diff --git a/src/pages/accounts/signers.mdx b/src/pages/accounts/signers.mdx index d9e5302..d7bd74b 100644 --- a/src/pages/accounts/signers.mdx +++ b/src/pages/accounts/signers.mdx @@ -1,6 +1,6 @@ --- title: Signers -description: "Signers are the keys in an account's signer set that approve its transactions: how signing authority relates to membership and roles, and where signers are managed." +description: "Signers are the keys in an account's signer set that approve its transactions: how signing authority relates to membership and roles, and where to manage them." --- # Signers [The keys in an account's signer set that approve its transactions] diff --git a/src/pages/banking/offramping.mdx b/src/pages/banking/offramping.mdx index 54cdbfc..115364b 100644 --- a/src/pages/banking/offramping.mdx +++ b/src/pages/banking/offramping.mdx @@ -1,6 +1,6 @@ --- title: Offramping -description: "Move crypto out to the team's bank accounts: connecting banks via Plaid or manual entry, initiating an offramp, settlement timing for ACH and SEPA, and using your own offramp provider." +description: "Move crypto to the team's bank accounts: connect banks via Plaid or manually, initiate an offramp, ACH and SEPA settlement timing, or use your own provider." --- # Offramping [Move crypto out to the team's bank accounts] diff --git a/src/pages/integrations/bankr.mdx b/src/pages/integrations/bankr.mdx index 599592c..b5a8edb 100644 --- a/src/pages/integrations/bankr.mdx +++ b/src/pages/integrations/bankr.mdx @@ -1,6 +1,6 @@ --- title: Bankr -description: "Let a Bankr agent operate your Splits treasury through the CLI: signer-based access with human co-approval by default, or module-based direct execution on a bounded account." +description: "Let a Bankr agent operate your Splits treasury via the CLI: signer-based access with human co-approval, or module-based direct execution on a bounded account." --- # Bankr [Let a Bankr agent operate your treasury through the CLI] diff --git a/src/pages/introduction/agents.mdx b/src/pages/introduction/agents.mdx index c3cf1e7..5a510bd 100644 --- a/src/pages/introduction/agents.mdx +++ b/src/pages/introduction/agents.mdx @@ -1,6 +1,6 @@ --- title: Agents & API -description: "Operate Splits programmatically via the API or self-describing CLI, or connect AI tools over MCP: scopes, the proposal model, headless signing, and output tuning." +description: "Operate Splits via the API or self-describing CLI, or connect AI tools over MCP: scopes, the proposal model, headless signing, and output tuning." --- # Agents & API [Operate Splits programmatically via the API, CLI, or MCP] diff --git a/src/pages/teams/recovery.mdx b/src/pages/teams/recovery.mdx index 1a35659..31d9ac6 100644 --- a/src/pages/teams/recovery.mdx +++ b/src/pages/teams/recovery.mdx @@ -1,6 +1,6 @@ --- title: Recovery -description: "Why recovery exists, the recovery signers that control the Root account, verifying them, how to recover a team's accounts, and why changing recovery signers changes addresses." +description: "Why recovery exists, the recovery signers that control the Root account, how to verify them, recover a team's accounts, and why changing them changes addresses." --- # Recovery [Regain control of every account if a team's passkeys are lost] diff --git a/src/pages/transactions/sends.mdx b/src/pages/transactions/sends.mdx index 3cb8d0e..ba7737e 100644 --- a/src/pages/transactions/sends.mdx +++ b/src/pages/transactions/sends.mdx @@ -1,6 +1,6 @@ --- title: Sends -description: "Sends move tokens or NFTs from a Splits account to any recipient: the recipient types accepted, just-in-time swaps, memos, batching, signing, and private transfers." +description: "Sends move tokens or NFTs from a Splits account to any recipient: accepted recipient types, just-in-time swaps, memos, batching, signing, and private transfers." --- # Sends [Move tokens from an account to any recipient] diff --git a/src/pages/transactions/swaps.mdx b/src/pages/transactions/swaps.mdx index 9b91e97..39dfc36 100644 --- a/src/pages/transactions/swaps.mdx +++ b/src/pages/transactions/swaps.mdx @@ -1,6 +1,6 @@ --- title: Swaps -description: "How swaps work in Splits: multi-provider routing with no fees, bridging across networks, just-in-time swaps inside sends, slippage, and expiring quotes on multisigs." +description: "How swaps work: multi-provider routing with no fees, bridging across networks, just-in-time swaps inside sends, slippage, and expiring quotes on multisigs." --- # Swaps [Trade and bridge tokens with no fees from Splits] From dfc14fe9e936e92eb288136ff0113bbdb819db47 Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Mon, 14 Sep 2026 13:23:16 -0700 Subject: [PATCH 4/6] fix(llms): link section index twins without the trailing slash Section index pages resolve to paths ending in a slash, which produced links like /docs/accounts/.md in llms.txt. The twin is written as accounts.md, so strip the slash before appending the extension. --- patches/vocs.patch | 4 ++-- pnpm-lock.yaml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/patches/vocs.patch b/patches/vocs.patch index 72e3525..ec0a824 100644 --- a/patches/vocs.patch +++ b/patches/vocs.patch @@ -12,7 +12,7 @@ index 42a1b6d82f03226961d8a1ad91160620139e7518..8fdf3fb328aae24d75e450f8561e6e9e title: string; description?: string | undefined; diff --git a/dist/internal/llms.js b/dist/internal/llms.js -index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..10e70729684a54410e2ea2683ddb0825df689f4e 100644 +index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..ceb00410a0eb8e8f37774930ddc5de80b1288eea 100644 --- a/dist/internal/llms.js +++ b/dist/internal/llms.js @@ -6,7 +6,7 @@ import { unified } from 'unified'; @@ -40,7 +40,7 @@ index 6ad2b91c6b8a0a9e64fff6a06da5efa9c56ff0ae..10e70729684a54410e2ea2683ddb0825 + const origin = (baseUrl ?? '').replace(/\/$/, ''); + const absolutePath = (path) => `${origin}${prefixPath(path)}`; + const pageUrl = (path) => absolutePath(path).replace(/\/?$/, '/'); -+ const twinUrl = (path) => `${absolutePath(path === '/' ? '/index' : path)}.md`; ++ const twinUrl = (path) => `${absolutePath(path === '/' ? '/index' : path.replace(/\/$/, ''))}.md`; + const prefixLinks = (content) => basePath === '/' && !origin + ? content + : content diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4241ce..6c176f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: patchedDependencies: vocs: - hash: 9bf4bf2a4c84dcceaff72b0ba959ead7c75d8ace3a9110eed0c6c56283a4971f + hash: d50b69f8c39d0459ddffcb48a2a515a6c85bed296dbce7b8e0b3a35747b52076 path: patches/vocs.patch importers: @@ -21,7 +21,7 @@ importers: version: 19.2.7(react@19.2.7) vocs: specifier: 2.3.2 - version: 2.3.2(patch_hash=9bf4bf2a4c84dcceaff72b0ba959ead7c75d8ace3a9110eed0c6c56283a4971f)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)) + version: 2.3.2(patch_hash=d50b69f8c39d0459ddffcb48a2a515a6c85bed296dbce7b8e0b3a35747b52076)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)) waku: specifier: ^1.0.0-beta.3 version: 1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0) @@ -7098,7 +7098,7 @@ snapshots: optionalDependencies: vite: 8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0) - vocs@2.3.2(patch_hash=9bf4bf2a4c84dcceaff72b0ba959ead7c75d8ace3a9110eed0c6c56283a4971f)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)): + vocs@2.3.2(patch_hash=d50b69f8c39d0459ddffcb48a2a515a6c85bed296dbce7b8e0b3a35747b52076)(@types/react@19.2.17)(@vue/compiler-sfc@3.5.39)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(rollup@4.62.2)(typescript@5.9.3)(vite@8.1.3(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0))(waku@1.0.0-beta.6(@types/node@22.20.0)(esbuild@0.28.1)(jiti@2.7.0)(react-dom@19.2.7(react@19.2.7))(react-server-dom-webpack@19.2.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(webpack@5.108.4(esbuild@0.28.1)))(react@19.2.7)(terser@5.48.0)(tsx@4.23.0)(yaml@2.9.0)): dependencies: '@base-ui/react': 1.6.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@codesandbox/sandpack-react': 2.20.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) From 3debe71e0377e7a557ae6ff062f7c2dde2db53e8 Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Mon, 14 Sep 2026 14:45:36 -0700 Subject: [PATCH 5/6] fix(nav): label the site root Home instead of splits.org The docs live under splits.org, so a link labelled splits.org read as external. Addresses review feedback on #39. --- vocs.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vocs.config.ts b/vocs.config.ts index 6d162fa..102ecd1 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -30,7 +30,7 @@ export default defineConfig({ dark: '/docs/splits_compressed_dark.svg', }, topNav: [ - { text: 'splits.org', link: 'https://splits.org' }, + { text: 'Home', link: 'https://splits.org' }, { text: 'Pricing', link: 'https://splits.org/pricing/' }, { text: 'Treasury', link: 'https://splits.org/treasury/' }, { text: 'Changelog', link: 'https://splits.org/changelog/' }, From f9644272278981324e4ea21639614a5ed1198ca7 Mon Sep 17 00:00:00 2001 From: Rooh Afza <96720500+r0ohafza@users.noreply.github.com> Date: Mon, 14 Sep 2026 14:47:16 -0700 Subject: [PATCH 6/6] fix(nav): drop the Pricing link from the docs top nav Reviewer felt a Pricing link reads as out of place in developer docs. Treasury and Changelog stay. Addresses review feedback on #39. --- vocs.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vocs.config.ts b/vocs.config.ts index 102ecd1..1871ca3 100644 --- a/vocs.config.ts +++ b/vocs.config.ts @@ -31,7 +31,6 @@ export default defineConfig({ }, topNav: [ { text: 'Home', link: 'https://splits.org' }, - { text: 'Pricing', link: 'https://splits.org/pricing/' }, { text: 'Treasury', link: 'https://splits.org/treasury/' }, { text: 'Changelog', link: 'https://splits.org/changelog/' }, ],