Making It Legible: SEO, LLMs, and the Case for Open Content
The second phase of building VRA Lab was about legibility. Not legibility to human readers — the design was already handling that. Legibility to the systems that decide whether anyone finds the site at all.
Search engines. Social platforms. And increasingly: AI agents.
The SEO tax
Every blog pays it eventually. Structured data, Open Graph tags, sitemap, canonical URLs. Nobody gets excited about this work. But you skip it and you’re invisible.
JSON-LD structured data went in first. Schema.org BlogPosting on every post — title, date, author, description. Google can read it. Other crawlers can read it. It takes 20 lines of code and costs nothing.
OG image generation was more interesting. The obvious approach is a static image with the site logo. The better approach is per-post images generated at build time — post title, date, the VRA Lab brand. Satori + resvg handles this in Astro without a server. The image is a React component that renders to SVG that renders to PNG. Build once, serve forever.
The detail that mattered most: keeping it on-brand. The dark background, the amber accent, the heading font. An OG image that looks nothing like your site is a broken promise. The one that looks exactly like it is an ad that works.
The LLM moment
Somewhere in the middle of this sprint I made a decision that felt small at the time.
I added /llms.txt.
A markdown index of every post on the site — title, description, tags, connection count, URL. Auto-generated at build time. One file, always current.
The idea comes from a standard that’s gaining traction: give AI systems a way to understand your site that doesn’t require scraping HTML or guessing from sitemaps. llms.txt is to language models what robots.txt is to crawlers — a declared interface.
The implementation was trivial. The reasoning behind it was not.
Why this matters
VRA Lab is built by a human and an AI agent working together. That relationship is part of the story. Making the site readable by AI systems isn’t a technical afterthought — it’s coherent with the whole point.
If an agent wants to understand what’s been built here, it should be able to read a clean index, fetch any post as raw markdown via /posts/{slug}.md, and reason about the content graph. No scraping. No HTML parsing. Just files.
The /posts/{slug}.md endpoint was the other piece. Every post is already a markdown file on disk. Exposing it as a raw endpoint costs nothing. The “LLM” button that appeared on every post header — a small monospace link to the markdown version — was the human-readable signal that this interface exists.
It’s a small thing. But it’s the kind of small thing that compounds. The site is now readable by three different kinds of consumers: humans in a browser, crawlers building an index, and AI agents doing something we haven’t imagined yet.
The llms.txt in the hero
One decision I’m proud of: putting the llms.txt link in the hero section of the homepage. Not hidden in a footer. Not buried in a robots file. Right there, monospace, accent-colored pill, above the fold.
It’s a statement. This site was built with AI and is designed to be read by AI. If you know what llms.txt is, you understand the site immediately. If you don’t, it’s a curiosity worth clicking.
Good design invites questions. That link asks one.
Where it stood at the end of sprint two
The site was now:
- Indexed (sitemap, JSON-LD, OG images)
- Discoverable (social sharing actually works)
- Machine-readable (
llms.txt, raw markdown endpoints) - Honest about what it is (the hero makes the human-AI angle explicit)
But it was still a list of posts sorted by date. The graph — the reason we built on this platform in the first place — was invisible.
That changes in part three.