MENTIA
← Retour au blog
Guide9 min de lecture·15 mai 2026

Comment ajouter un llms.txt à un site Next.js (App Router et Pages Router)

Tu veux que ChatGPT, Claude, Mistral et Perplexity comprennent rapidement ce que ton site Next.js propose. Le fichier llms.txt à la racine est la première brique du GEO technique. Ce tutoriel te montre comment le déployer en 15 minutes, en statique ou en dynamique, sur App Router (Next.js 13+) et Pages Router. Code prêt à coller.

TL;DR

  • Le llms.txt doit être accessible à https://tonsite.com/llms.txt avec un Content-Type text/plain ou text/markdown.
  • Méthode 1 statique : dépose le fichier dans public/llms.txt. Le plus simple.
  • Méthode 2 dynamique : crée une Route Handler app/llms.txt/route.ts (App Router) ou une API route (Pages Router).
  • Valide avec curl -I https://tonsite.com/llms.txt et un test sur ChatGPT.
  • Ne pas confondre avec robots.txt ni sitemap.xml. Les trois coexistent.

Pourquoi llms.txt change la donne pour Next.js en 2026

Le standard llms.txt a été proposé par Jeremy Howard (fast.ai, Answer.AI) en septembre 2024. L'idée est simple : fournir aux LLMs un fichier markdown qui résume la structure et les contenus clés d'un site. Les LLMs n'ont pas le temps de crawler 5 000 pages avant de répondre à une question utilisateur. Le llms.txt leur sert de table des matières prioritaire.

Pour un site Next.js, le llms.txt est particulièrement utile parce que beaucoup de contenus sont rendus côté client. Les crawlers IA qui ne font pas de rendu JavaScript ratent une partie du site. Le llms.txt à la racine, en texte brut, est lu par tous les crawlers, quelle que soit leur capacité de rendu.

Méthode 1 — llms.txt statique dans public/

C'est la méthode la plus simple. Tu écris le fichier une fois, tu le déposes dans le dossier public/, Next.js le sert tel quel à la racine.

Étape 1.1 — Créer le fichier public/llms.txt

Dans la racine de ton projet Next.js, crée le fichier public/llms.txt. Voici un template minimal :

# Ma Marque

> Description en 1-2 phrases factuelles de ce que tu fais.

## Pages clés

