Map complete topic clusters for any subject area — hub pages, spoke articles, supporting content, internal linking architecture. Identifies content gaps, priority order, and builds a structured content calendar. Produces topic maps that build genuine topical authority, not random blog posts.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the topical-authority-mapper skill
Most content strategies are just keyword lists turned into blog posts. Real topical authority requires a structured map: pillar pages that own broad topics, cluster pages that go deep on subtopics, and an internal linking architecture that tells Google "we comprehensively cover this subject." This skill builds that map.
Core principle: Google rewards topical depth, not random keyword coverage. A site with 15 interlinked articles that thoroughly cover "sales automation" will outrank a site with 50 unrelated blog posts that happen to mention the phrase. This skill builds the cluster architecture that creates genuine authority.
Topic cluster mapping is significantly better with keyword data that shows search volume, difficulty, and semantic relationships across hundreds of subtopic variations.
"I can build a comprehensive topical authority map using competitive analysis and content gap identification. For the most precise results — especially accurate volume data and keyword clustering at scale — I'd recommend connecting a keyword data API."
Recommended: DataForSEO (pay-per-use, ~$0.01/keyword, no monthly minimum)
- Sign up at dataforseo.com → get API login + password
- Set
DATAFORSEO_LOGINandDATAFORSEO_PASSWORDenv varsAlternatives that also work:
- Keywords Everywhere API ($1 per 10 credits = 100K keywords, very cheap) → set
KEYWORDS_EVERYWHERE_API_KEY- SEMrush API (if you have a subscription) → set
SEMRUSH_API_KEY- Ahrefs API (if you have a subscription) → set
AHREFS_API_TOKEN"Want to use one of these, or should I proceed with baseline mode? Baseline uses our existing SEO tools and web research — still produces a strong topic map, but with less granular volume data per subtopic."
seo-domain-analyzer for domain metrics, web_search for topic research, reddit-post-finder for question mining, competitor analysis via site-content-catalog. Topic mapping and cluster architecture are equally strong. Volume estimates are directional rather than exact.Run site-content-catalog on your site:
python3 skills/site-content-catalog/scripts/catalog_content.py \
--url "<your_site_url>" \
--output jsonMap all existing content:
For each competitor, run site-content-catalog:
python3 skills/site-content-catalog/scripts/catalog_content.py \
--url "<competitor_url>" \
--output jsonMap their content architecture:
Run seo-domain-analyzer for your site and competitors:
For each target topic area, generate the full subtopic universe:
Enhanced mode (DataForSEO / Keywords Everywhere):
# DataForSEO keyword suggestions
POST /v3/dataforseo_labs/google/keyword_suggestions/live
{
"keyword": "<topic>",
"limit": 500
}
# DataForSEO related keywords
POST /v3/dataforseo_labs/google/related_keywords/live
{
"keyword": "<topic>",
"limit": 500
}Extract:
Baseline mode:
Use multiple sources to build the subtopic list:
web_search for "topic + [what/how/why/best/vs/guide/examples]"reddit-post-finder for questions people ask about the topicRun reddit-post-finder for each topic area:
python3 skills/reddit-post-finder/scripts/search_reddit.py \
--subreddit "<relevant_subs>" \
--keywords "<topic>" \
--days 365 --sort top --time yearExtract:
Group all discovered keywords/subtopics into semantic clusters:
Enhanced mode: Use DataForSEO keyword clustering API or group by SERP overlap (keywords that share 3+ ranking URLs likely belong to the same cluster).
Baseline mode: Manual semantic grouping based on:
For each topic area, design the cluster hierarchy:
PILLAR: [Broad Topic] — "The Complete Guide to [Topic]"
│
├── CLUSTER 1: [Subtopic Group A]
│ ├── Article: [Specific subtopic A1]
│ ├── Article: [Specific subtopic A2]
│ └── Article: [Specific subtopic A3]
│
├── CLUSTER 2: [Subtopic Group B]
│ ├── Article: [Specific subtopic B1]
│ ├── Article: [Specific subtopic B2]
│ └── Article: [Specific subtopic B3]
│
├── CLUSTER 3: [Subtopic Group C]
│ ├── Article: [Specific subtopic C1]
│ └── Article: [Specific subtopic C2]
│
└── SUPPORTING: [Glossary terms, FAQs, tools]
├── Glossary: [Term 1]
├── Glossary: [Term 2]
└── FAQ: [Common questions]For each piece in the cluster:
| Content Type | When to Use | Typical Word Count |
|---|---|---|
| Pillar page | Broad topic overview, links to all cluster content | 3,000-5,000+ |
| Cluster article | Deep dive on subtopic | 1,500-3,000 |
| Comparison post | vs/ or alternatives content | 2,000-3,500 |
| How-to guide | Step-by-step instruction | 1,500-2,500 |
| Glossary entry | Definition + context | 500-1,000 |
| Tool/Calculator | Interactive resource | 500 + tool |
| Case study | Proof point | 1,000-2,000 |
| Listicle | Curated collection | 1,500-3,000 |
Design the linking structure:
Map specific anchor text for each link.
| Subtopic | Your Content | Competitor A | Competitor B | Volume | Difficulty | Gap? |
|---|---|---|---|---|---|---|
| [subtopic 1] | ✗ None | ✓ Pillar page | ✓ Blog post | [vol] | [diff] | ✓ High priority |
| [subtopic 2] | ✓ Thin post | ✓ Deep guide | ✗ None | [vol] | [diff] | ✓ Update needed |
| [subtopic 3] | ✓ Strong guide | ✓ Similar | ✓ Similar | [vol] | [diff] | ✗ Covered |
| [subtopic 4] | ✗ None | ✗ None | ✗ None | [vol] | [diff] | ✓ White space |
Score each content piece to create:
| Factor | Weight | Description |
|---|---|---|
| Search volume | 25% | Monthly search demand |
| Competitive gap | 25% | How much better can you be than what exists? |
| Intent alignment | 20% | Does the searcher match your ICP? |
| Cluster completeness | 15% | Does this fill a critical gap in a cluster? |
| Effort | 15% | How much work to create high-quality content? |
Based on content capacity and priority scores:
Month 1: Build [N] pillar foundations
Month 2: Deepen Cluster 1, start Cluster 2
Month 3: Complete Cluster 2, begin Cluster 3
Months 4-6: Expansion
# Topical Authority Map — [Site/Client] — [DATE]
## Executive Summary
- Topic areas mapped: [N]
- Total content pieces identified: [N] (pillars: [N], clusters: [N], supporting: [N])
- Existing content: [N] pages ([N] strong, [N] need updates, [N] gaps)
- Net new content needed: [N] pages
- Estimated timeline to full coverage: [N] months at [N] articles/month
---
## Topic Map: [Topic Area 1]
### Cluster Architecture
[Visual tree structure per Phase 3A]
### Pillar Page
- **Target keyword:** [keyword] ([volume]/mo, [difficulty])
- **Title:** [recommended title]
- **Content type:** Comprehensive guide
- **Word count target:** [X]-[Y]
- **Links to:** [all cluster articles listed]
- **Status:** [Exists — needs update / New — priority [P0/P1/P2]]
### Cluster: [Subtopic Group A]
#### Article: [Subtopic A1]
- **Target keyword:** [keyword] ([volume]/mo, [difficulty])
- **Content type:** [how-to / comparison / listicle / etc.]
- **Word count target:** [X]-[Y]
- **Links to:** Pillar + [related articles]
- **Links from:** Pillar + [related articles]
- **Priority:** [P0/P1/P2]
- **Anchor text:** "[anchor]" from pillar, "[anchor]" from [related article]
#### Article: [Subtopic A2]
...
### Cluster: [Subtopic Group B]
...
---
## Topic Map: [Topic Area 2]
...
---
## Internal Linking Matrix
| From ↓ / To → | Pillar | Article A1 | Article A2 | Article B1 | ... |
|----------------|--------|-----------|-----------|-----------|-----|
| **Pillar** | — | ✓ "[anchor]" | ✓ "[anchor]" | ✓ "[anchor]" | |
| **Article A1** | ✓ "[anchor]" | — | ✓ "[anchor]" | | |
| **Article A2** | ✓ "[anchor]" | ✓ "[anchor]" | — | | |
| **Article B1** | ✓ "[anchor]" | | | — | |
---
## Content Calendar
### Month 1: Foundation
| Week | Content Piece | Type | Cluster | Keywords | Priority |
|------|--------------|------|---------|----------|----------|
| W1 | [Pillar: Topic 1] | Pillar page | — | [kw] ([vol]) | P0 |
| W1 | [Article A1] | Cluster article | A | [kw] ([vol]) | P0 |
| W2 | [Article A2] | Cluster article | A | [kw] ([vol]) | P0 |
| W2 | [Article B1] | Cluster article | B | [kw] ([vol]) | P0 |
### Month 2: Depth
...
### Month 3: Expansion
...
---
## Coverage Gap Report
### High Priority (Competitors rank, you don't)
| Topic | Competitor Coverage | Your Status | Volume | Recommended Action |
|-------|-------------------|-------------|--------|--------------------|
| [topic] | A: Pillar, B: Blog post | None | [vol] | Create [content type] |
### Medium Priority (Weak coverage)
| Topic | Your Current Page | Issue | Volume | Recommended Action |
|-------|------------------|-------|--------|--------------------|
| [topic] | [URL] | Thin (400 words) | [vol] | Expand to [X] words, add [sections] |
### Existing Content Updates Needed
| URL | Issue | Action Required | Effort |
|-----|-------|----------------|--------|
| [url] | Outdated (2023 data) | Update stats, refresh examples | 2 hours |
| [url] | No internal links | Add [N] links to cluster articles | 30 min |
| [url] | Missing from pillar | Add link from pillar with "[anchor]" | 15 min |
---
## Metrics to Track
- **Topical coverage %** — Articles created vs. total identified
- **Internal link density** — Avg links per article within cluster
- **Cluster ranking velocity** — Time from publish to page 1 per cluster
- **Pillar page rankings** — Position for head terms
- **Organic traffic by cluster** — Traffic attributed to each topic clusterSave to the current working directory or wherever the user prefers.
For large topic maps (3+ topic areas), also export a summary CSV:
content-calendar-[YYYY-MM-DD].csv
| Component | Cost |
|---|---|
| Site catalog (your site, once) | ~$0.05-0.10 |
| Site catalog per competitor | ~$0.05-0.10 |
| SEO domain analyzer | ~$0.10-0.20 |
| Reddit scraper (per topic area) | ~$0.05-0.10 |
| DataForSEO keyword data (enhanced) | ~$0.50-3.00 (depending on keyword count) |
| Keywords Everywhere (enhanced alt) | ~$0.01-0.10 |
| Page fetches (competitor content analysis) | ~$0.01-0.05 |
| Analysis | Free (LLM reasoning) |
| Total per topic area (baseline) | ~$0.25-0.50 |
| Total per topic area (enhanced) | ~$0.75-3.50 |
| 3 topic areas (baseline) | ~$0.75-1.50 |
| 3 topic areas (enhanced) | ~$2.25-10.50 |
APIFY_API_TOKEN env varsite-content-catalog, seo-domain-analyzer, reddit-post-finder, fetch_webpageDATAFORSEO_LOGIN + DATAFORSEO_PASSWORD), Keywords Everywhere (KEYWORDS_EVERYWHERE_API_KEY), SEMrush (SEMRUSH_API_KEY), or Ahrefs (AHREFS_API_TOKEN)For ongoing topical authority tracking:
Render a 'model comparison grid' video from a config — a fal-style "same prompt, N contenders" showcase — a dark real-DOM stage where per beat a monospace prompt fades in centered, docks to a small top strip, then a labeled 2-4 panel grid (static images OR muted video clips, mixable per cell) staggers in and holds for comparison, plus a minimal end card — frame-stepped via Playwright (video cells are frame-seeked deterministically) and encoded with FFmpeg. Deterministic assembly, FREE (cell media comes from create-image-fal / create-video-fal, music from create-music-elevenlabs), text stays pixel-crisp. Use for the model-comparison-grid format.
Render a punchy ~12s vertical (9:16) music-only direct-response OFFER ad as a 4-beat kinetic-typography film — HEADLINE slam → real PRODUCT drop → CLAIM/proof → CTA pill — from one config of copy slots, a real product photo, a brand palette, fonts, bpm, and beat split. DETERMINISTIC + FREE (a bundled Remotion project; springs + interpolate, no AI-gen for visuals). Backgrounds are engine gradient divs off the palette, props are inline SVG, the ONLY composited bitmap is the REAL product photo (objectFit:contain, never stretched), and ALL headline/claim/CTA/URL/wordmark text is typeset in the engine — never AI-rendered (the format's credibility guard). A driver binds the config to Remotion input props, renders the 9:16 master, and derives a 1:1 center-crop with ffmpeg. Two gating checks run before render (claim verbs must match the product's physical format; the claim beat needs an edge-entry mechanism prop). Use for the motion-graphics-offer-ad format.
Assemble a myth-vs-fact kinetic-typography explainer video ad (≈29.5s, 9:16) from N myth/fact pairs + hook / turn / punch copy + palette + a brand end-card PNG + a VO track — a hook, 3 red-strike MYTH cards that flip to teal-check FACT cards (per-line strikethrough that crosses EVERY wrapped line), a "what actually works" turn, an optional proof reveal, a punch line, and a static end card. DETERMINISTIC assembly with ZERO AI-gen visuals — HTML hyperframes rendered frame-exact via Playwright (`window.renderAt(t)`, animation a pure function of beat-local time), Whisper beat-snap to VO word onsets, concat at a uniform fps, karaoke `.ass` captions burned last (suppressed on the proof + end-card beats), and a VO + optional music mix (music −20 dB, `amix normalize=0`, tail fade). FREE (Python + Playwright + ffmpeg); the recipe supplies the copy / palette / end-card / VO and gates the paid VO / music / Whisper calls to their own capabilities. Use for the myth-vs-fact format.