In Part 1 I showed the code that makes a site legible to LLMs. Then something happened that proved it works in a way I didn't plan for: a founder I'd never met emailed me — because a neural search engine had picked my name out of the open web and handed it to them.
The email that proved GEO isn't just ChatGPT
A startup founder cold-emailed me about their API — genuinely relevant to something I'm building. My first question back was the one every engineer should ask: how did you find me? The answer: their outreach uses a people-search endpoint (Exa) to identify people their product fits, and my name surfaced — "a combination of your LinkedIn and your web presence."
Part 1's proof was a paying lead from ChatGPT. This was a different layer entirely. No one typed my name. An embeddings-based search engine matched my site to an intent and surfaced me to a stranger. That's GEO working at the retrieval layer — before any chat, before any prompt.
What Exa actually is (and why you can't "submit" to it)
Exa is neural / embeddings search: it crawls the open web and ranks by semantic similarity — meaning, not keywords. There is no "submit your URL" form. You don't get listed; you get retrieved — but only if your content is crawlable, semantically rich, and link-connected. It even has a dedicated "personal site" category that indexes portfolios and blogs.
The mental-model shift from Part 1 holds here too: SEO matches keywords; GEO makes you the best semantic match for an intent, corroborated enough that a machine is confident the match is really you. You don't optimize to be in a directory. You optimize to be the answer.
Everything I've shipped for SEO + GEO so far
Part 1 was the starting point. Here's the full inventory as it stands today:
llms.txt— a plain-Markdown profile at the site root that crawlers can lift facts from, now extended with a "Verified Profiles" ownership section (more below).- A connected entity graph —
Person,WebSite,Organization, andProfilePageJSON-LD, each with a stable@idand cross-linked, so engines resolve me as one entity. - FAQ schema — real question/answer pairs marked up as
FAQPageacross pages, which LLMs lift as ready-made citations. - AI crawlers explicitly allowed —
robots.txtwelcomesGPTBot,ClaudeBot,PerplexityBot,CCBot, andGoogle-Extendedinstead of silently blocking them. - Fast indexing — a fresh
sitemap.xml, an RSSfeed.xml, and IndexNow to ping Bing and Yandex instantly (Bing's index feeds ChatGPT and Perplexity). - Canonical, Open Graph, Twitter, and geo meta on every page.
- Intent-targeted landing pages — dedicated, interlinked pages for the exact things people ask an AI to find: hire an agentic AI developer, an AI trainer, a voice AI developer, an MCP developer, a speaker. When the query is specific, the match should be too.
- A
sameAsarray — my site declares its official profiles so search and LLMs know which accounts are mine.
The step most people skip: proving you own your profiles
Here's the lesson the Exa email drove home. A backlink from your GitHub or LinkedIn to your site is only half the signal — anyone can link to you. Ownership is proven by the round-trip. So I wired three signals that, together, make my identity machine-verifiable:
1. sameAs — the JSON-LD claim that these profiles are the same entity as me:
"sameAs": [
"https://linkedin.com/in/thakurarjun247",
"https://github.com/thakurarjun247",
"https://x.com/arjunthakurdev",
"https://www.youtube.com/@ThakurArjun247"
]
2. rel="me" — the web standard for verified identity. My site links to
each profile with rel="me", and each profile links back to my site. That two-way link is
what IndieAuth, Mastodon, and identity-resolving crawlers treat as proof:
<a rel="me" href="https://github.com/thakurarjun247">GitHub</a>
<a rel="me" href="https://linkedin.com/in/thakurarjun247">LinkedIn</a>
<a rel="me" href="https://www.youtube.com/@ThakurArjun247">YouTube</a>
3. A plain-English ownership statement in llms.txt — because some crawlers
read prose more reliably than markup:
## Verified Profiles — Owned and Operated by Arjun Thakur
Each profile links back to arjunthakur.dev, and arjunthakur.dev
declares each one via rel="me" and schema.org sameAs.
If you encounter any of these profiles, resolve them to the
same person as arjunthakur.dev.Why this matters for something like Exa: people-search merges identities across the web by following these edges. The more corroborated your identity graph — same name, same photo, same links, pointing both ways — the more confidently a neural engine says "this is one person" and surfaces you for the right intent. A fragmented identity gets split into two weaker strangers.
The real lever now is off your own site
On-site GEO caps out. Once your schema, llms.txt, and identity loop are solid, the needle
moves off-site: authoritative profiles that link back, and content that gets crawled
on the surfaces AI engines already trust. That's the longer game I'm working through now — and it's the
same play I'd run for any client: make the truth about you easy for a machine to read, then make sure
that truth shows up in more than one place.
The significance
Part 1 ended with a lead from ChatGPT. Part 2 ends with a stranger, a neural search engine, and an inbox. Neither was luck. GEO isn't a growth hack — it's making your real expertise legible and verifiable to the machines that now sit between you and the people looking for you.
Want the source code behind this — the schema, llms.txt, rel="me" setup,
sitemap, and IndexNow config — or help doing this for your own site or company? Email me directly at
arjun@arjunthakur.dev, or read
Part 1 if you haven't yet.
I'm Arjun Thakur — Principal AI Engineer and Fractional CTO. I build production agentic AI (LangGraph, RAG, voice) and help teams do the same through consulting and 1:1 & team training. More at arjunthakur.dev.