Skip to main content
Geo Fundamentals

llms.txt and AI-Crawler Access: A Practical Guide for Local Sites

July 27, 202611 min read2,210 words
Anthony (Tony) Velte, Founder & Principal of LocalStar Digital

Anthony (Tony) Velte

Founder & Principal · Author of 12+ books

The short version: allow the AI crawlers, then add an llms.txt

If you want a local business to surface when someone asks ChatGPT, Perplexity, or Google's AI answers for a recommendation, do two things at the file level: allow the major AI crawlers in your robots.txt rather than blocking them, and publish an llms.txt that hands those models a short, curated map of your most important pages. robots.txt decides whether a crawler may fetch your site at all. llms.txt is a separate, voluntary file that tells a language model what's worth reading first. Different files, different jobs. Below I'll cover what each one is, which user-agents to name (GPTBot, ClaudeBot, PerplexityBot, CCBot, and a couple more), why blocking AI crawlers usually backfires for a local business, and the thirty-second raw-HTML check that determines whether any of it matters at all.

I spent three decades in enterprise IT before founding LocalStar Digital, and this pattern repeats in every platform shift I have lived through: the technical defaults that ship with your tools quietly decide your visibility, and almost nobody opens the file to read them. The AI-search era runs on the same rule. Whether an AI assistant can cite you often comes down to two text files most owners have never looked at.

