agentspeed.
← all fixes
Issue remediation

Missing llms.txt

Your site has no /llms.txt file, so AI agents have to guess which pages matter most.

failed checkllms_txt.present
What this means

llms.txt is a plain-text manifest at the root of your site (https://example.com/llms.txt) that lists the canonical URLs you most want AI agents to read. When it is missing, agents fall back to crawling your sitemap, your homepage, and whatever links they happen to find, which often means they index marketing copy and ignore your docs, pricing, and product pages.

Why it matters for AI agents

AI agents have small attention budgets. ChatGPT, Claude, Perplexity and emerging shopping agents typically fetch only a handful of pages per domain before answering a user. llms.txt lets you put your best content first: the pages that explain what you do, what you charge, and how to take action. Without it, agents read whatever a crawler happened to surface, which is rarely the page you would have chosen.

Business impact

When agents cite competitors instead of you in answers, you lose the impression entirely. There is no second-page result to recover from. Sites with a curated llms.txt see meaningfully higher citation rates in agent answers (because the agent ingested the right pages) and faster onboarding for AI shopping agents that need to identify your primary offering. Cost to add: ~15 minutes. Cost of not adding: every agent query that picks the wrong page or no page at all.

How to check manually

Open https://your-domain.com/llms.txt in a browser. If you see a 404, the file is missing. If you see HTML (your homepage), the file is missing and your server is misrouting. The file should return HTTP 200 with content-type text/plain and a body that starts with "# Site Name" followed by markdown-style sections.

The exact fix

Create a plain-text file at the root of your site called llms.txt. Open it with "# <Your site name>", a one-paragraph description of what you do, then sections (## Docs, ## Pricing, ## Blog, …) listing the canonical URLs you most want agents to read. Keep it under 50 KB, since long manifests get truncated.

Copy-paste snippet
Reference snippettxtllms.txt
# Acme

> Acme sells durable cookware to home cooks. We ship to the US and Canada.

## Docs

- [Quick start](https://acme.com/docs/quick-start): How to use your first pan.
- [Care guide](https://acme.com/docs/care): Cleaning, seasoning, longevity.

## Pricing

- [Pricing](https://acme.com/pricing): Our four product tiers and what each includes.

## Company

- [About](https://acme.com/about): Founding story, materials, manufacturing.
- [Contact](https://acme.com/contact): Email and support hours.
Platform-specific implementations

The reference snippet above is platform-agnostic. Below are the concrete steps for the four most common stacks plus a generic fallback for any other host.

Next.js

Add a route handler at app/llms.txt/route.ts that returns the manifest as text/plain. Next.js will serve it directly under /llms.txt with no rewrite needed. If you want the file to update without a rebuild, mark the route dynamic; otherwise it ships as a static asset at build time.

Next.jstsapp/llms.txt/route.ts
export const dynamic = 'force-static';

const BODY = `# Acme

> Acme sells durable cookware to home cooks.

## Docs
- [Quick start](https://acme.com/docs/quick-start)
- [Care guide](https://acme.com/docs/care)

## Pricing
- [Pricing](https://acme.com/pricing)
`;

export function GET() {
  return new Response(BODY, {
    headers: { 'content-type': 'text/plain; charset=utf-8' },
  });
}

WordPress

WordPress does not serve plain-text files at the root by default. The simplest path: upload llms.txt to your server root via SFTP (same place wp-config.php lives). Make sure your .htaccess does not rewrite the request into index.php; add an explicit allow rule if it does. Alternatively, use a snippet plugin (e.g. WPCode) to register a virtual route.

WordPressapache.htaccess
# Place above the WordPress rewrite block.
<Files "llms.txt">
  Require all granted
</Files>
RewriteRule ^llms\.txt$ - [L]

Shopify

Shopify does not let you upload arbitrary files at the root. The official workaround is to create a page template that returns text/plain and a redirect. Create a new page template "page.llms-txt.liquid", set its content type via the layout, and either (a) point /llms.txt → /pages/llms-txt with a 301 in your store settings, or (b) host the file on a subdomain you control via Cloudflare Worker / Netlify and add the URL to your Search Console.

Shopifyliquidtemplates/page.llms-txt.liquid
{% layout none %}# {{ shop.name }}

> {{ shop.description }}

## Products
{% for product in collections.all.products limit: 25 %}
- [{{ product.title }}](https://{{ shop.domain }}/products/{{ product.handle }})
{% endfor %}

Webflow

Webflow hosting does not allow custom files at the root, so the cleanest fix is to put llms.txt behind a CDN proxy (Cloudflare Worker is the usual choice) and rewrite /llms.txt to a Worker that returns the manifest. If you cannot run a Worker, host the file on a separate subdomain (e.g. agents.your-site.com/llms.txt) and submit it via your tooling. Agents that follow the spec will check the apex first, but several major crawlers also read subdomain manifests.

Webflowjscloudflare-worker.js
const BODY = `# Acme

> Acme sells durable cookware.

## Pages
- [Home](https://acme.com/)
- [Pricing](https://acme.com/pricing)
`;

export default {
  async fetch(req) {
    const { pathname } = new URL(req.url);
    if (pathname === '/llms.txt') {
      return new Response(BODY, {
        headers: { 'content-type': 'text/plain; charset=utf-8' },
      });
    }
    return fetch(req);
  },
};

Static HTML / any stack

Drop llms.txt into the same directory as your index.html. Most static hosts (Netlify, Vercel, GitHub Pages, S3, Cloudflare Pages) will serve it as text/plain automatically. If your host serves it as application/octet-stream, add an explicit content-type header in your hosting config.

Static HTML / any stacktomlnetlify.toml
[[headers]]
  for = "/llms.txt"
  [headers.values]
    Content-Type = "text/plain; charset=utf-8"
    Cache-Control = "public, max-age=3600"
Common mistakes
How to re-test

After deploying, visit https://your-domain.com/llms.txt in a private browser window. It should render as plain text and the network tab should show 200 with content-type text/plain. Then run a fresh AgentSpeed scan. The "llms.txt present" check should flip from fail to pass within ~30 seconds; the overall score will tick up by the check's rubric weight.

FAQ
Is llms.txt an official standard?

It is a community proposal (llmstxt.org) adopted by enough crawlers and agents that maintaining one is a high-leverage, low-effort win. It is not yet an IETF or W3C standard.

Will this hurt my SEO?

No. Search engines ignore llms.txt; they read robots.txt and sitemap.xml. llms.txt is read by AI agents in addition to (not instead of) the existing files.

How often should I update it?

Whenever your top pages change. For most sites that is quarterly. The file is small and cheap to redeploy, so erring on the side of fresh is fine.

Verify on your site
Run a scan

Free scan, no signup. The score page is permanent and citable, so you can link it from your team's remediation ticket alongside this guide for “Missing llms.txt”.

Run a free scan →See all fixes →