diff --git a/apps/content/blog/nextjs-ssr-orpc-tanstack-query.mdx b/apps/content/blog/nextjs-ssr-orpc-tanstack-query.mdx index 578ca5ceaa..8ff06221c1 100644 --- a/apps/content/blog/nextjs-ssr-orpc-tanstack-query.mdx +++ b/apps/content/blog/nextjs-ssr-orpc-tanstack-query.mdx @@ -1,6 +1,6 @@ --- title: "Next.js SSR with oRPC and TanStack Query: From Zero to Live Queries" -description: "A step-by-step tutorial for building a server-rendered Next.js app with oRPC and TanStack Query, including streamed and live queries that render on the server and resume in the browser." +description: "Build a server-rendered Next.js app with oRPC and TanStack Query step by step, including streamed and live queries that resume in the browser." type: blog date: 2026-08-19 search: diff --git a/apps/content/blog/stop-fetching-from-yourself.mdx b/apps/content/blog/stop-fetching-from-yourself.mdx index b095d92580..2dda9084fd 100644 --- a/apps/content/blog/stop-fetching-from-yourself.mdx +++ b/apps/content/blog/stop-fetching-from-yourself.mdx @@ -1,6 +1,6 @@ --- title: "Stop Making HTTP Requests to Yourself During SSR" -description: "Most fullstack apps fetch SSR data from their own API over HTTP. Call your API logic in-process with the Fetch API instead, and share one client between server and browser without leaking server code into the bundle." +description: "Most fullstack apps fetch SSR data from their own API over HTTP. Call your API logic in-process instead, and share one client between server and browser." type: blog date: 2026-08-19 search: diff --git a/apps/content/blog/uploads-bigger-than-your-ram.mdx b/apps/content/blog/uploads-bigger-than-your-ram.mdx index e90e5b38bf..b7815ba03d 100644 --- a/apps/content/blog/uploads-bigger-than-your-ram.mdx +++ b/apps/content/blog/uploads-bigger-than-your-ram.mdx @@ -1,6 +1,6 @@ --- title: "Handling File Uploads Bigger Than Your RAM in JavaScript" -description: "Stream large file uploads to disk in any JavaScript runtime while keeping the standard File API. Lazy blobs, safe temp file cleanup, per-category body size limits, and the oRPC plugin that packages it all." +description: "Stream large file uploads to disk in any JavaScript runtime while keeping the standard File API, with lazy blobs, temp file cleanup, and body size limits." type: blog date: 2026-08-17 search: diff --git a/apps/content/blog/v1-announcement.mdx b/apps/content/blog/v1-announcement.mdx index 9bcd2b0c6e..da8e03c37d 100644 --- a/apps/content/blog/v1-announcement.mdx +++ b/apps/content/blog/v1-announcement.mdx @@ -1,6 +1,6 @@ --- title: "oRPC v1 Announcement - Typesafe APIs Made Simple 🪄" -description: "oRPC v1 is now available - tRPC, ts-rest, next-safe-action, and more alternatives!" +description: "oRPC v1 is out: a stable, production-ready way to build typesafe APIs in TypeScript, and an alternative to tRPC, ts-rest, next-safe-action, and more!" type: blog date: 2025-04-16 search: diff --git a/apps/content/blog/you-might-not-need-a-form-library.mdx b/apps/content/blog/you-might-not-need-a-form-library.mdx index 593484d035..ca8a67f747 100644 --- a/apps/content/blog/you-might-not-need-a-form-library.mdx +++ b/apps/content/blog/you-might-not-need-a-form-library.mdx @@ -1,6 +1,6 @@ --- title: "You Might Not Need a Form Library" -description: "Your API schema already knows what valid input looks like. Run that same schema in the browser, parse plain HTML forms into structured data, and display field errors, all without a form validation library." +description: "Your API schema already knows what valid input looks like. Reuse it in the browser to parse plain HTML forms and show field errors, without a form library." type: blog date: 2026-08-22 search: diff --git a/apps/content/docs/adapters/astro.mdx b/apps/content/docs/adapters/astro.mdx index c38d1b6f38..3f27c4a783 100644 --- a/apps/content/docs/adapters/astro.mdx +++ b/apps/content/docs/adapters/astro.mdx @@ -1,6 +1,6 @@ --- title: "Astro Adapter" -description: "Use oRPC inside an Astro project by mounting a handler in an API route." +description: "Use oRPC inside an Astro project by mounting a handler in an on-demand API route through the Fetch API Adapter, and call procedures directly during SSR." sidebar: label: "Astro" --- diff --git a/apps/content/docs/adapters/browser.mdx b/apps/content/docs/adapters/browser.mdx index dcc9f2ae78..5136a99b3f 100644 --- a/apps/content/docs/adapters/browser.mdx +++ b/apps/content/docs/adapters/browser.mdx @@ -1,6 +1,6 @@ --- title: "Browser Adapter" -description: "Use oRPC for typesafe communication between browser scripts via the Message Port Adapter." +description: "Use oRPC for typesafe messaging between extension scripts or browser windows via the Message Port Adapter, and relay scripts that can't connect directly." sidebar: label: "Browser" --- diff --git a/apps/content/docs/adapters/electron.mdx b/apps/content/docs/adapters/electron.mdx index 31b2ae4539..f8ff4f9ef6 100644 --- a/apps/content/docs/adapters/electron.mdx +++ b/apps/content/docs/adapters/electron.mdx @@ -1,6 +1,6 @@ --- title: "Electron Adapter" -description: "Use oRPC for typesafe communication between Electron processes via the Message Port Adapter." +description: "Use oRPC for typesafe communication between Electron's main, preload, and renderer processes by passing a MessagePort through the Message Port Adapter." sidebar: label: "Electron" --- diff --git a/apps/content/docs/adapters/elysia.mdx b/apps/content/docs/adapters/elysia.mdx index 80af902646..b3e0d482af 100644 --- a/apps/content/docs/adapters/elysia.mdx +++ b/apps/content/docs/adapters/elysia.mdx @@ -1,6 +1,6 @@ --- title: "Elysia Adapter" -description: "Use oRPC inside an Elysia project by mounting a handler on a wildcard route." +description: "Use oRPC inside an Elysia project on Bun by mounting a handler on a wildcard route through the Fetch API Adapter, with Elysia's body parsing turned off." sidebar: label: "Elysia" --- diff --git a/apps/content/docs/adapters/express.mdx b/apps/content/docs/adapters/express.mdx index 64e7a44cd4..572957b587 100644 --- a/apps/content/docs/adapters/express.mdx +++ b/apps/content/docs/adapters/express.mdx @@ -1,6 +1,6 @@ --- title: "Express.js Adapter" -description: "Use oRPC inside an Express.js project by mounting a handler as a middleware." +description: "Use oRPC inside an Express.js project by mounting a handler as a middleware through the Node HTTP Adapter, without conflicts from body-parsing middleware." sidebar: label: "Express.js" --- diff --git a/apps/content/docs/adapters/fetch-api.mdx b/apps/content/docs/adapters/fetch-api.mdx index 573839073a..1c9b92b191 100644 --- a/apps/content/docs/adapters/fetch-api.mdx +++ b/apps/content/docs/adapters/fetch-api.mdx @@ -1,6 +1,6 @@ --- title: "Fetch API Adapter" -description: "Use oRPC with the Fetch API on both servers and clients, in runtimes such as Bun and Deno." +description: "Use oRPC with the Fetch API on both servers and clients, in runtimes such as Bun and Deno, and configure how event streams are sent to the client." sidebar: label: "Fetch API" --- diff --git a/apps/content/docs/adapters/h3.mdx b/apps/content/docs/adapters/h3.mdx index ce8390d012..efc6a92c7d 100644 --- a/apps/content/docs/adapters/h3.mdx +++ b/apps/content/docs/adapters/h3.mdx @@ -1,6 +1,6 @@ --- title: "H3 Adapter" -description: "Use oRPC inside an H3 project by mounting a handler on a wildcard route." +description: "Use oRPC inside an H3 project by mounting a handler on a wildcard route. H3 is built on web standards, so oRPC integrates through the Fetch API Adapter." sidebar: label: "H3" --- diff --git a/apps/content/docs/adapters/hono.mdx b/apps/content/docs/adapters/hono.mdx index 517c65b6c5..e163eaf14e 100644 --- a/apps/content/docs/adapters/hono.mdx +++ b/apps/content/docs/adapters/hono.mdx @@ -1,6 +1,6 @@ --- title: "Hono Adapter" -description: "Use oRPC inside a Hono project by mounting a handler as a middleware." +description: "Use oRPC inside a Hono project by mounting a handler as a middleware through the Fetch API Adapter, with a fix for middleware that reads the body first." sidebar: label: "Hono" --- diff --git a/apps/content/docs/adapters/next.mdx b/apps/content/docs/adapters/next.mdx index 44615f80f0..c960126bc6 100644 --- a/apps/content/docs/adapters/next.mdx +++ b/apps/content/docs/adapters/next.mdx @@ -1,6 +1,6 @@ --- title: "Next.js Adapter" -description: "Use oRPC inside a Next.js project by mounting a handler in a route handler." +description: "Use oRPC inside a Next.js project by mounting a handler in an App Router route handler or Pages Router API route, with a client that also works during SSR." sidebar: label: "Next.js" --- diff --git a/apps/content/docs/adapters/nuxt.mdx b/apps/content/docs/adapters/nuxt.mdx index 5223e2768d..35ec93af1d 100644 --- a/apps/content/docs/adapters/nuxt.mdx +++ b/apps/content/docs/adapters/nuxt.mdx @@ -1,6 +1,6 @@ --- title: "Nuxt Adapter" -description: "Use oRPC inside a Nuxt project by mounting a handler in a server route." +description: "Use oRPC inside a Nuxt project by mounting a handler in a server route and setting up an SSR-compatible client in a Nuxt plugin." sidebar: label: "Nuxt" --- diff --git a/apps/content/docs/adapters/react-router.mdx b/apps/content/docs/adapters/react-router.mdx index ccd357952c..8f99d43c90 100644 --- a/apps/content/docs/adapters/react-router.mdx +++ b/apps/content/docs/adapters/react-router.mdx @@ -1,6 +1,6 @@ --- title: "React Router Adapter" -description: "Use oRPC inside a React Router project by mounting a handler in a resource route." +description: "Use oRPC inside a React Router or Remix project by mounting a handler in a resource route's loader and action through the Fetch API Adapter." sidebar: label: "React Router" --- diff --git a/apps/content/docs/adapters/solid-start.mdx b/apps/content/docs/adapters/solid-start.mdx index 4d1fc594a3..6ec6bb5241 100644 --- a/apps/content/docs/adapters/solid-start.mdx +++ b/apps/content/docs/adapters/solid-start.mdx @@ -1,6 +1,6 @@ --- title: "SolidStart Adapter" -description: "Use oRPC inside a SolidStart project by mounting a handler in an API route." +description: "Use oRPC inside a SolidStart project by mounting a handler in an API route, with a client that forwards request headers during SSR and works in the browser." sidebar: label: "SolidStart" --- diff --git a/apps/content/docs/adapters/svelte-kit.mdx b/apps/content/docs/adapters/svelte-kit.mdx index a11512257b..9a1d805210 100644 --- a/apps/content/docs/adapters/svelte-kit.mdx +++ b/apps/content/docs/adapters/svelte-kit.mdx @@ -1,6 +1,6 @@ --- title: "SvelteKit Adapter" -description: "Use oRPC inside a SvelteKit project by mounting a handler in an endpoint." +description: "Use oRPC inside a SvelteKit project by mounting a handler in an endpoint, then call it during SSR through SvelteKit's fetch or a server-side client." sidebar: label: "SvelteKit" --- diff --git a/apps/content/docs/adapters/tanstack-start.mdx b/apps/content/docs/adapters/tanstack-start.mdx index afb680ed9d..a8184791e7 100644 --- a/apps/content/docs/adapters/tanstack-start.mdx +++ b/apps/content/docs/adapters/tanstack-start.mdx @@ -1,6 +1,6 @@ --- title: "TanStack Start Adapter" -description: "Use oRPC inside a TanStack Start project by mounting a handler in a server route." +description: "Use oRPC inside a TanStack Start project by mounting a handler in a server route, with an isomorphic client for the browser and SSR via createIsomorphicFn." sidebar: label: "TanStack Start" --- diff --git a/apps/content/docs/adapters/web-workers.mdx b/apps/content/docs/adapters/web-workers.mdx index 0dafd6a823..13c7a820c0 100644 --- a/apps/content/docs/adapters/web-workers.mdx +++ b/apps/content/docs/adapters/web-workers.mdx @@ -1,6 +1,6 @@ --- title: "Web Workers Adapter" -description: "Use oRPC for typesafe communication with Web Workers via the Message Port Adapter." +description: "Use oRPC for typesafe communication between the main thread and Web Workers via the Message Port Adapter, in browsers and runtimes such as Bun and Deno." sidebar: label: "Web Workers" --- diff --git a/apps/content/docs/adapters/worker-threads.mdx b/apps/content/docs/adapters/worker-threads.mdx index e4942e5871..ac69c92107 100644 --- a/apps/content/docs/adapters/worker-threads.mdx +++ b/apps/content/docs/adapters/worker-threads.mdx @@ -1,6 +1,6 @@ --- title: "Worker Threads Adapter" -description: "Use oRPC for typesafe communication between Node.js Worker Threads via the Message Port Adapter." +description: "Use oRPC for typesafe communication between the Node.js main thread and Worker Threads by passing a MessagePort through the Message Port Adapter." sidebar: label: "Worker Threads" --- diff --git a/apps/content/docs/api-reference.mdx b/apps/content/docs/api-reference.mdx index 05745bd1f9..945916f924 100644 --- a/apps/content/docs/api-reference.mdx +++ b/apps/content/docs/api-reference.mdx @@ -1,6 +1,6 @@ --- title: "API Reference" -description: "Full signatures for every function, class, and type the oRPC packages export." +description: "Full signatures for every function, class, and type the oRPC packages export, generated from the TypeScript declarations each package publishes." sidebar: icon: book-marked --- diff --git a/apps/content/docs/contract-first.mdx b/apps/content/docs/contract-first.mdx index 0b00a1b46c..b4dff1f2e8 100644 --- a/apps/content/docs/contract-first.mdx +++ b/apps/content/docs/contract-first.mdx @@ -1,6 +1,6 @@ --- title: "Contract-First" -description: "Build your first contract-first API with oRPC: describe the API in a contract, implement it with full type checking, and call it from a client that only needs the contract." +description: "Build a contract-first API with oRPC: define a contract, implement it with full type checking, and call it from a client that only needs the contract." sidebar: icon: handshake --- diff --git a/apps/content/docs/integrations/better-auth.mdx b/apps/content/docs/integrations/better-auth.mdx index c2c11c76ed..7d6e11345f 100644 --- a/apps/content/docs/integrations/better-auth.mdx +++ b/apps/content/docs/integrations/better-auth.mdx @@ -1,6 +1,6 @@ --- title: "Better Auth Integration" -description: "Use Better Auth sessions in oRPC context and protect procedures with typed middleware." +description: "Use Better Auth sessions in oRPC context and protect procedures with typed middleware, with an option to load the session lazily once per request." sidebar: label: "Better Auth" --- diff --git a/apps/content/docs/integrations/effect.mdx b/apps/content/docs/integrations/effect.mdx index 49fd4bf1be..01b91f85af 100644 --- a/apps/content/docs/integrations/effect.mdx +++ b/apps/content/docs/integrations/effect.mdx @@ -1,6 +1,6 @@ --- title: "Effect Integration" -description: "Write effectful oRPC handlers with Effect generators, call oRPC clients as effects, provide services through context, and use Effect Schema for input and output validation." +description: "Write effectful oRPC handlers with Effect generators, call oRPC clients as effects, provide services through context, and validate with Effect Schema." sidebar: label: "Effect" --- diff --git a/apps/content/docs/openapi/link-without-runtime-imports.mdx b/apps/content/docs/openapi/link-without-runtime-imports.mdx index 8ea4711b9c..922f6ba08a 100644 --- a/apps/content/docs/openapi/link-without-runtime-imports.mdx +++ b/apps/content/docs/openapi/link-without-runtime-imports.mdx @@ -1,6 +1,6 @@ --- title: "OpenAPI Link Without Runtime Imports" -description: "Use build-time macros to embed a minified contract in your client bundle, so OpenAPI Link works without maintaining a separate contract or shipping server code to the client." +description: "Use build-time macros to embed a minified contract in your client bundle, so OpenAPI Link works without a separate contract or shipping server code." --- [OpenAPI Link](/docs/openapi/link) needs a contract at runtime to know each procedure's method and path. With [RPC Link](/docs/rpc/link) a type import is enough, but with OpenAPI Link you must either maintain a [contract](/docs/contract/router) or import your [router](/docs/router), which pulls server code into the client bundle. [Safely Importing Router on the Client](/docs/contract/router#safely-importing-router-on-the-client) avoids that by exporting a minified contract to a JSON file, but you must regenerate the file every time the router changes. diff --git a/apps/content/docs/plugins/get-method-csrf-protection.mdx b/apps/content/docs/plugins/get-method-csrf-protection.mdx index fafa2b94a7..d7a46b6587 100644 --- a/apps/content/docs/plugins/get-method-csrf-protection.mdx +++ b/apps/content/docs/plugins/get-method-csrf-protection.mdx @@ -1,6 +1,6 @@ --- title: "GET Method CSRF Protection Plugin" -description: "Use GetMethodCsrfProtectionHandlerPlugin to make the safe GET method as secure as POST by rejecting navigations that may carry SameSite=Lax cookies from another site." +description: "Use GetMethodCsrfProtectionHandlerPlugin to make GET as secure as POST by rejecting cross-site navigations that may carry SameSite=Lax cookies." sidebar: label: "GET Method CSRF Protection" --- diff --git a/apps/content/docs/plugins/method-override.mdx b/apps/content/docs/plugins/method-override.mdx index ca799e44cf..75905b89fa 100644 --- a/apps/content/docs/plugins/method-override.mdx +++ b/apps/content/docs/plugins/method-override.mdx @@ -1,6 +1,6 @@ --- title: "Method Override Plugin" -description: "Use MethodOverrideHandlerPlugin to override the HTTP method of a POST request with a query parameter, so HTML forms can invoke PUT, PATCH, and DELETE procedures." +description: "Use MethodOverrideHandlerPlugin to override a POST request's HTTP method with a query parameter, so HTML forms can invoke PUT, PATCH, and DELETE procedures." sidebar: label: "Method Override" --- diff --git a/apps/content/docs/recipes/publish-client-to-npm.mdx b/apps/content/docs/recipes/publish-client-to-npm.mdx index 6531059457..c4d8a22d46 100644 --- a/apps/content/docs/recipes/publish-client-to-npm.mdx +++ b/apps/content/docs/recipes/publish-client-to-npm.mdx @@ -1,6 +1,6 @@ --- title: "Publish Client to NPM" -description: "Learn how to build and publish your oRPC client to NPM so users can consume your APIs as a fully typed SDK." +description: "Learn how to build and publish your oRPC client to NPM with pnpm and tsdown, so users can consume your APIs as a fully typed SDK." --- :::info diff --git a/apps/content/docs/requirements.mdx b/apps/content/docs/requirements.mdx index 0adf96bcd2..aaa3b8a1b9 100644 --- a/apps/content/docs/requirements.mdx +++ b/apps/content/docs/requirements.mdx @@ -1,6 +1,6 @@ --- title: "Runtime Requirements" -description: "oRPC is built on ES2022 and a small set of standard Web APIs. This page lists exactly what it needs and the minimum versions that provide it on Node.js, Deno, Bun, Cloudflare Workers, browsers, Android, and iOS." +description: "The ES2022 features and standard Web APIs oRPC needs, with minimum versions for Node.js, Deno, Bun, Cloudflare Workers, browsers, Android, and iOS." sidebar: label: "Requirements" icon: cpu diff --git a/apps/content/pages/blog/index.astro b/apps/content/pages/blog/index.astro index dc2953a210..20377571aa 100644 --- a/apps/content/pages/blog/index.astro +++ b/apps/content/pages/blog/index.astro @@ -72,7 +72,7 @@ const blogJsonLd = { '@type': 'Blog', 'name': `${config.title} Blog`, 'url': `${siteBase}/blog`, - 'description': 'News, announcements, and writing from the oRPC team.', + 'description': 'News, release announcements, tutorials, and engineering articles from the oRPC team about building typesafe APIs with TypeScript.', 'blogPost': posts.map(post => ({ '@type': 'BlogPosting', 'headline': post.title, @@ -94,7 +94,7 @@ const blogJsonLd = { searchEnabled={config.search.enabled} siteUrl={config.site} ogEnabled={config.og.enabled} - page={{ title: `Blog - ${config.title}`, description: 'News, announcements, and writing from the oRPC team.', route: '/blog' }} + page={{ title: `Blog - ${config.title}`, description: 'News, release announcements, tutorials, and engineering articles from the oRPC team about building typesafe APIs with TypeScript.', route: '/blog' }} x={config.x} >