# SEO

> Generative search engine optimization and visibility architectures — covering traditional SEO, GEO (Generative Engine Optimization), and AEO (Answer Engine Optimization) for landing pages. Use whenever the user wants to optimize content for search engines, AI answer engines (ChatGPT, Perplexity, Claude, Google AI Overviews), or write SEO/AEO-optimized landing pages. Trigger on mentions of SEO, GEO, AEO, meta tags, structured data, schema markup, search rankings, or "optimize this page for search/AI".

- Skill: `roedyrustam/seo-2` (Agent Skill)
- Install (CLI): `npx skillmds@latest add roedyrustam/seo-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/roedyrustam/seo-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: roedyrustam (https://skillmd.com/u/roedyrustam)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/roedyrustam/seo-2

---


# SEO / GEO / AEO — Search & AI Visibility

Traditional search optimization plus optimization for AI answer engines (2026 landscape).

---

## The Three Layers of Visibility

| Layer | Target | Optimizes For |
|-------|--------|----------------|
| **SEO** | Google, Bing | Crawlers, backlinks, keyword relevance |
| **AEO** | Featured snippets, voice search | Direct question-answer matching |
| **GEO** | ChatGPT, Perplexity, Claude, AI Overviews | Being cited/quoted by LLMs |

---

## Traditional SEO Fundamentals

### Technical SEO Checklist
```
✓ robots.txt allows crawling of important pages
✓ sitemap.xml submitted to Search Console
✓ Canonical URLs set on every page
✓ No duplicate content (or rel=canonical pointing to original)
✓ Mobile-responsive (Google is mobile-first indexing)
✓ Core Web Vitals pass (LCP < 2.5s, INP < 200ms, CLS < 0.1)
✓ HTTPS everywhere
✓ Structured data (JSON-LD) on key page types
```

### Metadata Template (Next.js)
```typescript
// app/blog/[slug]/page.tsx
import type { Metadata } from "next"

export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const post = await getPost(params.slug)

  return {
    title: `${post.title} | YourBrand`,
    description: post.excerpt.slice(0, 160),
    keywords: post.tags,
    alternates: {
      canonical: `https://example.com/blog/${post.slug}`,
    },
    openGraph: {
      title: post.title,
      description: post.excerpt,
      type: "article",
      publishedTime: post.publishedAt,
      authors: [post.author.name],
      images: [{ url: post.ogImage, width: 1200, height: 630 }],
    },
    twitter: {
      card: "summary_large_image",
      title: post.title,
      description: post.excerpt,
      images: [post.ogImage],
    },
  }
}
```

### Structured Data (JSON-LD)
```tsx
// Article schema
function ArticleSchema({ post }: { post: Post }) {
  const schema = {
    "@context": "https://schema.org",
    "@type": "Article",
    headline: post.title,
    description: post.excerpt,
    image: post.ogImage,
    datePublished: post.publishedAt,
    dateModified: post.updatedAt,
    author: { "@type": "Person", name: post.author.name },
    publisher: {
      "@type": "Organization",
      name: "YourBrand",
      logo: { "@type": "ImageObject", url: "https://example.com/logo.png" },
    },
  }

  return (
    <script
      type="application/ld+json"
      dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
    />
  )
}

// FAQ schema (also boosts AEO — see below)
const faqSchema = {
  "@context": "https://schema.org",
  "@type": "FAQPage",
  mainEntity: faqs.map(faq => ({
    "@type": "Question",
    name: faq.question,
    acceptedAnswer: { "@type": "Answer", text: faq.answer },
  })),
}
```

---

## AEO — Answer Engine Optimization

Goal: get your content selected as a **featured snippet** or **voice search answer**.

### Question-Answer Format
```markdown
## How long does it take to set up a SaaS MVP?

A typical SaaS MVP takes 4-8 weeks to launch, depending on feature scope.
The breakdown: 2-3 days for project setup, 1 week for auth and billing
integration, and 2-4 weeks for core feature development.

<!-- Direct, complete answer in the FIRST sentence — this is what gets
extracted into featured snippets and voice answers -->
```

### AEO Content Structure
```
1. Question as H2/H3 heading (matches actual search queries)
2. Direct answer in first sentence (40-60 words ideal for snippets)
3. Supporting detail/context after
4. Bullet points or numbered lists for scannable answers
```

```markdown
## What is Row-Level Security in PostgreSQL?

Row-Level Security (RLS) is a PostgreSQL feature that restricts which rows
a user can access in a table, based on policies you define. Unlike
application-level checks, RLS enforces access control at the database
layer itself.

