---
title: llms.txt Generator and Validator
description: 
url: https://moxseo.com/tools/llms-txt-generator
date_modified: 2026-07-26
author: Admin
language: en_US
---

.mox-lt{--mox-bg:#fff;--mox-panel:#fff;--mox-ink:#0e0f12;--mox-ink-soft:#525866;--mox-line:#e8e8ea;--mox-primary:#ff5a1f;--mox-primary-d:#e8470a;--mox-accent:#ff5a1f;--mox-dark:#0e0f12;--mox-dark-2:#181a1f;--mox-good:#16a077;--mox-warn:#e8a20c;--mox-risk:#e34d5b;--mox-r:18px;--mox-r-sm:12px;--mox-font-d:'Sora',sans-serif;--mox-font-b:'Inter',sans-serif;--mox-font-m:'IBM Plex Mono',monospace;font-family:var(--mox-font-b);background:var(--mox-bg);color:var(--mox-ink)}
.mox-lt *,.mox-lt *::before,.mox-lt *::after{box-sizing:border-box;margin:0;padding:0}
.mox-lt a{text-decoration:none}.mox-lt button{font-family:inherit}
.mox-lt .w{max-width:1180px;margin:0 auto;padding:0 22px}
.mox-lt .sec{padding:82px 0}
.mox-lt .sec--alt{background:#fafafb}
.mox-lt .sec--dark{background:var(--mox-dark)}
.mox-lt .sec--dark h2,.mox-lt .sec--dark h3,.mox-lt .sec--dark p,.mox-lt .sec--dark li{color:#f4f4f6}
.mox-lt .eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--mox-font-m);font-size:12px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--mox-primary);margin-bottom:16px}
.mox-lt .eyebrow::before{content:"";width:22px;height:2px;background:var(--mox-accent)}
.mox-lt h1{font-family:var(--mox-font-d);font-size:clamp(32px,4.6vw,54px);font-weight:800;line-height:1.12;letter-spacing:-.02em}
.mox-lt h2{font-family:var(--mox-font-d);font-size:clamp(26px,3.4vw,38px);font-weight:700;line-height:1.18;letter-spacing:-.015em;max-width:780px}
.mox-lt h3{font-family:var(--mox-font-d);font-weight:700}
.mox-lt .sub{font-size:17px;color:var(--mox-ink-soft);max-width:700px;margin-top:14px;line-height:1.7}
.mox-lt .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-family:var(--mox-font-d);font-weight:700;font-size:15px;padding:15px 28px;border-radius:999px;border:2px solid transparent;cursor:pointer;transition:transform .25s,background .2s}
.mox-lt .btn:hover{transform:translateY(-2px)}
.mox-lt .btn--p{background:var(--mox-primary);color:#fff;box-shadow:0 10px 26px rgba(255,90,31,.32)}
.mox-lt .btn--p:hover{background:var(--mox-primary-d)}
.mox-lt .btn--ghost{background:transparent;border-color:var(--mox-line);color:var(--mox-ink)}
.mox-lt .btn--dg{background:transparent;border-color:rgba(255,255,255,.25);color:#fff}
.mox-lt .trust{background:var(--mox-dark);padding:14px 0}
.mox-lt .trust__row{display:flex;flex-wrap:wrap;justify-content:center;gap:10px 28px;font-family:var(--mox-font-m);font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;color:#a7acb5}
.mox-lt .trust__row span{display:inline-flex;align-items:center;gap:8px}
.mox-lt .trust__row span::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--mox-accent)}
.mox-lt .hero{padding:80px 0 70px;background:radial-gradient(900px 500px at 85% -10%,rgba(255,90,31,.12),transparent 60%),radial-gradient(700px 420px at -10% 30%,rgba(255,90,31,.08),transparent 55%),var(--mox-bg)}
.mox-lt .hero__grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.mox-lt .lead{font-size:18px;color:var(--mox-ink-soft);margin:20px 0 28px;max-width:560px;line-height:1.7}
.mox-lt .cta-row{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:26px}
.mox-lt .ticks{display:flex;flex-wrap:wrap;gap:10px 22px;font-size:14px;color:var(--mox-ink-soft)}
.mox-lt .ticks span{display:inline-flex;align-items:center;gap:7px}
.mox-lt .ticks span::before{content:"\2713";color:var(--mox-good);font-weight:700}
.mox-lt .sample{background:var(--mox-dark);border-radius:24px;padding:30px;box-shadow:0 30px 70px rgba(14,15,18,.35);transform:rotate(1.2deg)}
.mox-lt .sample__tag{font-family:var(--mox-font-m);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--mox-accent);margin-bottom:18px}
.mox-lt .sample__score{display:flex;align-items:baseline;gap:14px;border-bottom:1px solid rgba(255,255,255,.12);padding-bottom:18px;margin-bottom:18px}
.mox-lt .sample__num{font-family:var(--mox-font-m);font-size:56px;font-weight:600;color:var(--mox-accent);line-height:1}
.mox-lt .sample__lbl{font-size:14px;color:#a7acb5;max-width:160px}
.mox-lt .sample__row{display:flex;justify-content:space-between;gap:16px;padding:9px 0;font-size:14px}
.mox-lt .sample__row b{color:#fff;font-weight:600}
.mox-lt .sample__row span{color:#85898f}
.mox-lt .sample__note{margin-top:16px;font-size:12.5px;color:#85898f;border-left:3px solid var(--mox-accent);padding-left:12px;line-height:1.6}
.mox-lt .g3{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:44px}
.mox-lt .g2{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:44px}
.mox-lt .card{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:var(--mox-r);padding:26px;transition:transform .3s,box-shadow .3s}
.mox-lt .card:hover{transform:translateY(-4px);box-shadow:0 18px 40px rgba(14,15,18,.08)}
.mox-lt .card h3{font-size:17px;margin:14px 0 8px}
.mox-lt .card p{font-size:14.5px;color:var(--mox-ink-soft);line-height:1.65}
.mox-lt .chip{display:inline-flex;font-family:var(--mox-font-m);font-size:11px;font-weight:600;letter-spacing:.08em;padding:5px 10px;border-radius:6px;background:rgba(255,90,31,.1);color:var(--mox-primary)}
.mox-lt .bands{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:44px}
.mox-lt .band{border-radius:var(--mox-r);padding:24px;background:var(--mox-panel);border:1px solid var(--mox-line);border-top:5px solid var(--mox-line)}
.mox-lt .band h3{font-size:15.5px;margin:8px 0}
.mox-lt .band p{font-size:13.5px;color:var(--mox-ink-soft);line-height:1.65}
.mox-lt .band__t{font-family:var(--mox-font-m);font-weight:600;font-size:20px}
.mox-lt .band--a{border-top-color:var(--mox-good)}.mox-lt .band--a .band__t{color:var(--mox-good)}
.mox-lt .band--b{border-top-color:var(--mox-warn)}.mox-lt .band--b .band__t{color:var(--mox-warn)}
.mox-lt .band--c{border-top-color:var(--mox-risk)}.mox-lt .band--c .band__t{color:var(--mox-risk)}
.mox-lt .tool{background:var(--mox-panel);border:1px solid var(--mox-line);border-radius:24px;padding:34px;box-shadow:0 20px 60px rgba(14,15,18,.06);margin-top:38px}
.mox-lt .form{display:flex;flex-wrap:wrap;gap:12px}
.mox-lt .form input{flex:1 1 320px;min-width:250px;font-family:var(--mox-font-b);font-size:16px;color:var(--mox-ink);background:#fbfbfc;border:1.5px solid var(--mox-line);border-radius:999px;padding:15px 22px;outline:none;transition:border .2s,box-shadow .2s}
.mox-lt .form input:focus{border-color:var(--mox-primary);box-shadow:0 0 0 4px rgba(255,90,31,.14)}
.mox-lt .hint{font-size:13px;color:var(--mox-ink-soft);margin-top:12px}
.mox-lt .faq{max-width:820px;margin:44px auto 0}
.mox-lt .faq details{border-bottom:1px solid var(--mox-line);padding:18px 0}
.mox-lt .faq summary{font-family:var(--mox-font-d);font-weight:700;font-size:16.5px;cursor:pointer;list-style:none;display:flex;justify-content:space-between;gap:16px}
.mox-lt .faq summary::after{content:"+";color:var(--mox-primary);font-size:20px;line-height:1}
.mox-lt .faq details[open] summary::after{content:"\2212"}
.mox-lt .faq p{font-size:15px;color:var(--mox-ink-soft);line-height:1.7;margin-top:12px}
.mox-lt .final{text-align:center;background:radial-gradient(700px 380px at 50% -20%,rgba(255,90,31,.16),transparent 60%),var(--mox-dark)}
.mox-lt .final h2{margin:0 auto}.mox-lt .final .cta-row{justify-content:center;margin-top:30px}
@media(max-width:900px){.mox-lt .hero__grid{grid-template-columns:1fr;gap:40px}.mox-lt .g3,.mox-lt .bands{grid-template-columns:1fr}.mox-lt .g2{grid-template-columns:1fr}.mox-lt .sec{padding:56px 0}.mox-lt .sample{transform:none}}

Validates against the specBuilds from your sitemapNo signupNothing stored

Free tool

# Tell AI assistants what your site is actually about

robots.txt says what crawlers may not read. llms.txt says what is worth reading. Check whether yours is valid, or generate a starter file from your sitemap in one click.

[Check my llms.txt](#mox-run)[Check crawler access](https://moxseo.com/tools/ai-crawler-access-checker/)
Validates six spec requirementsGenerates from sitemapCopy-paste ready

Sample validation
5/6Spec checks passed on this domain
Single H1 title**Pass**
Summary blockquote**Fail**
Section headings**Pass**
Markdown links**Pass**
Reasonable size**Pass**
The missing summary line is the one an assistant reads first. Without it, the model infers your positioning from page titles alone.

The problem

## Without llms.txt, an AI has to reverse-engineer your site from whatever it crawled

Language models do not browse the way people do. They arrive with a question, pull a handful of pages, and assemble an answer. If nothing tells them how your site is organised or which pages carry authority, they guess — and they guess from navigation labels and page titles.

STRUCTURE
### Your hierarchy is invisible

A crawler sees a flat list of URLs. It cannot tell that your pricing page matters more than a 2023 changelog entry, or that six of your posts are one cluster. llms.txt makes that hierarchy explicit.

POSITIONING
### Your one-line pitch is missing

The summary blockquote under the title is the single highest-leverage line in the file. It is often what a model repeats when someone asks what your company does.

NOISE
### Low-value pages compete

Tag archives, pagination and thin utility pages get crawled alongside your best work. A curated file points models at what you would actually want quoted.

Anatomy

## What a valid llms.txt contains

### A single H1 with your site name

Exactly one *# Heading* at the top. More than one confuses parsers about which is canonical; zero leaves the file unattributed.

### A summary blockquote

One *>* line directly under the title, describing what the site offers in a sentence. This is the part most generated files omit and the part that matters most.

### Section headings

*## Docs*, *## Products*, *## Guides* — grouping that mirrors how a person would ask about your site, not how your CMS happens to store it.

### Annotated markdown links

Each link followed by a short description of what the page covers. The annotation is what lets a model choose between two similar URLs without fetching both.

The tool

## Validate your llms.txt, or generate one from your sitemap

Enter a domain. If an llms.txt exists we check it against the spec and show you a preview. If it does not, we build a starter file from your sitemap that you can edit and upload.

Check llms.txt

Reads only public files. Nothing is stored.

Reading your results

## What the checks are testing for

6/6
### Spec-complete

Title, summary, sections and annotated links all present. Assistants can parse your structure without inference.

4–5/6
### Usable, incomplete

Typically a missing summary line or no section grouping. Functional, but you are leaving the most valuable signal on the table.

Absent
### No file at all

Nothing curated for AI systems. Generate a starter file below, edit the summary, group the sections, and upload it to your site root.

The honest version

## llms.txt is a young convention, not a ranking factor

### What it will not do

Adding llms.txt does not make you rank, does not guarantee citation, and is not confirmed as a signal by any major model provider. Anyone selling it as a ranking lever is overstating it.

### Why it is still worth ten minutes

It costs almost nothing, it removes ambiguity about your positioning, and adoption is growing quickly among documentation sites and SaaS products. Cheap, reversible, and it forces you to articulate what your site is for — which is useful regardless.

Common questions

## llms.txt, answered plainly

Where does the file go?
At your site root, served as plain text: *yourdomain.com/llms.txt*. Same location convention as robots.txt.

Does it replace robots.txt?
No, they do opposite jobs. robots.txt restricts access; llms.txt curates and describes. You want both, and they should not contradict each other — check your crawler access with our [AI crawler tool](https://moxseo.com/tools/ai-crawler-access-checker/).

My CMS generates one automatically. Is that enough?
Usually not. Auto-generated files tend to dump every URL without grouping or annotation, and most omit the summary blockquote entirely. A generated file is a reasonable starting point that still needs a human pass.

How large should it be?
Curated, not exhaustive. A few dozen well-annotated links beats several hundred bare URLs. If your file is hundreds of kilobytes, it is a sitemap wearing a costume.

How often should I update it?
Whenever your site structure changes meaningfully. Watch for staleness — a file listing pages you deleted months ago actively misleads the systems reading it.

Next step

## A good llms.txt is a symptom of a well-structured site, not a substitute for one

If writing the summary line is hard, that is usually a positioning problem rather than a file-format problem — and it is worth solving either way.

[AI SEO services](https://moxseo.com/services/seo/ai/)[See all free tools](https://moxseo.com/tools/)

(function(){
  var inp=document.getElementById('lt-in'),btn=document.getElementById('lt-go'),out=document.getElementById('lt-out');
  if(!inp||!btn||!out)return;
  function esc(s){var d=document.createElement('div');d.textContent=s==null?'':s;return d.innerHTML;}
  function note(m,c){return ''+m+'';}
  function build(host,urls){
    var s='# '+host+'\n\n> One sentence describing what this site offers. Replace this line.\n\n## Pages\n\n';
    urls.forEach(function(u){
      var p=u.replace(/^https?:\/\/[^\/]+/,'').replace(/\/$/,'');
      var n=p===''?'Home':p.split('/').filter(Boolean).pop().replace(/[-_]/g,' ').replace(/\b\w/g,function(c){return c.toUpperCase();});
      s+='- ['+n+']('+u+'): Short description of what this page covers.\n';
    });
    return s;
  }
  function run(){
    var d=(inp.value||'').trim();
    if(!d){out.innerHTML=note('Enter a domain to check.');return;}
    btn.disabled=true;btn.textContent='Checking...';
    out.innerHTML=note('Looking for llms.txt on '+esc(d)+'...');
    fetch('/wp-json/moxtools/v1/llms?domain='+encodeURIComponent(d))
      .then(function(r){return r.json().then(function(j){return {s:r.status,j:j};});})
      .then(function(res){
        btn.disabled=false;btn.textContent='Check llms.txt';
        var j=res.j;
        if(res.s!==200||j.error){out.innerHTML=note(esc(j.error||'Something went wrong.'),'#e34d5b');return;}
        var h='';
        if(j.exists){
          var ck=j.checks||[],pass=ck.filter(function(x){return x.pass;}).length;
          var col=pass===ck.length?'#16a077':'#e8a20c';
          h+='';
          h+='Validation for '+esc(j.host)+'';
          h+=''+pass+'/'+ck.length+'spec checks passed · '+Number(j.bytes).toLocaleString()+' bytes';
          ck.forEach(function(x){
            h+=''+(x.pass?'\u2713':'!')+''+esc(x.label)+''+esc(x.detail)+'';
          });
          h+='';
          if(j.preview){h+='First 1,200 characters
```
'+esc(j.preview)+'
```

';}
        } else {
          h+='Result for '+esc(j.host)+'No llms.txt found
AI assistants have no curated map of this site and must infer its structure from crawling alone.

';
          if(j.sitemap_found&&j.sitemap_urls&&j.sitemap_urls.length){
            h+='Starter file from your sitemap
Built from the first '+j.sitemap_urls.length+' URLs. Edit the summary line, group pages into meaningful sections, replace the placeholder descriptions, then save as llms.txt at your site root.

'+esc(build(j.host,j.sitemap_urls))+'';
          } else { h+=note('No sitemap found at /sitemap_index.xml or /sitemap.xml, so a starter file could not be generated automatically.'); }
        }
        out.innerHTML=h;
      })
      .catch(function(){btn.disabled=false;btn.textContent='Check llms.txt';out.innerHTML=note('Request failed. Please try again.','#e34d5b');});
  }
  btn.addEventListener('click',run);
  inp.addEventListener('keydown',function(e){if(e.key==='Enter'){e.preventDefault();run();}});
})();

/* .mox-lt base: light surface */
.mox-lt h1,.mox-lt h2,.mox-lt h3,.mox-lt h4{color:var(--mox-ink)!important}
.mox-lt p,.mox-lt li,.mox-lt td{color:var(--mox-ink-soft)!important}
.mox-lt .sub,.mox-lt .lead,.mox-lt .hint{color:var(--mox-ink-soft)!important}
.mox-lt .card h3{color:var(--mox-ink)!important}
.mox-lt .card p{color:var(--mox-ink-soft)!important}
.mox-lt .band h3{color:var(--mox-ink)!important}
.mox-lt .band p{color:var(--mox-ink-soft)!important}
.mox-lt .faq summary{color:var(--mox-ink)!important}
.mox-lt .faq p{color:var(--mox-ink-soft)!important}
.mox-lt .eyebrow,.mox-lt .chip{color:var(--mox-primary)!important}
.mox-lt a{color:var(--mox-primary)!important}
.mox-lt .btn--p{color:#fff!important}
.mox-lt .btn--ghost{color:var(--mox-ink)!important}
.mox-lt .band--a .band__t{color:var(--mox-good)!important}
.mox-lt .band--b .band__t{color:var(--mox-warn)!important}
.mox-lt .band--c .band__t{color:var(--mox-risk)!important}
/* .mox-lt dark surfaces */
.mox-lt .trust__row,.mox-lt .trust__row span{color:#a7acb5!important}
.mox-lt .sec--dark h1,.mox-lt .sec--dark h2,.mox-lt .sec--dark h3,.mox-lt .sec--dark p,.mox-lt .sec--dark li{color:#f4f4f6!important}
.mox-lt .sec--dark .sub,.mox-lt .sec--dark .eyebrow{color:#a7acb5!important}
.mox-lt .final h1,.mox-lt .final h2,.mox-lt .final h3{color:#fff!important}
.mox-lt .final p,.mox-lt .final .sub{color:#a7acb5!important}
.mox-lt .final .eyebrow{color:var(--mox-accent)!important}
.mox-lt .final .btn--dg{color:#fff!important}
.mox-lt .sample__tag{color:var(--mox-accent)!important}
.mox-lt .sample__num{color:var(--mox-accent)!important}
.mox-lt .sample__lbl,.mox-lt .sample__note{color:#85898f!important}
.mox-lt .sample__row span{color:#85898f!important}
.mox-lt .sample__row b{color:#fff!important}
.mox-lt .ticks span{color:var(--mox-ink-soft)!important}
