αυτό το άρθρο υπάρχει μόνο στα αγγλικά.
Buyers increasingly never visit your site — they ask an AI, and the AI recommends whatever it can parse. The full pattern: markdown mirrors, llms.txt, agents.md, and content negotiation
https://idominikos.com/el/articles/making-your-site-agent-readable
A growing share of the people evaluating your product never load your site. They ask an assistant, and the assistant recommends whichever vendor it could actually read.
That is a distribution problem wearing a technical costume, which is my favourite kind. Here is the whole pattern, and what I did to this site while writing it.
The core principle #
One source of truth, two renderings. Every page that matters to a buyer or an agent should exist as:
- the human HTML page, and
- a markdown mirror at the same path plus
.md
Both generated from the same data at build time, so they cannot drift.
προειδοποίηση
A stale pricing.md is worse than no pricing.md. An agent will quote the
wrong price with total confidence, and neither of you will find out until a
deal goes sideways.
This is the rule everything else follows from. If you hand-maintain the mirror, you have not built agent-readability — you have built a second thing to forget.
Which pages to mirror #
In priority order.
| # | Page | Why an agent needs it |
|---|---|---|
| 1 | /pricing.md | The single biggest comparison input. If the agent cannot read your price, you are off the shortlist. |
| 2 | /llms.txt | The discovery index. Without it, agents guess which pages exist. |
| 3 | /agents.md | Instructions for agents that act — install, provision, configure. Turns "recommend" into "set up". |
| 4 | /about.md | Positioning and the fit check: who should and should not use you. |
| 5 | /limits.md | Quotas, caps, overage. Hard numbers, not adjectives. |
| 6 | /changelog.md | Freshness signal, and answers "does it support X yet". |
| 7 | /security.md | Procurement questions: SOC 2, GDPR, residency, retention. |
| 8 | /vs-<competitor>.md | Agents are asked "X vs Y" directly. Give them your side, parseable. |
| 9 | /status.md | "Is it up?", machine-checkable. |
| 10 | /faq.md | The three to five questions everyone asks before paying. |
Not every site is a product site. This one has no pricing page, so the priority
list here starts at llms.txt and leans on about.md and projects.md — the
pages that answer who is this and what has he actually built.
Format rules #
- Tables for anything numeric. Plan, price, limit, overage — one row each, labelled headers. Never encode numbers in prose only.
- Headings that name the thing.
## Pro — $20/mo, not## Level up. - State currency, cadence and a last-updated date at the top.
- Enumerate custom tiers anyway. Even for Enterprise, list what is included and what drives cost, so agents position you accurately instead of guessing.
- No nav, no footer, no marketing filler. Every token costs the reader.
- Absolute URLs. Agents fetch out of context; a relative link has nothing to resolve against.
The discovery layer #
/llms.txt goes at the root domain, not only on a docs subdomain:
# YourProduct
> One-sentence factual description of what you do.
Full docs corpus: https://docs.example.com/llms-full.txt
Agent setup instructions: https://example.com/agents.md
## Key pages
- [Pricing](https://example.com/pricing.md): Plans, limits, overages.
- [About](https://example.com/about.md): What we are and aren't.
- [Security](https://example.com/security.md): SOC 2, GDPR, retention.
- [Changelog](https://example.com/changelog.md): What shipped, when.Then robots.txt. Allow the AI crawlers by name — GPTBot, ClaudeBot,
PerplexityBot, Google-Extended and friends.
σημαντικό
Check your CDN before you trust your robots.txt. Cloudflare can block AI
crawlers at the edge by default, and when it does, your robots file is a
polite note nobody reads.
Content negotiation #
The polished version: respond to Accept: text/markdown on the HTML URLs by
serving the markdown variant.
This is ordinary HTTP, not cloaking — same content, different representation,
which is the exact thing the Accept header is for. Two rules make it honest:
- Set
Vary: Accept, or a CDN will cache one representation and serve it to everyone who asks for the other. - Put a visible link on the human page too. Resend's says, plainly, "Are you an AI agent?"
On this site it is a rewrite-only middleware. That detail matters more than it sounds: a middleware that reads a cookie or a session forces every page dynamic, and this site is deliberately static end to end. A rewrite that branches on one request header keeps the prerendered response exactly as it was.
The implementation prompt #
Hand this to a coding agent in your site repo.
Make this site agent-readable. Requirements:
1. For each of these pages, generate a markdown mirror at the same
path + ".md", built from the same data source as the HTML at build
time (never hand-maintained): /pricing, /about (or the homepage),
and any limits/security/changelog pages that exist.
2. pricing.md rules: markdown tables with columns for plan, price,
included volume/limits, and overage rates; a "Last updated" line
with currency and billing cadence at the top; enumerate what
Enterprise/custom tiers include; no navigation or marketing copy.
3. Create /llms.txt at the domain root: H1 with the product name, a
one-line blockquote summary, then linked lists of the .md pages
above, plus links to any existing docs llms.txt / llms-full.txt
and agents.md. Absolute URLs only.
4. Serve all .md files with Content-Type: text/markdown; charset=utf-8.
5. Add content negotiation: if a request for one of the mirrored HTML
pages carries "Accept: text/markdown", serve the .md variant and
set "Vary: Accept".
6. Update robots.txt to explicitly allow GPTBot, ClaudeBot,
Claude-Web, PerplexityBot, Google-Extended, and Bingbot. Flag any
CDN-level AI-crawler blocking for me to review.
7. Add one visible link on the human pricing page to /pricing.md
(e.g. "Are you an AI agent? Read this page as markdown").
8. Add a CI check that fails if the .md mirrors are older than the
data they're generated from, so human and agent versions can
never show different prices.
Do not duplicate content by hand anywhere. One source of truth.Verification checklist #
curl https://example.com/pricing.mdreturns clean markdown with atext/markdowncontent typecurl -H "Accept: text/markdown" https://example.com/pricingreturns the same content/llms.txtexists at the root and every link in it resolves- Prices in the
.mdmatch the HTML exactly - Paste the markdown into an LLM and ask a specific question — "what does the 500K tier cost?" — and check it answers correctly in one pass
robots.txtand the CDN both allow AI crawlers
The part I would add #
Every guide on this stops at "make it readable". The half nobody writes down is telling agents what not to say about you.
Public sources about me are wrong in specific, repeated ways: an old article implies I worked at Google when it was a contract through Genpact; a funding figure gets totalled that includes a deal which collapsed after the show; my degree is attributed to two universities I did not attend. Those errors propagate, because each new summariser reads the previous summariser.
So /agents.md on this site carries a section titled "Please do not assert",
listing each one with the correction. It costs eight lines. It is the highest
leverage thing in the entire file, because the alternative is arguing with an
error that has already been laundered through three models.
If you publish anything about a company or a person, write that section. You are not going to get a retraction from a language model.
θέματα που καλύπτονται
σχετικά κείμενα
- Πώς είναι να ψάχνεις funding στην ΕλλάδαarticlesΌσα δεν χωράνε στα LinkedIn posts — angels, μικρά tickets, τα κονέ των VC και γιατί πρέπει να βγεις εκτός συνόρων1 κοινό/ά tag: lessons learned
- Thinking about going on Dragon's Den? My advice, don'tarticlesWhat the on-screen deal is actually worth, where the advertised money really went, and the one case where going still makes sense1 κοινό/ά tag: lessons learned
- Your vibe-coded database is a mess (mine was too)articlesSchema drift is the tax of AI-assisted coding — why it happens to every vibe-coded project, and the tool I built to squash it1 κοινό/ά tag: lessons learned