# Lloyd — The Recommendation OS — Complete Architecture Reference

Reference document for rebuilding Lloyd as a fully online application (thinkaga.in).
Generated from the working codebase on 2026-03-26.

**Client-facing one-pagers:** [English](LLOYD-ONE-PAGER-EN.md) · [Nederlands](LLOYD-ONE-PAGER-NL.md)

---

## Table of Contents

1. [System Overview](#system-overview)
2. [Module Registry](#module-registry)
3. [Module Details & Dependencies](#module-details--dependencies)
4. [Shared Infrastructure](#shared-infrastructure)
5. [Data Models & TypeScript Types](#data-models--typescript-types)
6. [Scoring System](#scoring-system)
7. [Module Execution Engine](#module-execution-engine)
8. [Client Intake & Workflow](#client-intake--workflow)
9. [API Keys & External Services](#api-keys--external-services)
10. [Output Format & Schema](#output-format--schema)
11. [Search Intent Framework (SIF)](#search-intent-framework-sif)
12. [Dashboard Pages & Components](#dashboard-pages--components)
13. [Cross-Module Aggregation](#cross-module-aggregation)
14. [Page Content Analysis (33-Question Framework)](#page-content-analysis-33-question-framework)

---

## System Overview

Lloyd is an SEO & GEO (Generative Engine Optimization) audit platform consisting of:

1. **Frontend** — Next.js 16 + React 19 + Shadcn/Radix UI + Tailwind CSS + Recharts + Zustand
2. **Module Execution** — Two execution paths:
   - **Claude AI path**: Node.js API routes fetch website data, construct prompts, call Claude API, parse structured JSON output
   - **Python CLI path**: Standalone Python modules for compute-heavy tasks (TF-IDF, Playwright rendering, multi-platform LLM queries)
3. **Configuration** — Centralized `settings.json` for API keys and preferences

### Current Execution Flow

```
User selects modules in dashboard
        ↓
POST /api/run-modules (moduleIds, clientId, depth)
        ↓
module-executor.ts:
  1. Load client data from JSON file
  2. Fetch website HTML, robots.txt, sitemap, focus pages
  3. Optionally fetch DataForSEO data (backlinks, SERP, domain rank)
  4. Optionally discover & fetch blog feed + posts
  5. Build Claude system prompt (role + scoring criteria + output schema)
  6. Call Claude API with website data as user message
  7. Parse structured JSON response
  8. Save result, update run status
        ↓
Frontend polls GET /api/run-status/[runId]
        ↓
Results displayed in module dashboard (scores, charts, findings, recommendations)
```

---

## Module Registry

### Categories

| ID | Name | Icon | Description |
|----|------|------|-------------|
| `website` | Website | Globe | On-site technical & content SEO |
| `topics` | Topics | Lightbulb | Topic research & clustering |
| `competitors` | Competitors | Users | Competitive analysis |
| `youtube` | YouTube | Video | Channel & video optimization |
| `geo` | GEO / AI Search | Bot | AI search visibility & optimization |

### All Modules

#### Website SEO (11 modules)

| Module ID | Name | Description | Execution | API Keys Required |
|-----------|------|-------------|-----------|-------------------|
| `cwv` | Core Web Vitals | Lighthouse scores, LCP, INP, CLS, FCP, TBT via PageSpeed Insights API | Node.js (API route) | Google PageSpeed (free) |
| `seo-technical` | Technische SEO | Crawlability, indexability, security headers, robots.txt | Claude AI | Anthropic |
| `seo-sitemap` | Sitemap | XML sitemap validation, structure, URL analysis | Claude AI | Anthropic |
| `seo-schema` | Schema / Structured Data | JSON-LD detection, validation, generation | Claude AI | Anthropic |
| `seo-content` | Content Kwaliteit | Readability, thin content, content gaps | Claude AI | Anthropic |
| `seo-page-audit` | Page Content Analysis | 33 questions across 8 categories per page | Claude AI | Anthropic |
| `seo-images` | Afbeeldingen | Alt text, file sizes, formats, lazy loading, CLS | Claude AI | Anthropic |
| `seo-hreflang` | Hreflang / Internationaal | Multi-language SEO, hreflang validation | Claude AI | Anthropic |
| `blog-analyze` | Blog Analyzer | Per-URL blog post scoring (originality, depth, citability). Discovery via RSS/Atom autodiscover, blog sitemaps, main-sitemap filtering, or crawl fallback. Surfaced through **Page Recommendations** (`/page-actions?class=editorial`); selection, Quick re-score and Full audit all live there. The standalone `/blog-analyzer` route now redirects into the editorial filter for backwards compatibility. | Node (Claude AI per post) | Anthropic |
| `editorial-score` | Editorial Score (virtual) | Umbrella metric (0–100) for editorial pages: 50% Information Gain + 30% Non-Commodity signals + 20% Blog Analyzer per-URL score. Hard-capped at 35 on keyword stuffing. Aggregated from Page Recommendations and surfaced in the Editorial Quality pillar of the Website spider chart. | Virtual (synthesised from other module results) | None |
| `seo-programmatic` | Programmatic SEO | Template pages at scale, index bloat prevention | Claude AI | Anthropic |
| `broken-links` | Broken Links | Dead links, redirect chains, orphan pages | Both (Python CLI + Claude AI) | None (free) |

#### Topic Research (6 modules)

| Module ID | Name | Description | Execution | API Keys Required |
|-----------|------|-------------|-----------|-------------------|
| `yt-topic-finder` | Topic Finder | SIF-based topic research with YouTube volume data | Python CLI | YouTube API, Anthropic, SerpAPI (optional) |
| `google-suggest` | Google Suggest | Topic discovery via Google autocomplete | Python CLI | None (free) |
| `bing-suggest` | Bing Suggest | Topic discovery via Bing/Copilot autocomplete | Python CLI | None (free) |
| `reddit-suggest` | Reddit Suggest | Community topic discovery via Reddit | Python CLI | None (free) |
| `yt-suggest` | YouTube Suggest | Video topic ideas via YouTube autocomplete | Python CLI | None (free) |
| `topic-cluster` | Topic Cluster Visualizer | Interactive network graph + treemap from suggest data | Python CLI | None (free) |

#### Competitors (2 modules)

| Module ID | Name | Description | Execution | API Keys Required |
|-----------|------|-------------|-----------|-------------------|
| `seo-competitor` | Concurrentie-analyse | Comparison pages, feature matrices, positioning | Claude AI | Anthropic, DataForSEO (optional) |
| `seo-discovery` | Platform Presence | Visibility on Reddit, YouTube, review sites, forums | Claude AI | Anthropic |

#### YouTube (5 modules)

| Module ID | Name | Description | Execution | API Keys Required |
|-----------|------|-------------|-----------|-------------------|
| `yt-channel` | Channel Analyzer | Channel health, content DNA, outlier detection | Python CLI | YouTube API |
| `yt-packaging` | Title & Thumbnail Scorer | 1of10 triggers, 8-point title scoring | Claude AI | Anthropic |
| `yt-outliers` | Outlier Research | Find 5x/10x outlier videos via mining | Python CLI | YouTube API |
| `yt-structure` | Video Structure Planner | 40/30/30 rule, hook patterns, video brief | Claude AI | Anthropic |
| `yt-ai` | YouTube AI Readiness | AI-citability: timestamps, descriptions, metadata | Python CLI | YouTube API |

#### GEO / AI Search (3 dashboard modules + 8 Python modules)

Dashboard modules (Claude AI execution):

| Module ID | Name | Description | Execution | API Keys Required |
|-----------|------|-------------|-----------|-------------------|
| `seo-geo` | GEO / AI Zichtbaarheid | AI Overviews, ChatGPT, Perplexity, Claude analysis | Claude AI | Anthropic |
| `seo-ai-crawlers` | AI Crawler Toegang | GPTBot, ClaudeBot, PerplexityBot, llms.txt | Claude AI | Anthropic |
| `m8-prompt-tracking` | Prompt Tracking | Recommendation vs citation, ghost citations | Claude AI | Anthropic |

Python CLI-only modules (not yet in dashboard):

| CLI Command | Name | Description | API Keys Required |
|-------------|------|-------------|-------------------|
| `seo-citability` | Citability & Machine Readiness | Passage structure, answer blocks, schema, AI crawlers | None |
| `seo-authority` | Authority Audit | Brand signals, Wikidata, author credentials | None |
| `geo-prompt-tracking` | Prompt Tracking (full) | Multi-platform LLM recommendation tracking | 1+ LLM API key |
| `geo-prompt-discovery` | Prompt Discovery | Discover prompts that trigger brand mentions | 1+ LLM API key |
| `geo-agent-readiness` | Agent Readiness | JS rendering gap detection (Playwright) | None (Playwright optional) |
| `geo-trust-alignment` | Trust Alignment | LLM description vs sales pitch (Toth framework) | 1+ LLM API key |
| `geo-refinement-mining` | Refinement Mining | Discover category pillars from LLM follow-ups | 1+ LLM API key |
| `geo-intersection-gaps` | Intersection Content Gap | Missing content at pillar intersections | None |
| `geo-fan-outs` | GEO Fan-Outs | Discover sub-queries LLMs generate | 1+ LLM API key |

Aggregation modules (Python CLI):

| CLI Command | Name | Description |
|-------------|------|-------------|
| `seo-score` | SEO Health Score | Cross-module weighted score (0-100) |
| `geo-score` | GEO Health Score | Cross-module weighted score (0-100) |
| `topics-intent-volume` | Intent Volume Aggregator | Cluster GSC/Ahrefs keywords by SIF intent |

---

## Module Details & Dependencies

### Python Module Dependencies

```
Core (all modules):
  - requests          HTTP fetching
  - beautifulsoup4    HTML parsing
  - pydantic          Data validation (optional)

Module-specific:
  - scikit-learn      Cannibalization Detector (TF-IDF + cosine similarity)
  - playwright        Agent Readiness (JS rendering gap detection)

LLM Platform runners (geo-prompt-*, geo-trust-alignment, geo-refinement-mining, geo-fan-outs):
  - openai SDK        ChatGPT queries
  - anthropic SDK     Claude queries
  - requests          Perplexity API, Gemini API (direct HTTP)
```

### Module Input/Output Patterns

**Pattern A: Domain-based crawl**
- Input: `--domain example.com` + optional `--pages N`
- Process: Fetch sitemap → discover pages → analyze each
- Used by: seo-citability, seo-broken-links, seo-orphan-pages, seo-cannibalization, seo-backlinks, geo-agent-readiness

**Pattern B: Brand + LLM queries**
- Input: `--brand "Name" --sector "Category" --competitors "A,B,C"`
- Process: Generate prompts → query multiple LLM platforms → classify responses → score
- Used by: geo-prompt-tracking, geo-prompt-discovery, geo-trust-alignment, geo-refinement-mining, geo-fan-outs

**Pattern C: Seed keyword expansion**
- Input: `--seeds "keyword1,keyword2" --language nl`
- Process: Query autocomplete API → expand with alphabet/questions/wildcard → classify with SIF → score
- Used by: topics-google, topics-bing, topics-reddit, yt-suggest

**Pattern D: YouTube API analysis**
- Input: `--channel-url` or `--topics` or `--video-url`
- Process: YouTube Data API v3 calls → metric extraction → scoring
- Used by: yt-topics, yt-channel, yt-outliers, yt-ai-readiness

**Pattern E: Cross-module aggregation**
- Input: `--domain example.com`
- Process: Scan output/data/ for existing module results → weight & combine → overall score
- Used by: seo-score, geo-score

### Module Output Format

All Python modules output two files:

```
geo_audit/output/data/{module}_{domain}_{YYYY-MM-DD}.json     # Structured data
geo_audit/output/reports/{module}_{domain}_{YYYY-MM-DD}.md    # Human-readable report
```

JSON output structure (varies per module, but common pattern):
```json
{
  "domain": "example.com",
  "module": "seo-citability",
  "date": "2026-03-26",
  "overall_score": 78,
  "grade": "B+",
  "categories": [
    { "name": "AI Crawler Access", "score": 90, "weight": 0.10 },
    { "name": "Passage Citability", "score": 65, "weight": 0.13 }
  ],
  "pages": [ ... ],
  "recommendations": [ ... ]
}
```

---

## Shared Infrastructure

### Search Intent Framework (SIF)

Central classification system used across all modules. Based on ThinkAgain.nl methodology.

**9 Intents, 31 Subcategories:**

| Intent (NL) | Intent (EN) | Subcategories |
|-------------|-------------|---------------|
| Navigatie | Navigation | brand, persoon, product_of_dienst, subpaginanavigatie, locatie |
| Informatie | Information | lookup, onderzoek, probleemoplossing, vaardigheidsontwikkeling |
| Orientatie | Orientation | ontdekking, vergelijking, evaluatie, alternatieven |
| Inspiratie | Inspiration | trend, idee, voorbeeld |
| Transactie | Transaction | koop, download, inschrijving, boeking |
| Generatie | Generation | creatie, vertaling, samenvatting |
| Community | Community | discussie, ervaring, samenwerking |
| Emotie | Emotion | entertainment, empathie, nostalgie |
| Lokaal | Local | in_de_buurt, routebeschrijving, beschikbaarheid |

Each subcategory has platform suitability scores (0-100) for 13 platforms:
Google, YouTube, Reddit, TikTok, Instagram, Pinterest, LinkedIn, X/Twitter, Facebook, ChatGPT, Perplexity, Claude, Gemini.

**Key file:** `geo_audit/modules/search_intent_classifier.py`

### Platform Runners (LLM query engine)

Shared system for querying multiple LLM platforms. Defined in `geo_audit/modules/m13_prompt_discovery.py`.

Supported platforms:
- **ChatGPT** — OpenAI API (GPT-4o)
- **Claude** — Anthropic API (Claude Sonnet)
- **Perplexity** — Perplexity API (sonar model)
- **Gemini** — Google Gemini API

Each runner: takes prompt string → returns response text. Handles auth, retry, error handling.

### Suggest Expander Base

Base class for all autocomplete-based topic discovery modules.

**Key file:** `geo_audit/modules/suggest_expander_base.py`

Expansion methods:
- `base` — Direct autocomplete query
- `alphabet` — Append a-z to seed keyword
- `questions` — Prepend who/what/when/where/why/how
- `wildcard` — Insert _ wildcard at various positions

Each result gets SIF classification + platform suitability scores.

### Reporter Utility

**Key file:** `geo_audit/utils/reporter.py`

Functions:
- `save_json(data, module, identifier)` → writes timestamped JSON to output/data/
- `save_markdown(content, module, identifier)` → writes timestamped MD to output/reports/
- `score_to_grade(score)` → maps 0-100 score to A+/A/B+/B/C/D/F grade

---

## Data Models & TypeScript Types

### Client

```typescript
interface Client {
  id: string;
  name: string;
  slug: string;
  website: string;
  status: "intake" | "data" | "modules" | "review" | "complete";
  createdAt: string;
  intake: ClientIntake;
  dataSources: Record<string, DataSourceEntry>;
  directUrls: DirectUrls;
  modules: Record<string, ModuleConfig>;
  outputFormats: { md: boolean; docx: boolean; pptx: boolean };
  moduleResults: Record<string, ModuleResult>;
  pageAudit: Record<string, PageAuditAnswer>;
}
```

### ClientIntake

```typescript
interface ClientIntake {
  company: string;
  website: string;
  industry: string;
  industryCustom: string;
  cms: string;
  language: string;
  multiLanguage: boolean;
  icp: string;           // Ideal Customer Profile description
  painpoints: string;
  usps: string;
  goal: string;
  budgetPriority: string;
  previousSeo: string;
  restrictions: string;
  channels: Record<string, ChannelData>;  // social media channels
  competitors: Competitor[];               // { name, domain }
  keyFigures: KeyFigure[];                 // { name, role }
}
```

### ModuleResult

```typescript
interface ModuleResult {
  moduleId: string;
  status: "pending" | "running" | "done" | "error";
  output?: string;     // Raw markdown/text output from Claude
  error?: string;
  approved?: boolean;  // Manual review approval
  feedback?: string;   // Reviewer notes
}
```

### Structured Module Output (parsed from Claude response)

```typescript
interface StructuredModuleOutput {
  score: { overall: number; label: string };
  categories: Array<{
    name: string;
    score: number;
    status: "good" | "warning" | "critical" | "info";
    findings: number;
  }>;
  findings: Array<{
    title: string;
    description: string;
    severity: "critical" | "high" | "medium" | "low" | "pass" | "info";
    category: string;
    impact?: string;
  }>;
  recommendations: Array<{
    title: string;
    description: string;
    impact: "high" | "medium" | "low";
    effort: "low" | "medium" | "high";
    category: string;
    priority?: number;
  }>;
  summary: string;
  detailedAnalysis: string;
}
```

### Module Configuration

```typescript
interface Module {
  id: string;
  name: string;
  desc: string;
  skill: string | null;  // Claude Code skill name, null = custom execution
  category: string;       // "website" | "topics" | "competitors" | "youtube" | "geo"
  apis?: string[];        // Required API keys
}

interface ModuleConfig {
  enabled: boolean;
  depth: "quick" | "standard" | "deep";  // Controls page count & token budget
}
```

### Channels & Data Sources

```typescript
const CHANNELS = [
  "youtube", "linkedin", "reddit", "x", "facebook",
  "instagram", "tiktok", "pinterest", "podcast", "gmb", "trustpilot"
];

const DATA_SOURCES = [
  "gsc",           // Google Search Console
  "ga4",           // Google Analytics 4
  "bing",          // Bing Webmaster Tools
  "gads",          // Google Ads
  "gumshoe",       // GEO/AI visibility tool
  "screamingfrog", // Technical crawl export
  "ahrefs",        // Backlinks, keyword rankings
  "semrush",       // Keywords, backlinks, competitors
  "other"          // Custom CSV data
];
```

---

## Scoring System

### Per-Module Scoring

Each Claude AI module uses a standardized scoring prompt. All modules:
- Start at 100 points
- Deduct per finding based on severity: Kritiek (-15 to -25), Hoog (-10 to -15), Medium (-5 to -8), Laag (-2 to -3)
- Minimum 0, maximum 100
- Return structured JSON with overall score, category scores, findings, and recommendations

### Severity System

| Severity | Color | Deduction | Description |
|----------|-------|-----------|-------------|
| critical | Red | -15 to -25 | Blocking issues, major impact |
| high | Red/Orange | -10 to -15 | Significant problems |
| medium | Orange | -5 to -8 | Moderate issues |
| low | Gray | -2 to -3 | Minor improvements |
| pass | Green | 0 | Correctly implemented |
| info | Blue | 0 | Informational finding |

### Grade Mapping

| Score Range | Grade |
|-------------|-------|
| 95-100 | A+ |
| 90-94 | A |
| 85-89 | A- |
| 80-84 | B+ |
| 75-79 | B |
| 70-74 | B- |
| 65-69 | C+ |
| 60-64 | C |
| 50-59 | D |
| 0-49 | F |

### Depth Levels

| Depth | Pages Analyzed | Token Budget | Use Case |
|-------|---------------|--------------|----------|
| quick | 3 | 2000 | Quick scan |
| standard | 10 | 4000 | Default audit |
| deep | 25 | 8000 | Comprehensive review |

---

## Module Execution Engine

### Claude AI Module Execution

The executor (`module-executor.ts`) follows this flow per module:

1. **Build config** from client data (intake, competitors, channels, URLs)
2. **Fetch website data**:
   - Homepage HTML (cleaned, max 30KB)
   - robots.txt (max 5KB)
   - sitemap.xml (max 30KB)
   - Focus pages (nav links + sitemap URLs, limit by depth)
   - Blog feed + recent posts (if module needs it)
   - DataForSEO data (if configured): backlinks summary, SERP data, domain rank, competitor domains
3. **Construct Claude prompt**:
   - System: module role prompt + scoring criteria + structured output instruction
   - User: client context + website data + specific instructions
4. **Call Claude API** (Anthropic SDK, model: configurable)
5. **Parse response**: extract JSON from markdown code blocks
6. **Store result**: in-memory Map keyed by runId

### Module Prompt Structure

Each module has three prompt components:

```
SYSTEM PROMPT:
  MODULE_PROMPTS[moduleId]           // Expert role definition
  + MODULE_SCORING[moduleId]         // Scoring criteria & deduction rules
  + STRUCTURED_OUTPUT_INSTRUCTION    // JSON output format specification

USER PROMPT:
  Client context (company, industry, language, ICP, USPs)
  + Competitor info
  + Website data (HTML, robots, sitemap, focus pages)
  + Module-specific data (feed, DataForSEO, etc.)
  + Depth instruction (DEPTH_INSTRUCTIONS[depth])
```

### DataForSEO Integration

When configured (`dataforseo_login` + `dataforseo_password` in settings):

```typescript
// Available DataForSEO functions:
backlinksSummary(domain)      // Total backlinks, referring domains, rank, spam score
serpGoogleOrganic(keyword)    // SERP results for keyword
competitorsDomain(domain)     // Domain competitors analysis
domainRankOverview(domain)    // Domain rank & metrics
```

---

## Client Intake & Workflow

### Client Lifecycle

```
intake → data → modules → review → complete
```

1. **Intake**: Company info, website, industry, CMS, language, ICP, pain points, USPs, channels, competitors, key figures
2. **Data**: Import CSV data from GSC, GA4, Ahrefs, Semrush, etc.
3. **Modules**: Select & run audit modules, configure depth
4. **Review**: Review results, approve/reject findings, add feedback
5. **Complete**: Export as Markdown, DOCX, or PPTX

### Intake Form Sections

| Section | Component | Fields |
|---------|-----------|--------|
| Company | company-form.tsx | Company name, website, industry, CMS, language, multi-language |
| Strategy | strategy-form.tsx | ICP, pain points, USPs, goals, budget priority, previous SEO, restrictions |
| Competitors | competitors-form.tsx | List of {name, domain} pairs |
| Channels | channels-form.tsx | Social media URLs (YouTube, LinkedIn, Reddit, X, etc.) |
| Key Figures | key-figures-form.tsx | Founders/CEOs/experts {name, role} |

---

## API Keys & External Services

### API Key Registry

| Key Name | Service | Used By | Required? |
|----------|---------|---------|-----------|
| `anthropic` / `claude` | Claude API | All Claude AI modules, prompt tracking | Yes (core) |
| `openai` | OpenAI/ChatGPT | geo-prompt-*, geo-trust-alignment, geo-refinement-mining, geo-fan-outs | Optional (LLM platform) |
| `perplexity` | Perplexity API | geo-prompt-*, geo-trust-alignment | Optional (LLM platform) |
| `gemini` | Google Gemini | geo-prompt-*, geo-trust-alignment | Optional (LLM platform) |
| `google_cloud` | Google APIs | PageSpeed Insights | Optional (free tier) |
| `youtube` | YouTube Data API v3 | yt-topics, yt-channel, yt-outliers, yt-ai-readiness | Required for YouTube modules |
| `dataforseo_login` | DataForSEO | seo-backlinks, SERP data, domain rank | Optional (paid) |
| `dataforseo_password` | DataForSEO | (paired with login) | Optional (paid) |
| `serpapi` | SerpAPI | yt-topics SERP check | Optional |
| `moz` | Moz API | Domain authority | Optional |

### API Key Loading Priority

1. `settings.json` → `api_keys` object (shared between dashboard & CLI)
2. Environment variables (fallback)

---

## Cross-Module Aggregation

### SEO Health Score Weights

```python
SEO_HEALTH_WEIGHTS = {
    "seo_citability":      0.20,   # Passage structure, machine readability
    "seo_authority":       0.15,   # Wikidata, DA, entity recognition
    "seo_blog_analyzer":   0.15,   # Blog content AI search readiness
    "seo_broken_links":    0.15,   # Link health
    "seo_orphan_pages":    0.10,   # Internal linking completeness
    "seo_backlinks":       0.15,   # External backlink authority
    "seo_cannibalization": 0.10,   # Content overlap/conflict
}
# Sum = 1.0
```

### GEO Health Score Weights

```python
GEO_HEALTH_WEIGHTS = {
    "m3_citability":      0.17,   # Can AI read and cite you?
    "agent_readiness":    0.12,   # JS rendering gaps for AI agents
    "blog_analyze":       0.12,   # Content AI search readiness
    "m7_authority":       0.12,   # Off-site trust signals (Wikidata, Reddit, DA)
    "m8_prompt_tracking": 0.12,   # LLM recommendation performance
    "trust_alignment":    0.10,   # Does LLM description match sales pitch?
    "intersection_gap":   0.05,   # Pillar intersection content coverage
    "broken_links":       0.10,   # Link health
    "backlink_graph":     0.10,   # External backlink authority
}
# Sum = 1.0
```

### Blog Analyzer Category Weights (per-URL)

The rewritten Blog Analyzer scores each selected post individually with Claude Haiku, using the actual post HTML (not the homepage) as input. Site-level score is the recency-weighted average of per-post scores.

```typescript
// thinkagain/lib/modules/blog-analyze.ts
const CATEGORY_WEIGHTS = {
  content_structure:    0.10,
  ai_citability:        0.20,
  schema_markup:        0.15,
  meta_onpage:          0.10,
  internal_linking:     0.10,
  image_optimization:   0.05,
  content_freshness:    0.10,
  ai_search_readiness:  0.20,
}
```

**Discovery flow** (`thinkagain/lib/services/blog-post-discovery.ts`):
1. RSS/Atom autodiscover via homepage `<link rel="alternate">` + common feed paths
2. Blog-flavoured XML sitemaps (`/blog-sitemap.xml`, `/post-sitemap.xml`, …)
3. Main `/sitemap.xml` filtered for editorial path patterns
4. Crawl fallback on `/blog`, `/insights`, `/resources`, `/articles`, `/news`, `/case-studies`

**Selection** (`/dashboard/clients/[slug]/page-actions?class=editorial`): the Page Recommendations table renders ghost rows for feed-discovered editorial posts that haven't been scored yet (returned by `/api/clients/[id]/page-actions/pages?include=discovered&class=editorial`), alongside any already-analyzed rows. Defaults are 10 most recent unanalyzed posts. Quick presets cover Recent 10/25, Stale + new, All. The "Force re-analyze" toggle re-runs Claude on posts analyzed within the last 30 days. The legacy `/blog-analyzer` route now redirects here.

**Run modes** (sticky action bar):

* **Quick re-score** — editorial-only. POST `/api/clients/[id]/page-actions { action: "quick_rescore", urls }`. Runs `analyzeBlogPostForUrl` per URL, recomputes the Editorial Score on top, and carries forward SEO/Content/Agents scores + actions from the latest `page_actions_pages` row. Persisted as `page_actions_runs.trigger = 'quick_rescore'`. Disabled when the selection contains commercial URLs.
* **Full audit** — POST `/api/clients/[id]/page-actions { action: "batch", urls }`. Runs every applicable module (existing `batch` flow). Persisted as `page_actions_runs.trigger = 'batch'`.

### Editorial Score

The Editorial Score is the umbrella metric for editorial pages (blogs, insights, resources, case studies). Computed in `thinkagain/lib/services/editorial-score.ts`:

```typescript
const EDITORIAL_WEIGHTS = {
  informationGain: 0.50,  // Claude `information-gain` (deep) or pattern fallback
  nonCommodity:    0.30,  // differentiation + show-don't-tell + delta + generic-phrase penalties
  blogAnalyze:     0.20,  // per-URL Blog Analyzer score
}
const KEYWORD_STUFFING_CAP = 35  // hard-cap when geo-content-readiness flags stuffing
const EDITORIAL_BAND_THRESHOLDS = { commodity: 40, nonCommodity: 70 }  // <40, 40–69, ≥70
```

Missing inputs are skipped and remaining weights are renormalised pro-rata so a missing Blog Analyzer score doesn't drag the result down. The score is stored on `page_actions_pages` (`editorial_score`, `editorial_band`, `editorial_breakdown`) and exposed in:
- The "Editorial" column on the Page Recommendations URL table (sortable, band-coloured)
- The `<EditorialScoreCard>` on the per-URL detail page (with the three-point commodity-test checklist rendered)
- The Editorial Quality pillar on the Website spider chart (via the virtual `editorial-score` ModuleResult synthesised by `injectEditorialScoreResult()`)
- A `content_subscore` row on `metric_snapshots` for trend charts


### Citability (M3) Category Weights

```python
M3_WEIGHTS = {
    "ai_crawler_access":    0.10,
    "llms_txt_compliance":  0.06,
    "machine_readability":  0.11,
    "answer_readiness":     0.13,
    "passage_citability":   0.13,
    "deep_link_support":    0.04,
    "schema_ai":            0.10,
    "webmcp":               0.03,
    "fitness_signals":      0.15,  # Holland/Seer
    "citation_readiness":   0.15,  # Anna York/Snippet
}
```

### Authority (M7) Category Weights

```python
M7_WEIGHTS = {
    "wikidata":              0.20,
    "reddit":                0.15,
    "youtube":               0.15,
    "domain_authority":      0.20,
    "third_party_profiles":  0.15,
    "unaided_visibility":    0.15,
}
```

### Trust Alignment (Toth Framework) Weights

```python
TRUST_ALIGNMENT_WEIGHTS = {
    "factual_accuracy":      0.35,
    "positioning_accuracy":  0.25,
    "completeness":          0.25,
    "freshness":             0.15,
}
```

### Agent Readiness Category Weights

```python
AGENT_READINESS_WEIGHTS = {
    "content_gap":          0.25,   # Word count raw vs rendered
    "structured_data_gap":  0.15,   # JSON-LD in raw vs rendered
    "price_stock":          0.15,   # Pricing in raw HTML
    "review_widgets":       0.12,   # Client-side review widgets
    "faq_accordion":        0.10,   # Hidden FAQ content
    "product_variants":     0.10,   # JS-only variant selectors
    "search_functionality": 0.08,   # JS-only search (Algolia etc.)
    "faceted_navigation":   0.05,   # URL-less filtering
}
```

---

## Page Content Analysis (33-Question Framework)

The Page Content Analysis module evaluates each page against 33 questions organized in 8 weighted categories:

### Categories & Questions

**1. Kernboodschap / BLUF (15%)**
1. Kernboodschap in headline — Is binnen 5 seconden duidelijk wat je aanbiedt?
2. Waardepropositie — Staat de belangrijkste belofte boven de vouw?
3. Call-to-action — Is er een duidelijke, zichtbare volgende stap?

**2. Waardepropositie (15%)**
1. What is this? — Is direct duidelijk wat het product/dienst is?
2. What problem does it solve? — Wordt het probleem helder benoemd?
3. Who does it solve it for? — Is de doelgroep specifiek genoeg?
4. How does it solve the problem? — Wordt de oplossing concreet uitgelegd?
5. How is it better than competitors? — Duidelijke differentiators?
6. Where is the proof? — Testimonials, case studies, data?
7. What makes this unique? — Unieke info/data die nergens anders te vinden is?

**3. Copy Kwaliteit (15%)**
1. Helderheid — Kort, begrijpelijk, vrij van onnodig jargon?
2. Specifiteit — Concrete feiten/cijfers vs. vage claims?
3. Benefits vs. features — Vertelt wat het de lezer oplevert?
4. Tone of voice — Consistent en passend bij doelgroep?
5. Filler detectie — Hoeveel zinnen zijn 'lege calorieën'?

**4. Structuur & Scanability (15%)**
1. Heading-hiërarchie — H1→H2→H3 logisch en beschrijvend?
2. Lijsten & tabellen — Complexe info visueel gestructureerd?
3. Alinealengte — Geen walls of text? Korte, scanbare blokken?
4. Visuele afwisseling — Mix van tekst, beeld, whitespace?

**5. Citability & Machine Readiness (10%)**
1. Quotable kernpassage — 2-3 zin passage die AI direct kan citeren?
2. Bronvermelding — Claims onderbouwd met externe bronnen/data?
3. Schema markup — Relevante structured data aanwezig en correct?

**6. Volledigheid (10%)**
1. Vervolgvragen — 'People also ask'-vragen beantwoord?
2. Scope afbakening — Duidelijk wat pagina wel/niet behandelt?
3. Actualiteit — Publicatiedatum, 'bijgewerkt op' aanwezig?

**7. E-E-A-T (10%)**
1. Experience — Toont echte ervaring met het onderwerp?
2. Expertise — Auteur/organisatie aantoonbaar deskundig?
3. Authoritativeness — Wordt verwezen door anderen?
4. Trustworthiness — Vertrouwenssignalen aanwezig?

**8. Meta & SERP (10%)**
1. Title tag — Past bij inhoud, primaire keyword, lengte ok?
2. Meta description — Accurate preview, CTA, lengte ok?
3. Match inhoud ↔ meta — Belooft title/description wat pagina levert?
4. Keyword-alignment — Primaire zoekwoord in title, description én H1?

### Scoring per question:
- **pass** = full points
- **partial** = half points
- **fail** = 0 points

Overall score = weighted average × 100.

---

## Dashboard Pages & Components

### Page Structure

| Route | Page | Description |
|-------|------|-------------|
| `/` | Home | Landing / client selection |
| `/clients` | Client Directory | List all clients, create new |
| `/client/[id]/intake` | Intake Form | Company info, strategy, competitors |
| `/client/[id]/data` | Data Import | Upload GSC, GA4, Ahrefs CSV data |
| `/client/[id]/modules` | Module Selection | Toggle & configure modules, set depth, run |
| `/client/[id]/output` | Results Dashboard | Scores, radar charts, findings, recommendations |
| `/client/[id]/audit` | Audit Report | Full report view |
| `/client/[id]/slides` | Slide Deck | PPTX presentation editor & export |
| `/client/[id]/export` | Export | Download as PDF/DOCX/PPTX |
| `/settings` | Settings | API keys, tone of voice preferences |

### Key Components

| Component | Path | Purpose |
|-----------|------|---------|
| `module-grid.tsx` | components/modules/ | Tab-based module selection with toggles |
| `module-runner.tsx` | components/modules/ | Execute selected modules, show progress |
| `module-dashboard.tsx` | components/modules/ | Display results: scores, charts, findings |
| `gsc-dashboard.tsx` | components/analyzers/ | Google Search Console data visualization |
| `yt-studio-dashboard.tsx` | components/analyzers/ | YouTube Studio data import & visualization |
| `cwv-dashboard.tsx` | components/analyzers/ | PageSpeed Insights Core Web Vitals display |
| `slide-deck.tsx` | components/slides/ | Presentation viewer/editor |
| `app-sidebar.tsx` | components/layout/ | Navigation sidebar with client list |

### State Management

Zustand store (`lib/store.ts`) manages:
- Current client selection
- Module configurations (enabled/depth per module)
- Run status & results
- Page audit answers (33-question framework)

---

## Prompt Templates

### Prompt Tracking (Holland Framework) — Buying Situation Prompts

```python
# Broad prompts (fame-dependent):
"Wat zijn de beste bedrijven/bureaus in {sector} in de {region} markt?"
"Ik zoek een partner voor {sector}. Welke partijen raden jullie aan?"
"Geef een overzicht van de top aanbieders in {sector}."

# Constrained prompts (positioning-dependent):
"Ik zoek een {sector} partij die specifiek sterk is in {fitness_signal}. Wie raden jullie aan?"
"Welk bedrijf helpt het beste met {fitness_signal} in de {sector} markt?"
"Vergelijk de beste opties voor {fitness_signal} in {sector}."
"Ik ben op zoek naar een oplossing voor {fitness_signal}. Welke {sector} aanbieders zijn het sterkst?"
```

### Prompt Discovery Templates

```python
"Wat zijn de top 5 {region} bureaus/bedrijven in {expertise_domain}?"
"Ik ben een {icp_role} bij een {sector} bedrijf en wil {expertise_domain} implementeren. Welke partijen?"
"Welke bedrijven helpen {sector} bedrijven met {pain_point}?"
"Geef een marktoverzicht van {expertise_domain} aanbieders in {region}."
"Wie zijn de meest invloedrijke partijen/denkers in {expertise_domain}?"
```

### Refinement Mining Templates (NL)

```python
"Wat is de beste {sector}?"
"Help me kiezen: welke {sector} past het beste bij mij?"
"Ik zoek een oplossing voor {sector}. Wat raden jullie aan?"
"Geef me advies over het kiezen van {sector}."
"Wat zijn de belangrijkste factoren bij het kiezen van {sector}?"
"Vergelijk de top opties voor {sector}."
```

### GEO Fan-Out Templates (NL)

```python
"Wat is de beste {sector}?"
"Vergelijk de top opties voor {sector} in 2026."
"Welke {sector} past bij een middelgroot bedrijf?"
"Wat zijn de voor- en nadelen van verschillende {sector} oplossingen?"
"Hoe kies ik de juiste {sector}?"
"Wat kost {sector} gemiddeld?"
```

---

## Configuration Constants

### AI Crawler Identifiers

```python
AI_CRAWLERS = {
    "GPTBot": "GPTBot",
    "ChatGPT-User": "ChatGPT-User",
    "ClaudeBot": "anthropic",
    "PerplexityBot": "PerplexityBot",
    "Google-Extended": "Google-Extended",
    "CCBot": "CCBot",
    "Bytespider": "Bytespider",
    "Applebot-Extended": "Applebot-Extended",
}
```

### Review Widget Signatures (Agent Readiness)

```python
REVIEW_WIDGET_SIGNATURES = {
    "Trustpilot": ["trustpilot-widget", "trustpilot.com/widget", ...],
    "Bazaarvoice": ["bv-content", "bazaarvoice", ...],
    "Yotpo": ["yotpo-widget", "yotpo.com", ...],
    "Judge.me": ["jdgm-widget", "judge.me", ...],
    "Reviews.io": ["reviewsio", "reviews.co.uk", ...],
    "Kiyoh": ["kiyoh", "klantenvertellen", ...],
    "Stamped.io": ["stamped-reviews", "stamped.io"],
    "Loox": ["loox-reviews", "loox.io"],
}
```

### JS Search Widget Signatures

```python
JS_SEARCH_SIGNATURES = [
    "algolia", "instantsearch", "searchspring", "doofinder", "klevu",
    "searchanise", "findify", "coveo", "bloomreach", "constructor.io",
]
```

### Citability Optimal Passage Length

```python
PASSAGE_OPTIMAL_WORDS = (134, 167)  # Optimal word count for AI-citable passages
```

### Intent → Funnel Stage Mapping

```python
INTENT_VOLUME_FUNNEL_MAP = {
    "informatie": "awareness",
    "navigatie": "awareness",
    "orientatie": "consideration",
    "inspiratie": "consideration",
    "transactie": "decision",
    "generatie": "consideration",
    "community": "retention",
    "emotie": "awareness",
    "lokaal": "decision",
}
```

### Entity Recognition Index (ERI)

```python
ERI_SIGNALS = {
    "wikidata_entity": 10,       # Has QID on Wikidata
    "wikipedia_page": 10,        # Own article or mentioned
    "knowledge_panel": 10,       # Google Knowledge Panel
    "founder_entity": 10,        # Founder has own Wikidata entry
    "sameas_linking": 10,        # Organization schema sameAs
    "brand_consistency": 10,     # Consistent name across platforms
}
```

### Third-Party Profile Platforms

```python
THIRD_PARTY_PLATFORMS = {
    "trustpilot": "https://www.trustpilot.com/review/{domain}",
    "g2": "https://www.g2.com/products/{brand}/reviews",
    "capterra": "https://www.capterra.com/p/{brand}",
    "clutch": "https://clutch.co/profile/{brand}",
    "linkedin": "https://www.linkedin.com/company/{brand}",
    "crunchbase": "https://www.crunchbase.com/organization/{brand}",
    "glassdoor": "https://www.glassdoor.com/Reviews/{brand}-Reviews",
}
```

### BLUF Anti-Patterns (Content Quality Detection)

```python
# Dutch
BLUF_ANTI_PATTERNS_NL = [
    r"^In dit artikel", r"^Het is belangrijk", r"^Er zijn verschillende",
    r"^Laten we (eens )?kijken", r"^Veel mensen vragen zich af",
    r"^Een veelgestelde vraag", r"^Tegenwoordig",
    r"^Als je op zoek bent", r"^Welkom bij",
]

# English
BLUF_ANTI_PATTERNS_EN = [
    r"^In this article", r"^It is important", r"^There are (many|several|various)",
    r"^Let's (take a )?look", r"^Many people wonder",
    r"^A (common|frequently asked) question", r"^Nowadays",
    r"^If you('re| are) looking", r"^Welcome to",
]
```

---

## Competitive Landscape & Market Positioning

Lloyd opereert op het snijvlak van meerdere tool-categorieën. Geen enkele bestaande tool dekt hetzelfde spectrum. Hieronder een vergelijking per categorie.

### 1. Traditionele SEO Platforms (Ahrefs, Semrush, Moz, Screaming Frog, Sitebulb)

| Capability | Ahrefs / Semrush | Screaming Frog / Sitebulb | Lloyd |
|---|---|---|---|
| Keyword database | Eigen index (miljarden keywords) | Nee | Nee — importeert hun CSV data |
| Backlink database | Eigen crawl (trillions of links) | Nee | DataForSEO API + authority scoring |
| Technical crawl | Basis (Semrush Site Audit) | Deep (JS rendering, custom extraction) | Claude AI-gestuurd (context-aware, geen eigen crawler) |
| Content analyse | Oppervlakkig (word count, readability) | Nee | Diep: 33-vragen framework, BLUF, filler detection, citability |
| GEO / AI Search | ❌ | ❌ | ✅ Kernfunctie — 8 GEO modules |
| YouTube | ❌ | ❌ | ✅ 5 modules (channel, outliers, topics, packaging, AI readiness) |
| Topic intent classificatie | ❌ | ❌ | ✅ SIF: 9 intents × 31 subcategorieën × 13 platforms |
| Deliverable output | Dashboard exports, PDF | HTML/CSV export | PPTX, DOCX, PDF — klantklare presentaties |
| Prijs | $99–449/maand | £199 éénmalig / £39/maand | Eigen infra + API kosten |

**Positie:** Lloyd concurreert niet met hun databases — het *consumeert* hun data via CSV import en DataForSEO. Lloyd voegt de AI-interpretatielaag toe die zij volledig missen: context-aware bevindingen voor *dit type bedrijf* in *deze industrie*.

---

### 2. AI Content Tools (Surfer SEO, Clearscope, MarketMuse, Frase)

| Capability | Surfer / Clearscope / Frase | Lloyd |
|---|---|---|
| Content editor (real-time) | ✅ NLP suggestions tijdens schrijven | ❌ Analyseert, schrijft niet |
| SERP-gebaseerde optimalisatie | ✅ TF-IDF vs top 10 resultaten | ❌ Geen eigen SERP scraper |
| Content brief generatie | ✅ | ✅ Via Claude AI prompts |
| AI citability scoring | ❌ | ✅ Passage-level, 134–167 woord optimum |
| GEO / AI crawler audit | ❌ | ✅ GPTBot, ClaudeBot, PerplexityBot, llms.txt |
| Multi-module audit systeem | ❌ Alleen content focus | ✅ 27+ modules in 5 categorieën |
| E-E-A-T framework | Basis | ✅ Diep — 4 sub-signals, experience-first |

**Positie:** Surfer et al. optimaliseren content voor Google rankings (TF-IDF vs top 10). Lloyd optimaliseert voor AI citation + recommendation — een fundamenteel ander doel. Zij beantwoorden "hoe rank ik hoger?", Lloyd beantwoordt "hoe word ik geciteerd door ChatGPT?"

---

### 3. GEO / AI Visibility Tools (Otterly.AI, Profound, Gumshoe, Peec.ai, Goodie)

| Capability | Otterly.AI | Profound | Gumshoe | Lloyd |
|---|---|---|---|---|
| AI brand mention tracking | ✅ Multi-platform monitoring | ✅ Citation tracking | ✅ Multi-platform | ✅ Prompt tracking |
| Scheduled monitoring | ✅ Daily/weekly | ✅ | ✅ | ❌ On-demand runs |
| Ghost citation detection | ❌ | ❌ | Beperkt | ✅ Seer framework (content als bron, brand niet genoemd) |
| Recommendation vs citation split | ❌ | ❌ | ❌ | ✅ Holland: AANBEVOLEN / Geciteerd / Ghost / Afwezig |
| Trust alignment scoring | ❌ | ❌ | ❌ | ✅ Toth: LLM output vs ideaal salesantwoord |
| Refinement mining | ❌ | ❌ | ❌ | ✅ Category pillars uit LLM follow-ups |
| Fan-out discovery | ❌ | ❌ | ❌ | ✅ Sub-queries die LLMs intern genereren |
| Agent readiness (JS gap) | ❌ | ❌ | ❌ | ✅ Playwright raw vs rendered vergelijking |
| Intersection content gaps | ❌ | ❌ | ❌ | ✅ Toth deal-breaker pillar intersections |
| YouTube AI readiness | ✅ (OtterlyAI) | ❌ | ❌ | ✅ (OtterlyAI methodologie) |
| SEO audit integratie | ❌ | ❌ | ❌ | ✅ 11 website SEO modules |
| Prijs | $39–299/maand | $99–499/maand | $49–199/maand | Eigen infra + API kosten |

**Positie:** Bestaande GEO tools zijn *trackers* — ze meten óf je brand genoemd wordt. Lloyd is een *optimizer* — het vertelt je **waarom** je niet geciteerd wordt (ghost citations, trust misalignment, missing fitness signals, JS rendering gaps) én **wat je moet fixen**. De diagnose + behandeling in plaats van alleen de thermometer.

---

### 4. YouTube SEO Tools (TubeBuddy, vidIQ, Morningfame)

| Capability | TubeBuddy / vidIQ | Morningfame | Lloyd |
|---|---|---|---|
| Keyword research | ✅ Eigen YouTube index | ✅ | SIF-gebaseerd (intent-aware, niet alleen volume) |
| Tag suggestions | ✅ | ❌ | ❌ |
| Thumbnail A/B testing | ✅ | ❌ | ❌ |
| Title scoring | Basis (keyword aanwezig?) | ❌ | ✅ 8-punts systeem: 1of10 triggers, emotie, specificiteit |
| Outlier research | ❌ | Basis | ✅ 3x/5x/10x ratio, replicability score, mining types |
| Channel health analyse | Basis | ✅ | ✅ DNA analyse, content format clustering, packaging |
| Video structure planning | ❌ | ❌ | ✅ 40/30/30 methodologie, hook patterns, video brief |
| AI readiness check | ❌ | ❌ | ✅ Timestamps, transcript, structured descriptions |
| Cross-platform scores | ❌ | ❌ | ✅ YouTube + 12 andere platforms per topic (SIF) |
| Prijs | $0–49/maand | $0–29/maand | Eigen infra + API kosten |

**Positie:** TubeBuddy/vidIQ zijn browser extensions voor individuele creators die per-video optimaliseren. Lloyd is een strategische laag die YouTube koppelt aan een breder search intent framework (SIF) en cross-platform topic research. Het beantwoordt "welke topics moet ik maken en waarom?" in plaats van "hoe optimaliseer ik deze ene video?"

---

### 5. Topic Research Tools (AnswerThePublic, AlsoAsked, KeywordTool.io, Exploding Topics)

| Capability | AnswerThePublic / AlsoAsked | KeywordTool.io | Lloyd |
|---|---|---|---|
| Google suggest | ✅ | ✅ | ✅ topics-google |
| YouTube suggest | ❌ | ✅ | ✅ yt-suggest |
| Bing/Copilot suggest | ❌ | ✅ | ✅ topics-bing |
| Reddit suggest | ❌ | ❌ | ✅ topics-reddit |
| Intent classificatie | ❌ | ❌ | ✅ SIF: 9 intents, 31 subcategorieën |
| Platform suitability scores | ❌ | ❌ | ✅ 13 platforms per topic |
| Funnel stage mapping | ❌ | ❌ | ✅ Intent → awareness/consideration/decision/retention |
| Cluster visualisatie | Basis (wheel diagram) | ❌ | ✅ Interactive network graph + treemap (vis-network, Plotly) |
| Cross-source merge | ❌ | ❌ | ✅ Merge Google + Bing + Reddit + YouTube in één view |
| GSC/Ahrefs volume import | ❌ | ❌ | ✅ topics-intent-volume |
| Prijs | $0–99/maand | $0–89/maand | Gratis (geen API keys nodig) |

**Positie:** Bestaande tools geven je een lijst keywords. Lloyd classificeert elk topic op intent, berekent platform suitability voor 13 platformen, mapt naar funnel stages, en visualiseert clusters — de strategische interpretatielaag die bij elke andere tool ontbreekt.

---

### 6. All-in-One SEO Audit Platforms (SEOptimer, Woorank, ContentKing, Lumar)

| Capability | SEOptimer / Woorank | ContentKing / Lumar | Lloyd |
|---|---|---|---|
| Automated crawl | ✅ One-time scan | ✅ Real-time monitoring | On-demand, Claude AI-gestuurd |
| Technical SEO | Basis checks (20+ regels) | Deep (JS rendering, log file analysis) | Claude AI interpretatie (context-aware per industrie) |
| Content quality | Oppervlakkig (word count) | Basis | Diep (33 vragen, BLUF, E-E-A-T, citability) |
| Continuous monitoring | ❌ | ✅ 24/7 change detection | ❌ On-demand |
| GEO / AI Search | ❌ | ❌ | ✅ 8 GEO modules |
| YouTube audit | ❌ | ❌ | ✅ 5 modules |
| Topic research | ❌ | ❌ | ✅ 6 modules (4 platformen + clustering + intent volume) |
| Client workflow | White-label PDF export | Dashboard | ✅ Volledig: intake → data import → audit → review → PPTX/DOCX export |
| Competitive analysis | Basis vergelijking | ❌ | ✅ Platform presence + DataForSEO + concurrentie-analyse |
| Prijs | $0–59/maand | $99–999/maand | Eigen infra + API kosten |

**Positie:** Traditionele audit platforms zijn rule-based checkers: "title tag > 60 chars = warning". Lloyd gebruikt Claude AI voor context-aware interpretatie — het begrijpt dat een ontbrekende meta description op een 404-pagina irrelevant is, maar op je hoofdproductpagina kritiek. ContentKing/Lumar hebben real-time monitoring die Lloyd niet heeft.

---

### 7. Samenvattend: Capability Matrix

| Capability Cluster | Ahrefs Semrush | Surfer Clearscope | Otterly Gumshoe | TubeBuddy vidIQ | AnswerThePublic | ContentKing Lumar | **Lloyd** |
|---|---|---|---|---|---|---|---|
| Technical SEO Audit | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
| Deep Content Quality | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
| GEO Optimization | ❌ | ❌ | 🟡 tracking | ❌ | ❌ | ❌ | ✅ tracking + optimization |
| YouTube Strategy | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| Cross-Platform Topics | ❌ | ❌ | ❌ | ❌ | 🟡 basic | ❌ | ✅ SIF-classified |
| Intent Framework | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ 9×31×13 |
| Client Deliverables | 🟡 PDF | ❌ | ❌ | ❌ | ❌ | 🟡 PDF | ✅ PPTX/DOCX/PDF |
| Intake→Audit→Export | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |

### Wat Lloyd NIET heeft — uitgebreide analyse

#### 1. Geen eigen data-infrastructuur

Lloyd heeft geen eigen crawler, geen eigen keyword index, geen eigen backlink database. Ahrefs crawlt het hele web continu (trillions of pages), Semrush heeft een eigen keyword database van miljarden queries. Lloyd leunt op:
- CSV imports (GSC, Ahrefs, Semrush exports)
- DataForSEO API (backlinks, SERP data, domain rank)
- SerpAPI (Google SERP checks)

**Impact voor thinkaga.in:** Gebruikers hebben altijd een Ahrefs/Semrush abonnement nodig naast Lloyd voor keyword en backlink data. Dit maakt de total cost of ownership hoger. Alternatief: DataForSEO als volledig geïntegreerde databron uitbouwen (keywords, rankings, backlinks — alles via API in plaats van CSV import).

#### 2. Geen real-time monitoring

ContentKing en Lumar monitoren 24/7 — als je robots.txt per ongeluk je hele site blokkeert om 3 uur 's nachts, krijg je een alert. Lloyd is project-based: je runt een audit, krijgt resultaten, klaar. Er is geen "watch mode" die continu veranderingen bijhoudt.

**Impact voor thinkaga.in:** Klanten verwachten continue monitoring, niet éénmalige scans. Een "monitoring tier" met scheduled runs (dagelijks/wekelijks) + alerting (Slack, email) zou een sterke SaaS feature zijn. Technisch: cron jobs op de Python backend + Supabase Realtime voor alerts.

#### 3. Geen content editor / schrijfhulp

Surfer SEO en Clearscope geven je een editor waar je content in schrijft en real-time feedback krijgt: "voeg dit keyword toe", "maak deze alinea korter", "je mist deze subtopics vs de top 10". Lloyd analyseert bestaande content maar helpt niet bij het schrijven van nieuwe content.

**Impact voor thinkaga.in:** Na de analyse ("je citability score is 45") zou een editor die je helpt passages te herschrijven naar 134–167 woorden met quotable structure enorm waardevol zijn. Dit is een natuurlijke extensie van de Page Content Analysis module — van diagnose naar behandeling.

#### 4. Geen historische data / trendanalyse

Lloyd maakt een snapshot op het moment van de audit. Er is geen "vergelijk met vorige maand" of "hoe is je GEO score over tijd geëvolueerd?". Elke run is een losstaand resultaat.

**Impact voor thinkaga.in:** Essentieel voor de online versie. Klanten willen zien dat hun score van 62 naar 78 is gegaan na implementatie. Technisch simpel: sla resultaten op per datum in Supabase, toon trendlijnen per module score. De data is er al (StructuredModuleOutput met scores), alleen de opslag en visualisatie ontbreekt.

#### 5. Geen ranking tracking

Lloyd vertelt je niet "je staat op positie 7 voor keyword X". Ahrefs, Semrush, SE Ranking, AccuRanker — zij tracken dagelijks je posities voor honderden keywords. Lloyd importeert GSC data (clicks, impressies, gemiddelde positie) maar doet geen actieve rank tracking.

**Impact voor thinkaga.in:** Rank tracking vereist dagelijkse SERP scraping op schaal — dat is een aparte infrastructuur met significante kosten. Opties: (a) integreren met DataForSEO SERP API voor on-demand position checks, (b) GSC API koppeling voor near-real-time data, (c) partneren met gespecialiseerde rank trackers via API.

#### 6. Geen lokale SEO / Google Business Profile management

Lloyd checkt óf je een GBP hebt (Platform Presence module), maar doet geen lokale SEO audit: NAP-consistentie, lokale citations, review management, lokale keyword rankings, Google Maps positie. Tools als BrightLocal, Whitespark en Moz Local doen dit wel.

**Impact voor thinkaga.in:** Groot segment van de markt wordt gemist. Lokale bedrijven (restaurants, advocaten, tandartsen) zijn een enorme doelgroep voor SEO tools. Het SIF framework heeft al een "lokaal" intent (in_de_buurt, routebeschrijving, beschikbaarheid), maar de modules doen er niets mee. Zou een aparte module-categorie kunnen worden.

#### 7. Geen link building tools

Lloyd analyseert je bestaande backlink profiel (via DataForSEO) en scoort je authority, maar helpt niet bij het vinden van link opportunities. Tools als Pitchbox, BuzzStream, Hunter.io en Ahrefs' Content Explorer bieden outreach workflows, prospect databases en email automation.

**Impact voor thinkaga.in:** Link building is een apart vakgebied. Lloyd zou wel een "link opportunity finder" kunnen bouwen op basis van de competitive analysis + intersection gaps data die er al is — "deze concurrent heeft links van X, Y, Z die jij niet hebt" is al afleidbaar uit de DataForSEO data.

#### 8. Geen multi-user / team collaboration

Lloyd is nu single-user. Er is geen login, geen rollen (auditor vs reviewer vs klant), geen comments op bevindingen, geen approval workflows met meerdere reviewers.

**Impact voor thinkaga.in:** Dag-één functionaliteit voor de online versie. Supabase Auth + Row Level Security lost het technisch op. Rollen: admin (bureau-eigenaar), auditor (voert audits uit), reviewer (keurt bevindingen goed/af), client (ziet eigen resultaten). White-label optie voor agencies.

#### 9. Geen API / integraties

Lloyd heeft geen publieke API. Je kunt het niet koppelen aan Zapier, Make, Slack, of je eigen tools.

**Impact voor thinkaga.in:** Belangrijk voor adoptie bij agencies en enterprise. Minimaal nodig: (a) REST API voor module runs en resultaten, (b) webhooks voor status updates, (c) Slack/Teams notificaties na audit completion. Zapier/Make integratie komt vanzelf als de API er is.

#### 10. Geen JavaScript rendering voor technische audits

Screaming Frog en Sitebulb kunnen JavaScript renderen om te zien wat Googlebot ziet. Lloyd's technische SEO module analyseert raw HTML via Claude AI — het ziet niet wat een browser ziet na JS execution. De agent-readiness module gebruikt wél Playwright, maar alleen voor de GEO vergelijking (raw vs rendered), niet voor de technische SEO audit.

**Impact voor thinkaga.in:** Voor JS-heavy sites (React, Vue, Angular) mist de technische audit kritieke problemen. Oplossing: de Playwright infrastructure van agent-readiness hergebruiken voor de technische SEO module — render de pagina, vergelijk met raw HTML, en voed het verschil aan Claude AI.

---

### Samenvatting: Bewust vs Gap

| # | Capability | Type | Prioriteit voor thinkaga.in |
|---|---|---|---|
| 1 | Eigen keyword/backlink database | Bewust niet | Laag — blijf data importeren, bouw DataForSEO integratie uit |
| 2 | Real-time monitoring | Gap | **Hoog** — scheduled runs + alerting als SaaS feature |
| 3 | Content editor / schrijfhulp | Bewust niet (voor nu) | Medium — natuurlijke extensie van Page Content Analysis |
| 4 | Historische data / trends | Gap | **Hoog** — essentieel voor klantwaarde ("je score is gestegen") |
| 5 | Ranking tracking | Gap | Medium — GSC API koppeling of DataForSEO SERP API |
| 6 | Lokale SEO / GBP | Gap | Medium — groot marktsegment, SIF heeft al lokaal intent |
| 7 | Link building tools | Bewust niet | Laag — apart vakgebied, eventueel opportunity finder |
| 8 | Multi-user / teams | Gap | **Hoog** — dag-één feature voor online versie |
| 9 | API / integraties | Gap | **Hoog** — noodzakelijk voor agency adoptie |
| 10 | JS rendering (tech audit) | Gap | Medium — hergebruik Playwright van agent-readiness |

### Core Thesis

> **Lloyd is de enige tool die SEO + GEO + YouTube + Topic Research + Client Workflow combineert in één platform, aangedreven door AI-interpretatie (Claude) in plaats van rule-based checks. Het is gebouwd voor consultancies die audits leveren, niet voor marketeers die per-keyword optimaliseren.**

De twee uniekste eigenschappen:
1. **GEO optimization** (niet alleen tracking) — ghost citations, trust alignment, refinement mining, agent readiness
2. **Search Intent Framework (SIF)** — 9 intents × 31 subcategorieën × 13 platform scores als universele classificatielaag onder alle modules

---

## Methodology Credits

Lloyd's modules are built on research and frameworks from:

| Framework | Author/Source | Used In |
|-----------|--------------|---------|
| Recommendation Intelligence | Andrew Holland (2026) | geo-prompt-tracking |
| Ghost Citation Research (362K responses) | Seer Interactive | geo-prompt-tracking, seo-citability |
| Trust Alignment Framework | Steve Toth / Notebook Agency (2026) | geo-trust-alignment |
| Refinement Mining | Steve Toth (2026) | geo-refinement-mining |
| Deal-breaker Intersection Content | Steve Toth (2026) | geo-intersection-gaps |
| Citation Readiness | Anna York / Snippet Digital | seo-citability |
| Fitness Signals | Andrew Holland | seo-citability, geo-prompt-tracking |
| YouTube AI Readiness | OtterlyAI | yt-ai-readiness |
| Search Intent Framework (SIF) | ThinkAgain.nl (2025-2026) | All modules (shared classifier) |
| YouTube Topic Research Methodology | ReMarkt / seobrein.nl | yt-topics |
| Platform Score Matrix v6 | Cursos | SIF platform suitability scores |
| E-E-A-T (Dec 2025 update) | Google | seo-content, seo-page-audit |
