
# SEO y búsqueda

La búsqueda proviene de Fumadocs. Onedocs añade funciones auxiliares para los archivos del mapa del sitio, robots.txt y llms.txt; todos están configurados como rutas de App Router de Next.js. Para los metadatos de página y las imágenes Open Graph, consulta `onedocs/metadata` y `onedocs/og` en la [referencia de API](https://onedocs.inline0.dev/es/docs/api-reference#metadata).

## Búsqueda

Onedocs usa la búsqueda integrada de Orama de Fumadocs. Crea una ruta API:

```ts title="src/app/api/search/route.ts"
import { source } from "@/lib/source";
import { createFromSource } from "fumadocs-core/search/server";

export const { GET } = createFromSource(source);
```

De forma predeterminada, el cuadro de búsqueda que añade `RootProvider` consulta `/api/search`, así que no hace falta ninguna otra configuración.

## Mapa del sitio

Genera un mapa del sitio en `/sitemap.xml`:

```ts title="src/app/sitemap.ts"
import { generateSitemap } from "onedocs/seo";
import meta from "../../content/docs/meta.json";

const baseUrl = "https://yourdomain.com";

export default function sitemap() {
  return generateSitemap({
    baseUrl,
    pages: meta.pages ?? [],
  });
}
```

`generateSitemap` incluye la raíz del sitio y luego un URL por cada entrada de `pages` en `/docs`. Omite las entradas que comienzan con `---` (separadores de la barra lateral), y `index` apunta a `/docs`. Lee las entradas tal como están; por eso, las páginas en subcarpetas necesitan sus propias entradas, por ejemplo `"guides/setup"`.

## Robots.txt

Genera un robots.txt en `/robots.txt`:

```ts title="src/app/robots.ts"
import { generateRobots } from "onedocs/seo";

const baseUrl = "https://yourdomain.com";

export default function robots() {
  return generateRobots({ baseUrl });
}
```

Esto crea:

```
User-Agent: *
Allow: /

Host: https://yourdomain.com
Sitemap: https://yourdomain.com/sitemap.xml
```

## LLMs.txt

[LLMs.txt](https://llmstxt.org/) ayuda a los asistentes de IA a comprender tu documentación. Onedocs puede generar versiones de resumen y de contenido completo.

### Versión resumida

Crea `/llms.txt` con los títulos y las descripciones de las páginas:

```ts title="src/app/llms.txt/route.ts"
import { createLLMsSource, generateLLMsText } from "onedocs/llms";
import { source } from "@/lib/source";
import config from "../../../onedocs.config";

export async function GET() {
  const llmsSource = createLLMsSource(source);
  const text = await generateLLMsText(llmsSource, {
    title: config.title,
    description: config.description,
  });

  return new Response(text, {
    headers: { "Content-Type": "text/plain; charset=utf-8" },
  });
}
```

El archivo empieza con el título y la descripción, enumera cada página como `- Title: URL` con su descripción y termina con una referencia a `/llms-full.txt`. Ambas funciones reciben la fuente envuelta de `createLLMsSource`, no la fuente Fumadocs en sí, y devuelven una promesa.

### Versión con el contenido completo

Cree `/llms-full.txt` con documentación completa:

```ts title="src/app/llms-full.txt/route.ts"
import { createLLMsSource, generateLLMsFullText } from "onedocs/llms";
import { source } from "@/lib/source";

export async function GET() {
  const llmsSource = createLLMsSource(source);
  const text = await generateLLMsFullText(llmsSource);

  return new Response(text, {
    headers: { "Content-Type": "text/plain; charset=utf-8" },
  });
}
```

Cada página se escribe con su título, URL, descripción y Markdown procesado, con `---` entre páginas.

El texto de la página proviene de Fumadocs MDX procesado de Markdown, que está desactivado de forma predeterminada. Sin él, `llms-full.txt` solo contiene títulos, URL y descripciones ([#3](https://github.com/inline0/onedocs/issues/3)). Actívelo en `source.config.ts`:

```ts title="source.config.ts"
import { defineDocs } from "fumadocs-mdx/config";

export const docs = defineDocs({
  dir: "content/docs",
  docs: {
    postprocess: {
      includeProcessedMarkdown: true,
    },
  },
});
```

## Opciones de configuración

### Opciones del mapa del sitio

```ts
generateSitemap({
  baseUrl: "https://yourdomain.com",
  pages: ["index", "getting-started", "configuration"],
  docsPath: "/docs", // Default: "/docs"
});
```

### Opciones de robots

```ts
generateRobots({
  baseUrl: "https://yourdomain.com",
  sitemapPath: "/sitemap.xml", // Default: "/sitemap.xml"
});
```

## Qué incluye

Después de configurar estas rutas:

| URL | Función |
|-----|--------------|
| `/api/search?query=...` | Endpoint de búsqueda API |
| `/sitemap.xml` | Mapa del sitio XML para motores de búsqueda |
| `/robots.txt` | Archivo de robots con referencia al mapa del sitio |
| `/llms.txt` | Resumen para asistentes de IA |
| `/llms-full.txt` | Documentación completa para asistentes de IA |
