u/jonoalford

What we'd tell anyone evaluating their CMS for "AEO" right now
▲ 17 r/sanity_io+1 crossposts

What we'd tell anyone evaluating their CMS for "AEO" right now

Hey folks, wanted to write this, because we get this question come up enough, that we wanted to try and answer it in a very opinionated way.

With every Sanity, Contentful and WordPress (migration) project we've scoped this year, somebody asks the same thing in the first call: what do we actually need to do about AEO? The vast majority of answers on LinkedIn are course-selling. A meager few are useful.

Instead, I'd like to give you a first-hand account of what we shipped on our own site this year (and a little bit in 2025), what moved in the logs after, and the bits we'd quietly skip.

The SEO half hasn't changed

We've always had clean titles. Real backlinks. JSON-LD derived from our fields, and only once a long time ago, spammed a bit of programmatic content. Everybody was doing it, give us a rest.

However, this part of the site, is a baseline and the big thing I would advise looking at before you touch anything ahead.

The new bit: content negotiation

Agents are a new visitor class. ChatGPT, Claude, Perplexity, every coding agent crawling for context. They mostly can't render JavaScript reliably, although this is changing. Their context windows are small enough that wasted tokens cost real money.

The fix has been in the HTTP spec since 1996. When the Accept header asks for text/markdown, serve markdown. When it asks for HTML, serve HTML.

The markdown twin of any page on our site is roughly 94% smaller than the HTML version. No fonts or analytics, just the actual content. Most headless CMSs let you wire this up in a route handler or middleware in an afternoon. WordPress is harder but doable via a plugin or a reverse proxy.

There's a great article about it here

Worth doing

  • Publish an llms.txt at the root, and a sitemap.md alongside your XML sitemap. Anthropic's fetcher and Perplexity's crawler both consume them. It costs nothing.
  • Make sure you connect a publishedAt and updatedAt visibly on every blog post, and wire both into BlogPosting JSON-LD. Recency is a heavy citation signal in AI answers right now.
  • Let GPTBot, ClaudeBot and PerplexityBot in via robots.txt. Block scrapers that take your content without attribution. (Side note: GPTBot hit us at 17K requests in one hour the week after we shipped llms.txt. They read it.)

Skip

  • Tools promising guaranteed citation in ChatGPT. Nobody on earth can promise that.
  • Loading up your pages with every Schema.org type you can find. You need three or four. The rest is noise that confuses the parsers.
  • Programmatic content/social tooling. You can streamline a lot of these with internal agents, but ultimately you want a human touch or you content will sound like ass.

We wrote a post about this if you want the long version.

Happy to get into specifics for any CMS in the comments. The patterns port pretty cleanly across the headless ones. WordPress I can vent about...

u/jonoalford — 3 days ago