← All notes
/
AI EngineeringSEOStructured Data

Why I Made This Site Readable by Machines, Not Just Humans

A site now has two kinds of reader, and only one of them renders a page. Crawlers, retrieval pipelines, and agents pull the raw document straight into a context window and answer out of it, so a site built only for a person scrolling and reading is serving half of its actual audience. I added the other half: an llms.txt at the site root (a plain-text summary of the site and the work behind it, structured for a language model's context window rather than a browser's rendering engine), JSON-LD Person schema on every page, and real canonical URLs for these notes at /blog/{slug} instead of leaving them buried as anchors inside one long scrolling page. Same content, now individually addressable, cacheable, and citable.

The more interesting find while doing this wasn't a feature, it was a bug. My static-site adapter's SPA fallback page and the prerendered root route both wanted the filename index.html, and the fallback was winning the write, silently replacing the real homepage (title, description, Open Graph tags, all of it) with an empty shell at build time. Every crawler and every link preview had been getting nothing. The fix was a one-line rename, but the lesson generalizes: a static site's build output is not implied by its source, so verify what actually ships, especially at the config layer nobody re-reads after initial setup.