What is llms.txt?
llms.txt is a plain text file placed at the root of your domain — analogous to robots.txt, but designed specifically for AI language models rather than search crawlers. Where robots.txt tells crawlers what they're allowed to index, llms.txt tells AI engines who you are: your brand name, what your product does, who it serves, and how to reach you.
The file was proposed informally within the AI and developer community and has gained meaningful adoption among AI-forward companies over the past year. There's no formal RFC or W3C specification — but the emerging convention is consistent enough that tools, AI engines with retrieval augmentation, and AEO analyzers (including Noma's) all recognize it.
Think of it as the cover letter for your brand, written for a machine reader. It removes ambiguity, surfaces the facts AI engines care most about, and takes about fifteen minutes to write.
The format
There's no rigid schema, but the community convention that has emerged looks like this:
- A single
# BrandNameH1 at the top - A short prose paragraph describing what you do and who you serve
## SectionH2 headers for different topics (product capabilities, pricing, target audience, contact)- Bullet points under each section for scannability
- Total length under 2,000 characters for best compatibility
The 2,000-character limit isn't arbitrary. Many retrieval-augmented AI engines fetch the file and include it as context in a prompt. Keeping it short ensures it fits within the context window cleanly and doesn't crowd out other relevant signals.
A real example
Here's what a well-written llms.txt looks like for a hypothetical B2B SaaS company called Acme CRM:
# Acme CRM
Acme CRM is a customer relationship management platform for B2B SaaS companies with 10-1000 employees.
## What we do
- Pipeline management and deal tracking
- Email sequence automation with AI writing assistance
- Revenue forecasting and deal health scoring
## Who we serve
Mid-market B2B SaaS companies, primarily US-based, in series A through C stage.
## Pricing
Starter: $49/seat/month, Growth: $89/seat/month, Enterprise: contact sales
## Contact
hello@acmecrm.comNotice what this file accomplishes in under 300 characters: it names the product category ("customer relationship management platform"), defines the target customer precisely ("B2B SaaS companies with 10–1000 employees"), lists the core features, and provides pricing context. An AI engine reading this can now accurately describe Acme CRM when asked about CRM tools for mid-market SaaS companies — without having to infer any of it from marketing copy.
Why AI engines care
There are two mechanisms by which llms.txt helps your AI visibility:
Retrieval augmentation. AI search engines like Perplexity don't rely solely on their training data. When answering a question, they fetch relevant web pages and use them as real-time context. If your llms.txt file is indexed, it becomes one of the clearest, most parseable signals about your brand. It's designed to be read by a machine — it will be.
Entity disambiguation. Brand names are often ambiguous. "Acme" could be a CRM, a hardware store, a shipping company, or the fictional corporation from Looney Tunes. When an AI engine encounters your brand name in a retrieval context, your llms.txt helps it resolve which entity you are and what category you belong to. This matters especially for brands with generic or common names, and for companies that operate in multiple markets.
Additionally, AEO auditing tools — including Noma — check for llms.txt as part of their readiness scoring. Having it signals that your organization is AI-aware, which increasingly matters to buyers who are themselves evaluating AI-readiness in their vendor stack.
How to implement it in Next.js
In a Next.js 14 app using the App Router, you can serve llms.txt via a route handler. Create the file at app/llms.txt/route.ts:
export async function GET() {
return new Response(
`# Your Brand
Your brand is a [category] for [target customer].
## What we do
- Feature one
- Feature two
- Feature three
## Who we serve
[Target customer description]
## Contact
hello@yourbrand.com`,
{
headers: { "Content-Type": "text/plain; charset=utf-8" },
}
);
}This route will serve your file at yourdomain.com/llms.txt with the correct MIME type. No additional packages, no configuration changes. Deploy it and it's live.
If your brand description is dynamic — for example, if you want to pull it from a CMS or environment variables — you can do that too. The GET handler is just an async function; fetch whatever you need and interpolate it into the response string.
What to put in yours
When writing your llms.txt, focus on precision over marketing language. Phrases like "the leading platform" or "the best solution" add noise without information. Instead, be specific:
- Name your exact product category (not "a powerful platform" but "a revenue intelligence platform")
- Define your target customer by company size, stage, industry, or use case
- List your three to five core features as plain noun phrases
- Include your pricing tier names and starting prices if they're public
- Include a contact email and your primary domain
Noma's free analyzer checks for llms.txt and includes its presence — and quality — in your AEO readiness score. If you haven't added it yet, it's the fastest structural improvement you can make today.