SEO, AEO and GEO for a Developer Portfolio: What Works
What I changed on this site to be found by Google and cited by AI assistants: crawler rules, prerendered HTML, llms.txt, answer-first writing and honest structured data.
A developer portfolio has two readers now: a person who searches Google, and an assistant that reads the web on that person's behalf and writes a paragraph with a few links under it. This site is built for both. Below is what I actually changed, why, and where the evidence is thinner than the industry makes it sound.
#Three acronyms, one foundation
SEO ranks a page in a list. AEO tries to get one answer lifted out of the page. GEO tries to get the page cited inside text an AI assistant generates. The tactics overlap far more than the vocabulary suggests, and Google's own guidance on AI features is blunt about it: a page must be indexed and eligible to show with a snippet, there are no additional technical requirements, no special schema.org markup, and no need for new AI-specific files.
Read the 40% figure carefully. It comes from a research benchmark of generative engines, not from a measurement of your site, and it is a ceiling for the best method on that test. I use it as a reason to try the cheap changes, not as a forecast.
#Step 1: let the crawlers in
Nothing else matters if the fetch fails. Three separate things can block it: robots.txt, the CDN or firewall in front of the host, and rendering. On this site, Hostinger's CDN once answered GPTBot with a 429 even though robots.txt allowed it, which is why I check logs rather than trusting the file. The fix lives in the host settings, not in the code.
OpenAI documents three agents as independent settings, which means the policy can be granular.
| User agent | What it does | Effect of blocking it |
|---|---|---|
| OAI-SearchBot | Surfaces sites in ChatGPT search features | Site stops appearing in ChatGPT search answers, may remain as a navigational link |
| GPTBot | Crawls content that may be used for training | Signals the content should not be used for training |
| ChatGPT-User | Fetches a page when a user asks ChatGPT to | Robots rules may not apply because a person triggered the request |
This site's robots.txt names the AI user agents explicitly and allows all of them. That is a visibility decision for a personal brand, not advice for a publisher with paywalled work.
#Step 2: serve real HTML
Googlebot can render JavaScript, but it queues pages for rendering, and Google itself says server-side or pre-rendering is still a good idea because not all bots run JavaScript. Many AI fetchers read the raw response only. This site is a React 19 and Vite app, and the build renders every route to static HTML, so the first byte already contains the headline, the body, the FAQ and the JSON-LD. A related note covers how the prerender step works.
#Step 3: write answer-first
An assistant lifts passages, not pages. A passage works when it can stand alone: it names its subject, states the claim in the first sentence and carries its own number. Each post on this site opens with a lead that says what the post covers, uses question-shaped headings where the reader would have asked that question, and ends with an FAQ whose answers are complete without the surrounding article.
- Put the answer in the first sentence under a heading, then the evidence.
- Name the thing every time. "It" and "this approach" do not survive being copied out of context.
- Attach each number to a dated, linked source, so the claim is checkable.
- Keep one claim per sentence in the places you hope to be quoted.
#Step 4: structured data that matches the page
Google's guidance says structured data should match the visible text. Every block here is generated from the same data that renders the page, so it cannot drift: Person and WebSite on the home page, BlogPosting with citations on each post, FAQPage built from the visible FAQ, and BreadcrumbList. The person node lists the alternate name "D. Dinesh" because that is how the Springer chapter credits me, and that link between two names is the kind of entity fact a crawler cannot guess.
faq: [
{ q: "Should I block GPTBot in robots.txt?",
a: "That depends on whether you object to training use..." }
]#Step 5: the optional machine-readable files
The llms.txt proposal is a markdown file at /llms.txt with an H1 name, a blockquote summary, link lists and an optional section. This site generates it at build time from the same data as the pages, along with a full-text companion, a sitemap and an RSS feed. I want to be straightforward about the status: Google says it is not needed, and I am not aware of a published guarantee from any assistant vendor that it changes citations. It is cheap, it is generated, and it makes the site easy to summarize, so it stays. It is not where the effort goes.
#Step 6: keep it fresh and verify
Publishing cadence and honest modified dates are the last inputs. The sitemap here derives lastmod from real content changes, because stamping every URL with the build date teaches crawlers to ignore the field. After each deploy: fetch the page with a plain HTTP client and confirm the content is in the response, request indexing in Search Console, and read the server logs for the crawlers you care about.
#Related notes
Sources
- Google Search Central, AI features and your websiteAccessed 2026-10-28. No additional requirements, special schema or AI-specific files needed for AI Overviews and AI Mode; the page must be indexed and snippet-eligible.
- Google Search Central, JavaScript SEO basicsAccessed 2026-10-28. Server-side or pre-rendering remains recommended because not all bots run JavaScript; Googlebot queues pages for rendering.
- OpenAI, Overview of OpenAI crawlersAccessed 2026-10-28. OAI-SearchBot, GPTBot and ChatGPT-User are independent settings; about 24 hours for robots.txt changes to apply to search.
- Aggarwal et al., GEO: Generative Engine Optimization (arXiv:2311.09735)Submitted 16 November 2023, accepted to KDD 2024. Reports visibility gains of up to 40% in generative engine responses from some content methods, measured on the authors' own benchmark.
- llms.txt proposal, Jeremy HowardAccessed 2026-10-28. Markdown file at /llms.txt: H1 name, blockquote summary, H2 link lists, optional section.
Frequently asked questions
What is the difference between SEO, AEO and GEO?
SEO aims to rank a page in a list of search results. AEO (answer engine optimization) aims to have a short, self-contained answer lifted out of your page, for example into a featured snippet or a voice answer. GEO (generative engine optimization) aims to have your page cited or paraphrased inside the text an AI assistant writes. The three share one base: a page that is crawlable, indexed, fast and clearly written. The extra work for AEO and GEO is mostly about how each section is phrased and how well the page's claims can be verified.
Do I need an llms.txt file to appear in AI Overviews?
No. Google's documentation on AI features says there are no additional technical requirements for AI Overviews or AI Mode, no special schema.org markup, and no need to create new machine-readable or AI-specific text files. A page only needs to be indexed and eligible to show with a snippet. I publish llms.txt anyway because it costs nothing, is generated from the same data as the pages, and gives other assistants a one-fetch summary, but I treat it as optional and unproven rather than as a ranking lever.
Should I block GPTBot in robots.txt?
That depends on whether you object to your text being used for model training. OpenAI documents its crawlers as independent settings: OAI-SearchBot decides whether your pages appear in ChatGPT search answers, GPTBot relates to training data, and ChatGPT-User fetches pages on behalf of a user. You can allow the first and disallow the second. I allow all of them on this site because the goal is to be read and cited, but that is a choice, not a default everyone should copy.
How long do robots.txt changes take to affect AI search?
OpenAI states that its search systems can take around 24 hours to adjust after a robots.txt update. Other vendors do not publish a number, so treat any change as taking at least a day and verify in your server logs that the user agent you care about is actually fetching pages.
Related questions
Building something in this space and want another pair of hands on it?
Get in touch