MAR 26, 20265 min read

How I Overhauled SEO, GEO, and AEO for My Personal Website

A deep dive into the comprehensive SEO, GEO, and AEO improvements I implemented across my personal website — from structured data on every page to dynamic OG images and AI discoverability.

I recently spent a focused session overhauling the search engine optimization, generative engine optimization, and answer engine optimization of my personal website — mohammadshaker.com. This is a bilingual (Arabic/English) Next.js site with 300+ blog posts, academic publications, comparative studies, and interactive visualizations.

Here is what I did, why, and what I learned.

What Are SEO, GEO, and AEO?

SEO (Search Engine Optimization) is the classic discipline of making your site discoverable and rankable by Google, Bing, and other search engines. It covers metadata, sitemaps, canonical URLs, structured data, and page speed.

GEO (Generative Engine Optimization) is the newer practice of making your content appear in AI-generated answers — ChatGPT, Google AI Overviews, Perplexity, and similar systems. It focuses on structured data that AI can parse, content formatting that makes extraction easy, and authority signals.

AEO (Answer Engine Optimization) targets featured snippets, People Also Ask boxes, voice search results, and knowledge panels. It is about structuring content as direct answers to questions.

The Audit

I started by running three parallel audits — one for each discipline. Each audit analyzed the entire codebase: page metadata, structured data, content formatting, sitemap coverage, robots.txt, and AI discoverability signals.

Key Findings

SEO gaps: The homepage used static metadata without canonical/hreflang. Seventeen section index pages had no descriptions. Tech blog posts had no hreflang in the sitemap. The 404 page redirected instead of returning a proper status code.

GEO gaps: Tech blog posts had zero JSON-LD structured data. FAQ content on the About page existed as invisible JSON-LD but was not rendered visually. Blog post tags mapped to generic "Thing" entities without Wikidata URIs. No author bio was visible on posts.

AEO gaps: No HowTo schema for tutorial posts. No visible breadcrumb navigation. Speakable schema only targeted h1 and excerpt. No People Also Ask targeting. No table of contents for long articles.

What I Built

Structured Data on Every Page

Every page type now has appropriate JSON-LD:

  • Blog posts: BlogPosting with speakable, citations, Wikidata entity URIs
  • Tech posts: BlogPosting + Breadcrumb (previously had nothing)
  • About: Person, ProfilePage, Breadcrumb, FAQPage (now visible too)
  • Publications: Breadcrumb, FAQ, ScholarlyArticle ItemList
  • Section pages: ItemList + Breadcrumb on all 18 study sections
  • Category pages: New — Breadcrumb + ItemList, with per-category RSS
  • Contact, Studies: Breadcrumb schema

Metadata Everywhere

  • Converted 17+ static export const metadata to generateMetadata with locale-aware canonical URLs and hreflang alternates
  • Added descriptions to 8 layout files
  • Added description + canonical to all 17 chapter/poem/surah detail pages

Content Enrichment

  • TL;DR summaries on all 300 blog posts
  • FAQ sections on 10 key technical posts targeting People Also Ask
  • Author bio at the bottom of every blog post
  • Related posts section using category + tag scoring
  • Table of contents auto-generated from headings with active section tracking

New Pages and Features

  • Search page (/search) with client-side filtering and SearchAction schema
  • Category landing pages (/blog/category/[category]) with structured data and RSS feeds
  • Per-locale RSS feeds (/en/feed.xml, /ar/feed.xml)
  • Reading progress bar on blog and tech posts
  • Dynamic OG images generated per blog post with dark/light variants
  • Visible breadcrumb navigation replacing back links

Infrastructure

  • Sitemap ping to Google and Bing on every production deploy
  • Lighthouse CI workflow in GitHub Actions with performance/a11y/SEO thresholds
  • robots.txt updated to block /admin/ paths
  • Proper 404 page instead of redirect
  • llms-full.txt expanded with full article bodies for AI crawlers

Technical Approach

The entire implementation was done in a single session using parallel subagents — multiple independent changes running simultaneously across different files. This allowed ~150 files to be changed across 13 commits without conflicts.

Key architectural decisions:

  1. Centralized schema generation in lib/seo/structured-data.ts — all JSON-LD generators in one file
  2. Reusable Breadcrumb component — one component used across blog, tech, search, and category pages
  3. Script-based summary generation — a TypeScript script that derives summaries from excerpts for bulk updates
  4. File-based OG images — using Next.js opengraph-image.tsx convention for automatic integration

Results

After implementation:

  • Every page has structured data (JSON-LD)
  • Every page has proper canonical URL and hreflang alternates
  • All 300 posts have TL;DR summaries
  • 10 key posts have FAQ sections for PAA targeting
  • Blog tags map to Wikidata entity URIs
  • Search functionality enables the WebSite SearchAction schema
  • Category pages create topical clusters for authority signals
  • Per-locale RSS feeds properly tag content language

What I Would Do Differently

  1. Start with the search page — having it early would have made the SearchAction schema valid from the start
  2. Batch content changes more carefully — some subagents made changes beyond their scope, requiring cleanup
  3. Test OG images locally — dynamic OG images are hard to preview without deploying

Frequently Asked Questions

What is GEO (Generative Engine Optimization)?

GEO is the practice of optimizing content to appear in AI-generated answers from systems like ChatGPT, Google AI Overviews, and Perplexity. It focuses on structured data, content formatting, entity relationships, and authority signals that AI systems can parse and cite.

How is AEO different from SEO?

AEO (Answer Engine Optimization) specifically targets direct answer formats: featured snippets, People Also Ask boxes, voice search results, and knowledge panels. While SEO aims for high rankings in search results, AEO aims to be THE answer that appears above all results.

Do you need structured data for every page?

Not necessarily, but it helps significantly. At minimum, your homepage (WebSite), about page (Person), and content pages (Article/BlogPosting) should have JSON-LD. The more structured data you provide, the more context search engines and AI systems have about your content.

Written by
Mohammad Shaker

Director of Agentic AI for the Enterprise at Writer. Building at the intersection of language, intelligence, and design.

Newsletter

Get notified when I publish new articles on AI, engineering, and building things.