Index of every page on this site: llms.txt

Configure your locales in @nuxtjs/i18n or nuxt-i18n-micro. Nuxt AI Ready detects that configuration and adds locale links. Runtime HTML-to-Markdown conversion also adds locale frontmatter.

What Auto-Activates

SurfaceBehavior
llms.txtAdds an ## Available Languages on Website section listing every locale, page count, and locale-root link. Locale roots use canonical URLs by default, or available Markdown representations when you enable llmsTxt.markdownLinks. Default-locale pages stay inlined; other locales appear as references.
Markdown Link headerEligible successful Markdown and HTML responses advertise Link: <url>; rel="alternate"; hreflang="…" per locale variant (RFC 8288).
FrontmatterRuntime HTML-to-Markdown conversion adds locale. Content-source and prerendered output need their own locale metadata. The friendly 404 also lists alternates.
DatabaseEach indexed page persists its locale for filtered queries and reporting.
FTS5 searchSQLite defaults to trigram when a configured locale is CJK (zh / ja / ko); otherwise unicode61 remove_diacritics 2. An explicit tokenizer overrides this default. Postgres uses its own search implementation.

URL Strategies

Locale resolution honors the i18n strategy:

  • prefix_except_default: /about (default), /fr/about, /de/about
  • prefix: /en/about, /fr/about
  • prefix_and_default: both prefixed and unprefixed defaults
  • no_prefix: every route belongs to the default locale

The module resolves locales when it indexes pages and when it builds response links. Configured custom routes and locale domains can affect that resolution.

To point locale roots and page entries at their available Markdown representations, opt in explicitly:

nuxt.config.ts
export default defineNuxtConfig({
  aiReady: {
    llmsTxt: {
      markdownLinks: true,
    },
  },
})

The same availability checks used for other page entries apply to locale links.

Translated Routes

When a page's slug differs per locale, alternates come from i18n's custom route paths rather than from prefix arithmetic. With:

nuxt.config.ts
export default defineNuxtConfig({
  i18n: {
    customRoutes: 'config',
    pages: {
      'about': { en: '/about', fr: '/a-propos' },
      'blog-slug': { en: '/blog/[slug]', fr: '/journal/[slug]' },
    },
  },
})

/about advertises hreflang="fr" as /fr/a-propos, and /blog/hello advertises /fr/journal/hello. Dynamic, optional and catch-all segments carry their values across locales, and a page set to false for a locale gets no alternate for it.

When several entries could claim a path, the most specific one wins: a static segment beats a dynamic one, and a dynamic one beats a catch-all. A [slug] page never swallows a page that spells its slug out.

For omitted locales, the module uses the configured default-locale path or the original Nuxt page path. If neither path is available, it cannot advertise that locale safely.

Example llms.txt

These page counts and site details are illustrative.

llms.txt
# Acme Docs

> Documentation for Acme.

Canonical Origin: https://acme.example

## Available Languages on Website

- [English (en)](/): 142 pages; content included below.
- [Français (fr)](/fr): 142 pages; visit this language for content.
- [日本語 (ja)](/ja): 80 pages; visit this language for content.

## LLM Resources

- [Full Content](https://acme.example/llms-full.txt): Complete page content in markdown format.
- [sitemap.xml](/sitemap.xml): XML sitemap for search engines and crawlers.

## Pages

- [Home](/)
- [About](/about)
…

Example Response Headers

For a successful request with English and French locales, the relevant headers include:

Content-Type: text/markdown; charset=utf-8
Vary: Accept
Link: <https://acme.example/fr/about>; rel="alternate"; type="text/html",
      <https://acme.example/fr/about>; rel="canonical",
      <https://acme.example/llms.txt>; rel="describedby",
      <https://acme.example/about.md>; rel="alternate"; hreflang="en",
      <https://acme.example/fr/about.md>; rel="alternate"; hreflang="fr-FR"

This example uses /fr/about, without the custom /fr/a-propos mapping above.

Example Frontmatter

Runtime HTML-to-Markdown conversion produces locale metadata like this:

/fr/about.md
---
title: "À propos"
description: "À propos d'Acme."
canonical_url: "https://acme.example/fr/about"
last_updated: "2026-04-25T13:48:00.000Z"
locale: "fr"
---

# À propos
…

Nuxt Content, custom Markdown sources, and prerendered output do not automatically receive this locale field. If you need it in those outputs, provide locale metadata in their source or generation hook.

Disabling Auto-Detection

Set autoI18n: false to skip integration even with an i18n module present:

nuxt.config.ts
export default defineNuxtConfig({
  aiReady: {
    autoI18n: false,
  },
})

Behavior Notes

  • Only the default locale's page list stays inlined in llms.txt. Other locales remain discoverable via the Available Languages header and hreflang alternates. Agents can follow those links when they need translated content.
  • Eligible successful Markdown and HTML responses include hreflang links. Error responses omit locale links to avoid advertising unavailable pages.
  • The locale column carries the locale code (e.g. fr), not the BCP-47 hreflang tag (fr-FR). Runtime HTML conversion also puts the code in frontmatter. The language tag appears in the Link header.

Compatibility

  • Configure @nuxtjs/i18n or nuxt-i18n-micro with the locales your app serves.
  • Detection uses the shared Nuxt SEO i18n helpers. Configure locales in the i18n module, then inspect the generated links.
Was this page helpful?