What robots.txt actually controls (and what it doesn't)

robots.txt is a plain-text file at the root of your domain (yourdomain.com/robots.txt) that tells automated crawlers which parts of your site they may request. It has governed traditional search crawlers for years, and AI operators adopted the same convention for their bots. The mechanism is simple: you name a crawler by its user-agent, then Allow or Disallow paths. The important caveat is that robots.txt is an instruction, not a wall. It is honored voluntarily by the documented, well-behaved crawlers the major AI companies publish, which happens to be exactly the set a local business cares about being cited by.

What robots.txt does not do is improve how a model understands your content. A crawler you let in still has to make sense of whatever HTML it fetches. robots.txt governs access; comprehension and citation happen only after the crawler is through the gate. Closing that second gap is the job of llms.txt and clean server-side HTML, and it is why "we allowed the bots" is necessary but nowhere near sufficient. (Several of the terms in this section — user-agent, render gap, crawler — are defined in our GEO glossary.)

A useful split: robots.txt answers "may you fetch this?" llms.txt answers "here's what actually matters and where to find it." Ship one without the other and you leave citations on the table.

The AI crawlers to name explicitly — GPTBot, ClaudeBot, PerplexityBot, CCBot

Each major AI operator publishes the user-agent string its crawler sends, and the cleanest robots.txt names them explicitly instead of relying on a catch-all. The user-agent is simply the identifier a crawler announces so your server can recognize it. These are the ones worth knowing by name, with the operator behind each.

The crawlers most relevant to a local business, and who runs them:

  • GPTBot — OpenAI's crawler, associated with ChatGPT. OpenAI documents it and its user-agent string in its published bots documentation.
  • ClaudeBot — Anthropic's crawler. Anthropic publishes its crawler identifiers and how site owners control access through robots.txt in its developer documentation.
  • PerplexityBot — Perplexity's crawler for its answer engine. Perplexity documents the user-agent in its developer and support material.
  • CCBot — Common Crawl's crawler. Common Crawl is not an AI company, but its public dataset is a widely used training and retrieval source, so it deserves a deliberate decision rather than an accident.
  • Google-Extended — Google's separate control token governing whether your content is used for its AI products, distinct from regular Googlebot indexing.
  • Bingbot — worth knowing because Microsoft Copilot and Bing's AI features build on the same Bing crawl, so your Bing access also shapes that surface.

Two honest caveats. First, this list moves: operators add, rename, and retire crawlers, so the canonical reference is always the operator's own documentation, not a blog post (this one included). Confirm the current user-agent string at the source before you commit it to a file. Second, naming a crawler in robots.txt is a public, voluntary control. The documented crawlers above respect it; it is not a security boundary and not how you stop a bad actor. For the legitimate AI engines a local business wants citations from, it is precisely the right tool.

Why blocking AI crawlers usually backfires for a local business

When AI crawlers first showed up in server logs, a wave of advice told owners to block them and "protect" their content. For a large publisher with a licensing strategy and content worth metering, that can be a defensible business call. For a local business whose growth depends on being found and recommended, it is almost always the wrong one. The logic is direct: if a model's crawler cannot fetch your pages, the model has nothing of yours to cite. You are not guarding an asset; you are deleting yourself from the answer.

The deeper trap is that the block is frequently not a decision at all. A number of website platforms and security plugins now ship with AI-bot blocking switched on by default, framed as a privacy feature, with the setting buried where no owner would think to look. So the most common version of this mistake is silent: a business that would gladly be cited has quietly told every AI engine to stay out, and nobody chose that on purpose. Treat AI-crawler access the way you treat the phone number on your own homepage — a setting you verify, not one you assume is right.

If you sell to local customers, default to allowing the documented AI crawlers and reconsider only if you have a specific content-licensing reason to restrict them. Blocking-by-default trades away citations you want for protection you probably don't need.

What llms.txt is, and what a good one looks like

llms.txt is a separate file, also at your domain root (yourdomain.com/llms.txt), that gives a language model a hand-curated overview of your site's most important content. It is a community proposal rather than an official standard, published at llmstxt.org and written in plain Markdown so a model can parse it trivially. Where robots.txt is a list of permissions, llms.txt reads like an editorial table of contents: these are the pages that actually matter, grouped by topic, each with a one-line description. The value is in the editing, not the listing.

A good llms.txt for a local business is short and curated, never a sitemap dump. It typically opens with a single H1 of the business name, a one-paragraph summary of who you are and where you operate, then a few Markdown link sections — Services, Service Area, About, Contact — pointing to the ten to thirty pages most worth reading, each with a terse description. Curation is the whole discipline. A file that lists every URL recreates the exact noise a model would otherwise have to wade through, and throws away the one advantage the format gives you.

What separates a useful llms.txt from a useless one:

  • Curated, not exhaustive — your best ten to thirty pages, not every URL on the domain.
  • Grouped by topic — services, service area, about, contact — so the structure is legible at a glance.
  • One line per link — say what each page answers, not just that it exists.
  • Accurate to the live site — stale or broken links in llms.txt actively mislead; maintain it like any other published page.
  • Honest scope — point to content that genuinely exists and says what it claims; it is not a place to assert things your pages don't back up.

Set one expectation plainly: llms.txt is emerging, not universal. Adoption is uneven across engines today, and the value it delivers depends on which models choose to consume it and how. We treat it as a low-cost, high-signal file worth shipping now — it takes about an hour to write well and harms nothing — rather than as a guaranteed ranking lever. Being candid about the maturity of a tactic is part of doing this work credibly.

The check that decides whether any of this matters: raw HTML

Here is the part that quietly defeats more local sites than robots.txt and llms.txt combined. Most AI crawlers do not run JavaScript. They fetch your raw HTML and read what is in it, full stop. If your headings, body copy, and contact details are injected by JavaScript after the page loads — common on drag-and-drop builders and client-side-rendered frameworks — then the crawler you carefully allowed in fetches a nearly empty shell. This is the render gap, and it hides in plain sight: your own browser runs the JavaScript the crawler skips, so the page looks complete to you and arrives blank to the model.

The test takes thirty seconds and is the single highest-value step on this list. Open any important page, right-click, and choose View Page Source — the raw HTML, not the Inspect or Elements view, which shows the rendered result after JavaScript has run. Search that source for your own headline, your phone number, your service-area towns. If text you can see on screen is missing from the source, AI crawlers are missing it too. The fix is server-side rendering or static generation, so the content lives in the initial HTML response. Until that is true, allowing crawlers and publishing an llms.txt are signposts pointing at an empty page.

View Page Source, then Ctrl-F (Cmd-F on Mac) your own phone number. If it isn't in the raw HTML, no AI crawler can cite it — and no robots.txt or llms.txt change will fix that. Server-side rendering will.

How to put it together — and where LocalStar fits

The order of operations is what makes this practical. First, confirm your content is actually present in the raw HTML — the render-gap check above — because nothing downstream matters if it isn't. Second, verify your robots.txt allows the documented AI crawlers (GPTBot, ClaudeBot, PerplexityBot, CCBot, Google-Extended) instead of blocking them by accident, using each operator's current published user-agent. Third, write a short, curated llms.txt and keep it in sync with the live site. None of the three is hard on its own. The value comes from doing all three and verifying each on the served page rather than trusting that the defaults were sane.

That sequence is the technical floor of how we approach AI visibility at LocalStar Digital, and it maps to the access and rendering dimensions of our SignalScore methodology — our way of measuring how discoverable and citable a local business is to AI engines. If you would rather have the raw-HTML, robots.txt, and llms.txt state of your site checked and corrected for you, that is exactly what a SignalScore audit covers. Email us at hello@localstardigital.com or use the contact page, and we'll show you where your site stands before you commit to anything.

Frequently Asked Questions

No. They live in the same place (your domain root) and both speak to crawlers, but they do different jobs. robots.txt controls access — which crawlers may fetch which paths. llms.txt is a voluntary, curated overview that tells language models which of your pages are worth reading first and how the site is organized. robots.txt is the gate; llms.txt is the short directory you publish for the crawler once it's in. You want both, and neither substitutes for the other.

For most local businesses, no. If a model's crawler can't fetch your pages, the model has nothing of yours to cite, so blocking removes you from AI answers rather than protecting an asset. Blocking can make sense for large publishers with content-licensing strategies, but a business that depends on being found should default to allowing the documented AI crawlers. The most common error here is accidental — some platforms block AI bots by default — so the real task is to verify the setting rather than leave it to chance.

The ones worth naming explicitly are GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot (Perplexity), CCBot (Common Crawl), and Google-Extended (Google's AI-use token, separate from Googlebot). Because operators add and rename crawlers over time, confirm the current user-agent string in each operator's own published documentation before adding it — any blog list, this one included, can go stale; the operator's docs are the source of truth.

Open an important page, right-click, and choose View Page Source — the raw HTML, not the Inspect or Elements view. Use Ctrl-F (Cmd-F on Mac) to search for your own headline, phone number, and service-area towns. If that text appears on screen but is missing from the source, your content is being rendered by JavaScript that most AI crawlers don't run, and they can't see it. The fix is server-side rendering or static generation so the content is present in the initial HTML response.

It's an emerging community proposal, not an official or universally adopted standard, so its impact depends on which engines choose to consume it. We treat it as a low-cost, high-signal file: a good curated one takes about an hour to write, it harms nothing, and it positions you well as adoption grows. We'd rather ship it now than treat it as a guaranteed ranking lever — and being clear about that maturity is part of giving honest advice.

Ready to improve your AI visibility?

Book a strategy call. We will audit your search and AI presence and recommend a plan tailored to your business.