- [Accueil](https://tonsite.com/) : ce qu'on fait.
- [Tarifs](https://tonsite.com/tarifs/) : 3 plans, X €/mois.
- [Audit gratuit](https://tonsite.com/audit/) : test sans inscription.

## FAQ condensées

- Question 1 ? Réponse courte.
- Question 2 ? Réponse courte.

## Contact

- Email : contact@tonsite.com
- LinkedIn : https://linkedin.com/company/tamarque

Étape 1.2 — Vérifier la configuration next.config.js

Aucune config supplémentaire n'est nécessaire pour les fichiers dans public/. Next.js sert automatiquement le contenu de public/llms.txt à l'URL /llms.txt.

Vérifie quand même que tu n'as pas de rewrite ou de redirect qui interfère :

// next.config.js
module.exports = {
  async rewrites() {
    return [];
  },
  async redirects() {
    return [];
  },
};

Étape 1.3 — Déployer et valider

Push ton commit. Une fois déployé (Vercel, Netlify, OVH, autre), teste avec curl :

curl -I https://tonsite.com/llms.txt

Tu dois voir un status HTTP/2 200 et un Content-Type qui contient text/plain. Si le Content-Type est application/octet-stream ou autre, voir la section "Erreurs courantes" plus bas.

Méthode 2 — llms.txt dynamique avec App Router (Next.js 13+)

Si tu veux générer le llms.txt à partir de ton CMS headless (Sanity, Strapi, Contentful, base Postgres), passe par une Route Handler.

Étape 2.1 — Créer app/llms.txt/route.ts

Dans le dossier app/, crée le fichier app/llms.txt/route.ts :

import { NextResponse } from 'next/server';

export const dynamic = 'force-static';
export const revalidate = 3600; // ISR : régénère toutes les heures

export async function GET() {
  // Récupère tes données dynamiquement
  const pages = await fetchKeyPagesFromCMS();
  const faqs = await fetchTopFaqs();

  const content = `# Ma Marque

> Description courte de ce que tu fais.

## Pages clés

${pages.map(p => `- [${p.title}](${p.url}) : ${p.description}`).join('\n')}

## FAQ condensées

${faqs.map(f => `- ${f.question} ${f.answer}`).join('\n')}

## Contact

- Email : contact@tonsite.com
`;

  return new NextResponse(content, {
    status: 200,
    headers: {
      'Content-Type': 'text/plain; charset=utf-8',
      'Cache-Control': 'public, max-age=3600, s-maxage=3600',
    },
  });
}

Étape 2.2 — Implémenter fetchKeyPagesFromCMS

Adapte selon ton CMS. Exemple avec un client générique :

async function fetchKeyPagesFromCMS() {
  const res = await fetch(`${process.env.CMS_API_URL}/pages?key=true`, {
    headers: { Authorization: `Bearer ${process.env.CMS_API_TOKEN}` },
    next: { revalidate: 3600 },
  });
  const data = await res.json();
  return data.pages;
}

Étape 2.3 — Tester en local

Lance pnpm dev (ou npm run dev). Va sur http://localhost:3000/llms.txt. Le fichier doit s'afficher en texte brut avec ton contenu dynamique.

Méthode 3 — llms.txt avec Pages Router (Next.js < 13)

Si tu es encore sur Pages Router, utilise une API route et un rewrite.

Étape 3.1 — Créer pages/api/llms.ts

import { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const content = `# Ma Marque

> Description...

## Pages clés

- [Accueil](https://tonsite.com/) : ...
`;

  res.setHeader('Content-Type', 'text/plain; charset=utf-8');
  res.setHeader('Cache-Control', 'public, max-age=3600');
  res.status(200).send(content);
}

Étape 3.2 — Configurer le rewrite dans next.config.js

module.exports = {
  async rewrites() {
    return [
      { source: '/llms.txt', destination: '/api/llms' },
    ];
  },
};

L'URL /llms.txt redirige en interne vers /api/llms, mais l'utilisateur voit bien /llms.txt dans son navigateur.

Le contenu llms.txt à mettre

Le format suit la spec Jeremy Howard. Structure recommandée :

  1. Titre H1 : nom de ta marque.
  2. Bloc de citation > : description 1-2 phrases factuelles.
  3. Sections H2 : Pages clés, FAQ, Contact, Pays (optionnel), Glossaire (optionnel).
  4. Liens markdown : [Texte](URL) : description courte.
  5. Section ## Optional en fin : ressources secondaires.

Voir notre pillar GEO France 2026 pour le template MENTIA complet.

Validation et tests

Test 1 — Curl

curl -I https://tonsite.com/llms.txt

Status 200, Content-Type text/plain ou text/markdown.

Test 2 — Navigateur

Ouvre https://tonsite.com/llms.txt dans Chrome. Tu dois voir le markdown en texte brut, pas en HTML rendu.

Test 3 — ChatGPT

Pose la question : "Lis le fichier https://tonsite.com/llms.txt et résume ce que fait cette marque." Si ChatGPT répond avec une synthèse cohérente de ton contenu, le fichier est lisible.

Test 4 — MENTIA Audit

Lance un audit GEO gratuit MENTIA. L'audit vérifie automatiquement la présence, le format et le contenu du llms.txt, et te note les améliorations à apporter.

Erreurs courantes à éviter

Erreur 1 — Content-Type incorrect

Si ton fichier est servi en application/octet-stream ou text/html, les LLMs peuvent l'ignorer. Force le Content-Type à text/plain; charset=utf-8. Sur Vercel, c'est automatique pour les fichiers .txt dans public/. Sur d'autres hébergeurs, vérifie la config MIME types.

Erreur 2 — Encodage UTF-8 manquant

Les caractères accentués français doivent être en UTF-8. Si tu vois "é" au lieu de "é", c'est un problème d'encodage. Vérifie ton éditeur de code et l'en-tête HTTP charset=utf-8.

Erreur 3 — URL absolues vs relatives

Utilise systématiquement des URL absolues (https://tonsite.com/page) dans les liens markdown du llms.txt. Les URL relatives (/page) peuvent être mal interprétées par les LLMs.

Erreur 4 — Trop de pages listées

Le llms.txt doit être concis. Liste 10 à 20 pages clés maximum. Si tu veux fournir la version étendue, crée un llms-full.txt séparé qui peut inclure tout le contenu en markdown.

Erreur 5 — Pas de mise à jour automatique

Si tu utilises la méthode statique et que ton catalogue change souvent, le llms.txt devient obsolète. Pour un site dynamique, préfère la Route Handler avec ISR (revalidate).

Erreur 6 — Confusion avec robots.txt

Le llms.txt ne remplace pas le robots.txt. Les deux coexistent. Pour la config des bots IA dans robots.txt, voir notre tutoriel robots.txt pour crawlers IA.

FAQ — llms.txt sur Next.js

Le llms.txt doit-il être à la racine du domaine ? Oui. Le standard Jeremy Howard prescrit l'URL https://tonsite.com/llms.txt à la racine. Tout autre emplacement risque d'être ignoré par les crawlers IA.

Faut-il un Content-Type spécifique ? Oui, text/plain ou text/markdown. Le fichier doit être servi en texte brut, pas en HTML.

Peut-on générer llms.txt dynamiquement à partir du CMS ? Oui. Sur App Router, une Route Handler app/llms.txt/route.ts génère le fichier dynamiquement depuis ton CMS headless ou ta base de données, avec ISR pour mettre en cache.

Quelle est la longueur idéale ? Le format Jeremy Howard recommande un llms.txt court (10-20 liens, 200-500 mots) et un llms-full.txt étendu pour le contenu complet.

Faut-il un llms-full.txt en plus ? Optionnel mais recommandé pour les sites avec beaucoup de contenu. Le llms-full.txt peut inclure le markdown complet des pages clés, jusqu'à 1-2 Mo maximum.

Conclusion

15 minutes de setup pour la version statique, 30-60 minutes pour la version dynamique avec ISR. Le llms.txt est ton premier signal explicite aux LLMs pour leur dire "voici ce que je propose, voici où regarder". Une fois en place, valide avec un audit MENTIA pour vérifier que la structure est lisible et complète.

Ton site est-il lisible par ChatGPT, Claude et Mistral ?

Audit gratuit en 60 s · 24 critères techniques · Sans inscription · Rapport par email

Lancer mon audit gratuit →
← AccueilBlogConfidentialitéContact