From 4c416b0fba250aec22d0c519c108ac09b65cb604 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 23 Oct 2026 02:53:01 +0000 Subject: [PATCH] chore(content): describe oRPC in llms.txt and site JSON-LD - Add an llms.txt details block: what oRPC is, when to use it, install command, and the v1/v2 docs split. - Configure seo.organization (middleapi) and seo.software (oRPC, with GitHub and npm sameAs), so Blume emits the Organization and SoftwareApplication nodes. - Drop the hand-written home page JSON-LD, which duplicated Blume's WebSite node under a different @id. - Turn off PageLayout's graph on the blog pages, which already emit their own BlogPosting and Blog nodes. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01Qz33dCYYrmnUDSJSYPbGoz --- apps/content/blume.config.ts | 37 +++++++++++++++++++++++ apps/content/pages/blog/[...slug].astro | 3 ++ apps/content/pages/blog/index.astro | 2 ++ apps/content/pages/index.astro | 39 ++----------------------- 4 files changed, 44 insertions(+), 37 deletions(-) diff --git a/apps/content/blume.config.ts b/apps/content/blume.config.ts index 4b9a994402..24326710d1 100644 --- a/apps/content/blume.config.ts +++ b/apps/content/blume.config.ts @@ -85,6 +85,26 @@ export default defineConfig({ ], seo: { + /** The publisher of every page's JSON-LD: the team behind oRPC, not the product itself. */ + organization: { + name: 'middleapi', + url: 'https://github.com/middleapi', + sameAs: [ + 'https://x.com/middleapi', + 'https://opencollective.com/middleapi', + ], + }, + /** The homepage's SoftwareApplication JSON-LD node, which tells search engines and agents what oRPC is. */ + software: { + license: 'https://github.com/middleapi/orpc/blob/main/LICENSE', + operatingSystem: 'Cross-platform', + price: 0, + sameAs: [ + 'https://github.com/middleapi/orpc', + 'https://www.npmjs.com/package/@orpc/server', + 'https://www.npmjs.com/package/@orpc/client', + ], + }, x: { creator: '@middleapi', handle: '@middleapi' }, og: { titles: { @@ -218,6 +238,23 @@ export default defineConfig({ }, ], agents: { + llmsTxt: { + // The llms.txt "details" block, right after the title and summary: what + // oRPC is, when to reach for it, and how to install it. No headings, the + // spec reserves them for the page sections that follow. + details: [ + 'oRPC is an open-source (MIT) TypeScript library for end-to-end typesafe APIs. You write procedures, plain functions with optional input and output schemas (Zod, Valibot, ArkType, or any Standard Schema library), group them into a router, and serve it over HTTP. From that one router you get a fully typed client with no code generation, a REST API with a generated OpenAPI document, MCP tools for AI agents, and typed realtime streams.', + '', + 'Reach for oRPC when:', + '', + '- A TypeScript frontend, mobile app, or service calls a TypeScript backend and both sides should share types without a build step.', + '- You want tRPC-style RPC but also need a public REST API or an OpenAPI spec from the same code.', + '- You want to design the API as a contract first, then implement it and call it from clients that only import the contract.', + '- The API runs on Node.js, Bun, Deno, or Cloudflare Workers, inside a framework like Next.js, Nuxt, SvelteKit, or Hono, or feeds TanStack Query.', + '', + 'Install the server and client with `npm install @orpc/server@beta @orpc/client@beta zod`, then follow [Getting Started](https://orpc.dev/docs/getting-started). These docs cover oRPC v2, currently in beta. The v1 docs live at https://v1.orpc.dev, and [Migrating from oRPC v1](https://orpc.dev/docs/migrations/from-v1) lists what changed.', + ].join('\n'), + }, mcp: { enabled: true, }, diff --git a/apps/content/pages/blog/[...slug].astro b/apps/content/pages/blog/[...slug].astro index 5f109c8908..171287ff2b 100644 --- a/apps/content/pages/blog/[...slug].astro +++ b/apps/content/pages/blog/[...slug].astro @@ -70,6 +70,8 @@ const minutes = Math.max(1, Math.round(words / 200)) const dateFormat = new Intl.DateTimeFormat('en-US', { dateStyle: 'long' }) // schema.org JSON-LD, matching what Blume emits for generated blog pages. +// PageLayout's own graph would describe the post as a second, TechArticle +// node, so it is turned off below. const siteBase = (config.site ?? '').replace(/\/$/, '') const postJsonLd = { '@context': 'https://schema.org', @@ -106,6 +108,7 @@ const postJsonLd = { siteUrl={config.site} ogEnabled={config.og.enabled} page={{ title: `${entry.data.title} - ${config.title}`, description: entry.data.description, route: route.path }} + structuredDataEnabled={false} x={config.x} >