Skip to content
IDEAS   /   SYSTEMS   /   EXPLORATIONOPEN A CONVERSATION
FIELD NOTES / SEO

SEO and GEO for a Personal Site: The Afternoon Playbook

How this site went from misattributed to ranked #1 for my name and legible to AI answer engines in an afternoon: canonical domain, per-page metadata, JSON-LD, a dynamic sitemap, Search Console as a diagnostic — then the GEO layer: AI-crawler allowances, llms.txt, RSS, and content concrete enough to quote.

SEOGEOWebMeta

This week I took this site from "technically online" to ranked #1 for my own name and legible to AI answer engines — in an afternoon, with everything verifiable. This post is the playbook: what SEO still is in 2026, what GEO (generative engine optimization) adds on top, and the exact order I'd do it in again. Everything below is implemented on the site you are reading.

SEO: being findable by search engines

SEO for a personal or product site is not a dark art. It is about eight mechanical things, and the tooling tells you when you got them wrong.

1. One canonical domain, everywhere. Pick the real domain and make every absolute URL agree with it: metadataBase, og:url, every sitemap <loc>, the robots.txt sitemap line, JSON-LD url fields, and redirects from any old domain. My bug: the site moved from a *.vercel.app URL to its own domain, but every generated URL still pointed at the old one. Google saw the old domain as the "real" site and the new one as a duplicate. One hard-coded constant, four files, whole site misattributed.

2. `rel=canonical` on every page. The one-line tag that tells a crawler which URL is authoritative when content is reachable more than one way. In Next.js this is alternates: { canonical: '/path' } per route — with metadataBase set, relative paths become absolute.

3. Unique title and description per page. Title ≤ ~60 characters, the name or keyword first, nothing wasted (I dropped a decorative ✦ that was eating four characters of every search result). Description ≤ ~160 characters, written as the snippet you want under the link. A site where every page shares one title is telling Google its pages are interchangeable.

4. Headings carry the keywords. One <h1> per page containing the term you want to rank for. Mine said "Software & Automation Engineer" but not my name — the single strongest keyword a personal site has. A visually-hidden span inside the H1 fixed it without touching the design.

5. sitemap.xml and robots.txt — kept dynamic. The sitemap must list the canonical domain and must not be frozen at build time: mine was prerendered, so posts published through the admin never appeared until the next deploy. One revalidate = 3600 fixed it.

6. Structured data (JSON-LD). Three schemas cover a personal site: Person (name, jobTitle, sameAs → GitHub/LinkedIn, alumniOf, award), WebSite, and BlogPosting per article (headline, dates, author, url, mainEntityOfPage). This is the input to rich results and knowledge panels — and, increasingly, to answer engines deciding who said what.

7. Register with the engines, then read what they tell you. Google Search Console: add a Domain property, submit the sitemap, use URL Inspection → Request Indexing for anything new or changed. Then Bing Webmaster Tools — one-click import from GSC, and Bing's index feeds ChatGPT search. The consoles are diagnostic tools, not ceremonies: GSC is what told me my sitemap had ten "URL not allowed" errors — every URL on the wrong domain.

8. Content reality. A personal site ranks on your name and on distinctive post titles, not on "software engineer". Each specific post is a new surface that can rank on its own terms. Generic keywords are a decade-long fight; your own name should be a same-week win.

GEO: being cited by answer engines

More people now ask ChatGPT, Perplexity or Claude "who is X?" than page through search results. GEO is optimizing for being the citation in the answer. It overlaps SEO — same canonical URLs, same structured data — and adds four things:

SurfaceWhat it isCost
robots.txt allowancesExplicit Allow for GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-Web, PerplexityBot, Google-Extended, Applebot-Extended, CCBot10 lines
/llms.txtA plain-markdown site guide at the root: who you are, what each page is, every post with a one-line summary1 route handler
RSS feedOld, cheap, still how aggregators and crawlers discover new content fastest1 route handler
Quotable contentThe actual work — see belowongoing

Let the crawlers in. Many CDNs and templates block AI crawlers by default. That is a legitimate choice — but if you want to be cited, it is opting out. The Allow rules carry the same /admin and /api exclusions as everyone else.

`llms.txt` is your elevator pitch to a model. When an engine has one fetch to decide what your site is, a hand-written markdown summary beats parsing your JavaScript. Generate it from your content — mine is a route handler that reads the posts table, so it never goes stale.

Write quotable content. This is most of GEO, and it is not a trick — it is what good technical writing already is:

  • Concrete numbers with sources. "27.3% → 75.8% at 55B parameters (arXiv:2310.08864)" gets quoted; "significantly better" does not.
  • Clear definitions. "A meta-harness is the layer above the harness that decides which harness a task gets" — models lift definitional sentences verbatim, with attribution.
  • Tables. The most extractable format there is. (The renderer on this site didn't support them until this week; that fix mattered for both humans and machines.)
  • One claim per heading, so a section answers one question completely and can be cited alone.

Entity consistency. The same name, title and links everywhere — site, GitHub, LinkedIn, JSON-LD sameAs. That is how a model merges your scattered mentions into one entity it can say something confident about.

The loop, once it's set up

  1. Publish a post → sitemap, feed and llms.txt pick it up automatically.
  2. Search Console → URL Inspection → Request Indexing. Two clicks.
  3. Weekly: GSC Performance (what queries you appear for) and Indexing → Pages (what is indexed, and why not).
  4. Occasionally ask an answer engine about yourself or your project and see whether your site is the citation. That is the GEO scoreboard, and there is no console for it yet — you are the crawler.

The through-line with the rest of this blog: none of this is speculative optimization. Every item is either mechanically checkable (the consoles, the validators, curl) or it is just writing things worth quoting. Do the checkable parts once; do the writing forever.