Key benefits:
- Enforced even if application code has bugs
- Works across all database clients (not just your app)
- Reduces duplicate authorization logic
```

### Voice Search Optimization
- Target **natural language questions** ("how do I...", "what is...", "why does...")
- Write answers in **conversational tone** — voice assistants read these aloud
- Keep primary answer **under 30 words** when possible (voice answers are brief)

---

## GEO — Generative Engine Optimization (2026)

Goal: get cited, quoted, or referenced by AI systems (ChatGPT, Perplexity, Claude, Google AI Overviews).

### What LLMs Look For When Citing Sources
1. **Clear, extractable claims** — specific facts, numbers, definitions stated plainly
2. **Authoritative structure** — proper headings, not walls of text
3. **Recency signals** — dates, "last updated," version numbers
4. **Original data/research** — content that can't be found elsewhere is more citable
5. **Clean semantic HTML** — `<article>`, `<section>`, proper heading hierarchy

### GEO Content Patterns
```markdown
<!-- ✅ Citable: specific, attributable claim -->
According to our 2026 survey of 500 SaaS companies, 73% use PostgreSQL
as their primary database, up from 61% in 2024.

<!-- ❌ Not citable: vague, no source -->
Most companies use SQL databases these days.
```

```markdown
<!-- ✅ Definition format LLMs extract easily -->
**Row-Level Security (RLS)** is a PostgreSQL access-control mechanism
that filters query results based on the requesting user's identity,
enforced at the database engine level rather than in application code.

<!-- Structured for extraction: term in bold, clear definition follows -->
```

### Author & Source Authority Signals
```typescript
// E-E-A-T signals (Experience, Expertise, Authoritativeness, Trust)
// LLMs and search engines both weight these

const authorSchema = {
  "@context": "https://schema.org",
  "@type": "Person",
  name: "Author Name",
  jobTitle: "Senior Backend Engineer",
  worksFor: { "@type": "Organization", name: "Company" },
  sameAs: [
    "https://linkedin.com/in/author",
    "https://github.com/author",
  ],
}
```

### Llms.txt (Emerging Standard, 2025-2026)
```
# llms.txt — at your domain root, similar to robots.txt
# Signals to AI crawlers what content is most important/citable

# YourBrand

> One-line description of what your site/product does.

## Documentation
- [API Reference](https://example.com/docs/api): Full API documentation
- [Getting Started](https://example.com/docs/start): Quickstart guide

## Key Pages
- [Pricing](https://example.com/pricing): Current pricing tiers
- [Changelog](https://example.com/changelog): Recent product updates
```

---

## Landing Page SEO/AEO Writer Template

```markdown
# [Primary Keyword] — [Value Proposition]

<!-- H1: include primary keyword naturally, keep under 60 chars -->

[Hook paragraph: 2-3 sentences, state the problem and your solution.
Include primary keyword in first 100 words.]

## What is [Primary Keyword]?
<!-- AEO: direct definition, extractable -->
[40-60 word direct answer]

## Why [Primary Keyword] Matters
<!-- Supporting context, secondary keywords naturally woven in -->

## How [Product] Solves [Problem]
<!-- Feature breakdown with H3s for each feature -->

### [Feature 1]
[Benefit-focused description]

### [Feature 2]
[Benefit-focused description]

## Frequently Asked Questions
<!-- AEO + FAQ schema — high snippet/voice-answer potential -->

### [Question matching real search query]
[Direct answer, 40-60 words]

### [Question matching real search query]
[Direct answer, 40-60 words]

## [CTA Section]
[Clear single call-to-action]
```

### On-Page Checklist for Landing Pages
- [ ] H1 contains primary keyword, appears once
- [ ] Primary keyword in first 100 words
- [ ] H2/H3 use question format where relevant (AEO)
- [ ] Meta description: 150-160 chars, includes keyword + CTA
- [ ] Internal links to 2-3 related pages
- [ ] Image alt text descriptive (not keyword-stuffed)
- [ ] FAQ section with schema markup
- [ ] Page load < 2.5s LCP
- [ ] At least one specific, citable fact/statistic (for GEO)

---

## Measuring Success

| Metric | Tool | Tracks |
|--------|------|--------|
| Organic traffic | Google Search Console | Traditional SEO |
| Featured snippets | Search Console + manual checks | AEO |
| AI citations | Manual prompting of ChatGPT/Perplexity/Claude | GEO |
| Core Web Vitals | PageSpeed Insights, Vercel Analytics | Technical SEO |
| Keyword rankings | Ahrefs, SEMrush | SEO |

---

## Key Rules

1. **Direct answers in the first sentence** — this is what gets extracted for both AEO snippets and GEO citations
2. **Specific, attributable facts beat vague claims** — numbers, dates, named sources are more citable by LLMs
3. **Question-format headings** — match real search queries and voice search patterns
4. **FAQ schema everywhere relevant** — cheap to add, high AEO value
5. **Structured data (JSON-LD)** on all key page types — Article, FAQPage, Product, Organization
6. **`llms.txt` at domain root** — emerging signal for AI crawler prioritization
7. **Core Web Vitals are non-negotiable** — slow pages rank worse and convert worse
8. **One H1 per page**, logical heading hierarchy beneath it
9. **Original data/research is the highest-value content** for GEO — AI systems prefer unique sources
10. **Update dates visibly** — "Last updated" signals recency to both crawlers and LLMs

