
# SEO et recherche

La recherche provient de Fumadocs. Onedocs ajoute des utilitaires pour le plan du site, les fichiers robots.txt et llms.txt, tous configurés comme routes de l’App Router Next.js. Pour les métadonnées de page et les images Open Graph, consultez `onedocs/metadata` et `onedocs/og` dans la [référence API](https://onedocs.inline0.dev/fr/docs/api-reference#metadata).

## Recherche

Onedocs utilise la recherche Orama intégrée de Fumadocs. Créez une route 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);
```

Par défaut, la fenêtre de recherche ajoutée par `RootProvider` interroge `/api/search` ; aucune autre configuration n’est donc nécessaire.

## Plan du site

Générez un plan du site dans `/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` répertorie la racine du site, puis une URL par entrée dans `pages` sous `/docs`. Les entrées commençant par `---` (séparateurs de la barre latérale) sont ignorées, et `index` pointe vers `/docs` lui-même. Les entrées sont lues telles quelles ; les pages des sous-dossiers doivent donc avoir leur propre entrée, par exemple `"guides/setup"`.

## Robots.txt

Générez un robots.txt dans `/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 });
}
```

Cela crée :

```
User-Agent: *
Allow: /

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

## LLMs.txt

[LLMs.txt](https://llmstxt.org/) aide les assistants IA à comprendre votre documentation. Onedocs peut générer les versions résumée et intégrale.

### Version résumée

Créez `/llms.txt` avec les titres et descriptions des pages :

```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" },
  });
}
```

Le fichier commence par le titre et la description, répertorie chaque page sous la forme `- Title: URL` avec sa description, puis se termine par un lien vers `/llms-full.txt`. Les deux fonctions prennent la source encapsulée de `createLLMsSource`, et non la source Fumadocs elle-même, et renvoient une promesse.

### Version intégrale

Créez `/llms-full.txt` avec la documentation complète :

```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" },
  });
}
```

Chaque page est écrite avec son titre, URL, sa description et son Markdown traité, avec `---` entre les pages.

Le texte des pages provient du Markdown traité par Fumadocs MDX, désactivé par défaut. Sans cela, `llms-full.txt` ne contient que les titres, les URL et les descriptions ([#3](https://github.com/inline0/onedocs/issues/3)). Activez cette option dans `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,
    },
  },
});
```

## Options de configuration

### Options du plan du site

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

### Options des robots

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

## Ce que vous obtenez

Après avoir configuré ces routes :

| URL | Fonction |
|-----|--------------|
| `/api/search?query=...` | Point de terminaison de recherche API |
| `/sitemap.xml` | Plan du site XML pour les moteurs de recherche |
| `/robots.txt` | Fichier robots avec référence au plan du site |
| `/llms.txt` | Résumé pour les assistants IA |
| `/llms-full.txt` | Documentation complète pour les assistants IA |
