Notes · 29 August 2026

What it actually takes to make a site legible to an AI

I build a tool that measures how language models describe law firms, then found my own site invisible to the same systems. Here is what was actually missing.

I build FirstChair, which tracks how ChatGPT, Gemini and Perplexity describe a law firm against its competitors. So it was a little humbling to search my own name and find nothing at all.

The reflex is to assume something is broken. Nothing was. The site had valid structured data, a clean sitemap, a robots.txt that welcomed every crawler by name, and passing accessibility checks. It was simply not discovered yet, and those are different problems with different fixes.

Metadata does not cause crawling

This is the part I had backwards. Structured data controls how you are represented once a crawler has your page. It does nothing to make the crawler arrive. A new domain with no inbound links is invisible until either a link from an already-trusted site leads a crawler to it, or you tell a search engine directly through its webmaster tools.

I had spent my effort on representation and none on discovery. Both matter, and they are not interchangeable.

An entity, not a set of pages

The thing that changed how I built the markup: search and answer engines are not trying to rank documents about me, they are trying to resolve one entity. Every page emitting its own Person object gives them several people who happen to share a name. One @id, referenced everywhere, gives them one.

That reframing makes a lot of small decisions obvious:

  • Name variants belong in the data. My name gets written Nikhilvarma Kandula, Nikhil Varma Kandula, and occasionally family name first. Those are alternateName entries, not three different people.
  • A common surname needs disambiguation. Kandula is shared with a Wikipedia-notable executive and several companies. disambiguatingDescription is the field that says which one this is.
  • Products belong on the person. Naming what I built on the Person node itself, rather than leaving it to be inferred from the project pages, is the difference between “a portfolio” and “someone who built these things.”

Write the sentence you want quoted

The clearest lesson, and the one that transfers directly from FirstChair: a language model quotes sentences that stand alone. “A powerful, best-in-class solution” is unquotable. It asserts something no one can verify, and these systems are tuned to discount exactly that. “Turns a photographed grocery receipt into a nutrition summary” gets quoted, because it survives being lifted out of its paragraph.

Superlatives feel like they are doing work. They are the thing most likely to get your page skipped.

What was actually missing

In order of how much it mattered:

  1. Nobody had told Google the site existed. Search Console verification and a submitted sitemap, which no amount of markup substitutes for.
  2. Almost no inbound links. Discovery and trust both travel along links.
  3. No page whose heading was my name. Every page was about the work, and none of them answered “who is this.”
  4. Share cards had drifted from the content. I renamed two products and the cards still announced the old names, which is the kind of quiet inconsistency that makes an entity harder to resolve, not easier.

None of that is clever. It is the boring half of the job, and I had skipped it while doing the interesting half carefully.