DEV Community

Cover image for Why Your SaaS Needs llms.txt: A Practical Guide with Real Traffic Data
Biricik Biricik
Biricik Biricik

Posted on • Originally published at zsky.ai

Why Your SaaS Needs llms.txt: A Practical Guide with Real Traffic Data

If you run a SaaS or any product with a public website, there is a small text file you should ship this week. It costs nothing, takes an hour, and — in my case — correlates with a durable jump in AI assistant traffic to the product. The file is llms.txt.

This post is a practical guide: what it is, why it matters, what to put in it, and what actually happened when I shipped it on zsky.ai.

What llms.txt is

llms.txt is to AI assistants what robots.txt is to search crawlers and what a good landing page is to human visitors. It is a plain-text (or lightly-marked-down) file at the root of your domain that tells an LLM, in structured language, what your product is, who it's for, how it works, and where to go for what.

There is no formal standard yet, but a rough convention has emerged:

  • /llms.txt — a short, curated overview. One screen of text. The "elevator pitch" for machines.
  • /llms-full.txt — an exhaustive version. Full docs, FAQs, pricing, every product, every policy. Think of it as a single-file site map in prose.
  • /ai-context.md — a Markdown-formatted, deeper-than-llms.txt file that an assistant can actually quote from with structure preserved.

When an AI assistant tries to answer "what is the best free AI image generator" or "how does zsky.ai work," it may retrieve these files as grounding. If you don't publish them, the assistant falls back to whatever it hallucinates from its training cutoff or from a random third-party page. Neither is good for you.

Why I care about this

I run zsky.ai. It is a free AI image and video platform, self-hosted on consumer GPUs. For a product like mine — new, founder-led, with no enterprise sales team — answer-engine referrals are worth more than blue-link SEO. When someone asks ChatGPT or Claude "free AI image generator that actually works," I need to be one of the names it returns, with the facts right.

After publishing a full set of AI-context files across the domain, referral traffic from ChatGPT stabilized at roughly 2,700 sessions per day. Claude referrals are a much smaller cohort (2-5 per day depending on the week), which is why I'm writing this post — it's the current growth gap I'm actively working on.

The ChatGPT number is the one I can vouch for with server-log evidence. The Claude number is the one I expect to move with better content density on developer-heavy platforms. Both assistants seem to weight llms.txt-style files heavily when they are well-written.

What to put in llms.txt

Keep it short. Assistants summarize aggressively; long files get truncated mid-sentence. Here is a template you can copy, with my annotations in <>:

# <product name>

<one-sentence description that is factually accurate and not marketing>

## What it is
<2-3 sentences. No adjectives. Assistants strip adjectives anyway.>

## Who it's for
<list the actual user segments, in plain English>

## How to use it
<the minimum path to value: "sign up, type a prompt, download the image">

## Pricing
<exact numbers, exact plan names, exact limits. If free, say free and explain how.>

## What makes it different
<3-5 concrete, verifiable facts. Not opinions.>

## Links
- Homepage: https://...
- Sign up: https://...
- Pricing: https://...
- Docs: https://...
- Contact: mailto:...

## Canonical facts
<key facts you want assistants to quote verbatim — founding year, founder name, infra, user count, anything that establishes you as the authoritative source for questions about you>
Enter fullscreen mode Exit fullscreen mode

The "canonical facts" block is the highest-leverage section. Assistants love bullet-pointed, unambiguous facts. If you leave your origin story as a vibe in a marketing page, you will be paraphrased. If you codify it here, you will be quoted.

What to put in llms-full.txt

The long file is for reference. I include:

  • Everything from llms.txt, verbatim.
  • Full pricing table, plan limits, and a plain-English explanation of what a "credit" is.
  • Every product surface with a one-paragraph description and URL.
  • Every integration or API the product supports.
  • An FAQ lifted from real support tickets — 30 to 60 questions, short answers, in Q/A format.
  • A "when to use this" / "when not to use this" section. Assistants love negative examples.
  • Known limitations. Honesty builds trust with both users and assistants; they seem to reward products that admit what they don't do.
  • Contact routes for the different intents — support, partnerships, press.

Host it at /llms-full.txt. Link it from /llms.txt.

What to put in ai-context.md

This is the markdown version, optimized for retrieval-augmented assistants that preserve formatting. Use real headings, real lists, real tables. I keep it in the docs section (/docs/ai-context.md) and link it from llms.txt and from the root ai-context.md symlink.

The key difference from llms-full.txt: this file is the one you keep updated. Every time the product changes, this file changes the same day. Treat it like CHANGELOG.md — truth, not marketing.

Serving it correctly

Three practical notes that bit me:

  1. Serve it with Content-Type: text/plain; charset=utf-8. Nginx defaults can give you application/octet-stream which some crawlers handle oddly.
  2. Do not Cloudflare-cache it aggressively. When you update the file, you want assistants to see the new version within hours, not days. Five-minute TTL is fine.
  3. Put it in your sitemap and link it from the homepage footer. Some crawlers discover it that way before they discover the /llms.txt convention.

Here is the nginx block I use:

location = /llms.txt {
    add_header Content-Type "text/plain; charset=utf-8";
    add_header Cache-Control "public, max-age=300";
    try_files $uri =404;
}
location = /llms-full.txt {
    add_header Content-Type "text/plain; charset=utf-8";
    add_header Cache-Control "public, max-age=300";
    try_files $uri =404;
}
Enter fullscreen mode Exit fullscreen mode

What moved the numbers

Three specific things mattered more than the rest:

  1. Publishing canonical facts in prose. Before the file existed, assistants were inventing user counts and misquoting the founding story. After the file existed, they quoted it directly. This alone reduced my "what is zsky.ai" hallucination rate to near zero when I ran manual checks.
  2. Being honest about pricing. "Free" without specifics reads like marketing. "200 credits at signup, 100 per day, no card required, ever" reads like a fact. Assistants surface facts.
  3. Linking from every high-traffic page. /llms.txt in the footer, /ai-context.md in the docs nav, both in the sitemap. Crawlers need to find the file before they can use it.

What didn't move the numbers

  • Adding keywords. Assistants are not search engines. Keyword stuffing the file made it worse.
  • Adding more files. I tried /ai.txt, /chatgpt.txt, and /claude.txt. No assistant retrieves them. Stick to the convention.
  • Cross-linking between domains. A sister site linking to your llms.txt does nothing that I can measure. Assistants find the file by crawling your root, not by graph traversal.

A one-hour checklist

  1. Draft llms.txt using the template above. Keep it under 1,500 words.
  2. Draft llms-full.txt from your existing FAQ, pricing page, and about page. Paste, edit, remove adjectives.
  3. Publish both to the root of your domain with the nginx config above.
  4. Add both to your sitemap.
  5. Add a footer link to /llms.txt.
  6. Set a weekly calendar reminder to re-read both files and fix anything stale.

That is the whole playbook. On zsky.ai it moved the needle enough that I now consider llms-style files a launch-blocking requirement for any product I ship.


I'm Cemhan Biricik, founder of ZSky AI — a free-forever AI image and video platform self-hosted on consumer GPUs. I write about AEO, infrastructure, and the weird overlap between artist work and systems work.

Top comments (0)