{"id":"057e3b29-420e-499a-88b9-4ee2ed67953b","shortId":"sbvvgD","kind":"skill","title":"seo-machine","tagline":"Build an organic-traffic operating system for any site or app: a multi-phase, resumable engine that ships programmatic landing pages (alternatives, comparisons, use-cases, playbooks) on top of real keyword research. Use when the user says 'SEO machine', 'build organic traffic', '","description":"# SEO Machine\n\nEnd-to-end engine for building organic search traffic. Ships dozens of programmatic landing pages — alternatives, comparisons, use-cases, playbooks — backed by real keyword research, with a persistent roadmap the user resumes across sessions.\n\nConversion-first (alternatives + comparisons before blogs). Publish-early (a thin page indexed today beats a perfect page indexed in three weeks). Stack-native (writes into the user's framework — Next.js, Astro, Rails+Inertia, or a portable markdown fallback).\n\n## Two modes, auto-detected\n\n| Mode | When | What it produces |\n|---|---|---|\n| **Initialize** | `docs/seo-machine.md` does not exist | Stack detection → brand context → keyword research → tech audit → roadmap + link inventory |\n| **Resume** | `docs/seo-machine.md` exists | Reads the tracker, picks the next pending phase (or one the user names), executes end-to-end through the quality gates |\n\nDetection rule on every invocation: check `docs/seo-machine.md` at repo root (or the path recorded in `.seo/config.json`). No file → Initialize. File exists → Resume. The user does not need to remember which mode they're in.\n\n## Publishing Order (the load-bearing decision rule)\n\nThe roadmap orders patterns by **conversion intent first, traffic intent second**. This is the single most important decision the skill makes — it's why the alternatives + comparison pages ship before the playbooks + blog posts.\n\n| Order | Pattern | Why | Cost |\n|---|---|---|---|\n| 1 | `/alternatives/[competitor]` (Pattern A) | Highest conversion intent — the reader is already in market | ~4 hours per page |\n| 2 | `/compare/[a]-vs-[b]` (Pattern D) | Be the third option in any two-vendor comparison | ~3 hours per page |\n| 3 | `/for/[use-case]` and `/for/[audience]` (Pattern B/C) | JTBD without competitor name in query — high TP/volume ratio | ~4-5 hours per page |\n| 4 | `/playbooks/[topic]` (Pattern E) | Authority + AI-citation surface area + inbound link draw | ~2-3 days per page |\n| 5 | `/blog/...` (out of scope here) | Lowest conversion intent; defer until ~10 indexed pages exist | — |\n\n**Why this order matters:** alternatives pages convert 5–20× blog posts at 1/10 the search volume. Shipping one alternatives page is worth ten generic blog posts on the same topic. The roadmap should reflect this — Phase 0 (tech audit) → Phases 1–N (alternatives, then comparisons, then use-cases) → late phases (playbooks) → never (blogs, unless explicitly requested by the user).\n\nStriking-distance boosts (pages already ranking pos 5–20 in GSC) jump the queue when they exist — fastest wins per hour of work.\n\n---\n\n## On Activation\n\n1. Load brand context where present: `brand/keyword-plan.md`, `positioning.md`, `competitors.md`, `audience.md`, `stack.md`. Missing files are fine.\n2. Surface what loaded:\n   ```\n   Brand context loaded:\n   ├── Keyword Plan    ✓/✗  (seeds the roadmap; ✗ → generate during Initialize)\n   ├── Positioning     ✓/✗  (drives /compare and /alternatives angles)\n   ├── Competitors     ✓/✗  (target list for /alternatives pages)\n   ├── Audience        ✓/✗  (intent buckets for /for/<persona> pages)\n   └── Stack           ✓/✗  (selects references/stacks/<framework>.md)\n   ```\n3. Progressive enhancement: with zero brand files the skill still works — it derives signal from the repo (`CLAUDE.md`, `README.md`, `package.json`, design tokens, existing marketing pages) during Initialize Step 2. With full brand context it skips re-discovery and goes straight to research + roadmap.\n\n---\n\n## Hard prerequisites\n\n| # | Check | Failure mode |\n|---|---|---|\n| 1 | `git rev-parse --is-inside-work-tree` succeeds | Stop. Tell the user this skill writes a persistent roadmap; initialize git or run from a repo. |\n| 2 | A stack is detectable — one of `package.json`, `Gemfile`, `composer.json`, `requirements.txt`, `astro.config.*`, `next.config.*`, `nuxt.config.*`, `gatsby-config.*`, `_config.yml`, `config.toml`, `pyproject.toml` | Ask the user what stack they're on before continuing. |\n| 3 | Research backend resolved (see below) | Never refuse to run — fall through to manual mode. |\n\n**Research backend resolution order** (record the choice in `.seo/config.json` under `research_backend`):\n\n1. **Exa-stack** (mktg-native, default). Probe `mcp__exa__web_search_advanced_exa` with a minimal query. On success, use the full Exa research stack — Exa MCP + Firecrawl (SERP scrape) + `gh` (OSS competitor signal) + `/last30days` skill (Reddit/X/HN aggregation) + `mktg-x` (auth-walled Twitter) + the mktg-native `company-research` / `people-research` skills. The 7 Exa-native recipes in `references/exa-recipes.md` replace the Ahrefs cookbook entirely; the cross-API compound recipes in `references/api-stack-recipes.md` add capabilities Ahrefs alone can't do (pain-point clustering, OSS competitor teardown, outreach prospect discovery, newcomer surveillance).\n2. **Manual mode** — Exa-stack unavailable. Follow `references/manual-research.md` (free Google + Search Console + paste-from-UI fallback).\n\n> **Ahrefs as a footnote:** if `mcp__ahrefs__subscription-info-limits-and-usage` returns data AND the user wants numeric volume/KD/TP precision, layer Ahrefs on top of the Exa-stack rather than replacing it. The \"Ahrefs appendix\" at the bottom of `references/exa-recipes.md` documents which Ahrefs queries upgrade each Exa-native recipe with precise numbers. Ahrefs MCP is intentionally NOT in mktg's chained-in ecosystem table — it's a paid escalation, not a default dependency.\n\n---\n\n## Initialize mode\n\nGoal: end the run with a written `docs/seo-machine.md` containing keyword research, a phase tracker grouped by pattern, and technical-audit findings — plus `.seo/brand.md` and `.seo/link-inventory.md`.\n\n### Step 1 — Detect stack + frontend convention\n\nRead `references/stacks/detection.md`. Identify framework family, routing convention (file-based vs controller-based), component language, and existing marketing pages (`git ls-files | grep -iE 'marketing|landing|pages/(home|about|pricing)'`). Resolve ambiguity with `AskUserQuestion`. Persist to `.seo/config.json`.\n\n### Step 2 — Detect brand + product context\n\nRead every signal first, propose `.seo/brand.md`, then ask only about gaps. Signals: `CLAUDE.md`, `README.md`, `package.json` / `Gemfile.lock`, `tailwind.config.*` or design-token CSS, `app/views/marketing/*` or `pages/index.*`, `pricing` page.\n\nIf `brand/voice-profile.md` and `brand/positioning.md` already exist (mktg-native project), read them and skip 80% of the questions — those files already say who the buyer is and what the brand sounds like.\n\nOtherwise use a single `AskUserQuestion` (3–4 questions max) to fill gaps. Required to know:\n\n- **Product one-liner** (≤20 words)\n- **Primary persona** (e.g. \"B2B SaaS founder\", \"indie agency owner\")\n- **3–7 direct competitors** by name\n- **Brand voice tags** (e.g. \"honest, technical, no-jargon\")\n- **Free tier?** (drives the \"is [brand] free\" keyword strategy)\n- **Anti-positioning** — what the product does NOT do (used in honest comparison sections)\n\nWrite to `.seo/brand.md` using `assets/brand-template.md` as the skeleton.\n\n### Step 3 — Keyword research (Exa-native stack)\n\nFollow `references/exa-recipes.md` — 7 Exa-native recipes that replace the Ahrefs cookbook:\n\n| Recipe | Purpose | Primary API |\n|---|---|---|\n| A. Domain baseline | DR estimate from indexed-page count + brand mentions + GitHub stars (OSS) | Exa `company_research_exa` + `web_search_advanced_exa` + `gh` |\n| B. Competitor reverse-lookup | What competitors rank for | Exa `web_search_advanced_exa` `site:<competitor>` + AI summary |\n| C. Use-case sweep | `/for/` and `/playbooks/` topic discovery | Exa `deep_search_exa` + Firecrawl autocomplete + `/last30days` |\n| D. Comparison volume | Validate demand for `/compare/[a]-vs-[b]` before writing | Exa `web_search_advanced_exa` + Firecrawl SERP scrape |\n| E. SERP saturation | Replaces Ahrefs KD with SERP-composition-derived signal | Exa search + per-result `company_research_exa` |\n| F. Backlink prospecting | Referring-domain proxy via Exa | Exa search + DR proxy (see `off-page-seo` skill) |\n| G. Content gap | Their indexed keywords − ours, ranked by DR-cap fit | Recipes B + own-site Exa lookup |\n\nThen pull cross-API compound recipes from `references/api-stack-recipes.md` for moves Ahrefs alone can't do — pain-point cluster discovery (`/last30days` + `mktg-x` + Exa deep search), OSS competitor teardown (`gh` + DeepWiki + Exa), outreach prospect discovery (Exa Websets + people-research), newcomer surveillance (Exa Websets cron).\n\nWhen Exa is unavailable, fall back to `references/manual-research.md` (paste-from-UI workflow). When the user has paid Ahrefs, layer it on top per the appendix in `exa-recipes.md` — don't replace.\n\nCache the raw output to `.seo/keyword-research.json`. Curate the decision-ready summary into the **Keyword Research Appendix** section of `docs/seo-machine.md`.\n\n### Step 4 — Technical foundations audit\n\nRun `scripts/tech_audit.py` (sitemap, robots, meta-tag uniqueness, schema). Whatever it finds becomes **Phase 0** in the roadmap. Day-0 crawl shapes Google's understanding of the site for months — retroactive fixes are harder.\n\n### Step 5 — Generate the roadmap\n\nFill `assets/roadmap-template.md` with:\n\n- **Site facts** (domain, DR, stack, brand colors, fonts) from steps 1–2\n- **Reference data** — paths to controllers / page files this skill will edit\n- **Keyword Research Appendix** — curated, grouped by pattern\n- **Phase Status Tracker** — auto-populated:\n  - Phase 0: technical foundations fixes\n  - Phase 1+: one row per page candidate\n  - Group by pattern. Within a pattern, order by `traffic_potential` desc → `volume` desc → `KD` asc\n  - Striking-distance boosts near the front (fastest wins on existing sites)\n  - Off-page checklist (directories + outreach) tail-end, one phase per category\n\nWrite to the configured path (default `docs/seo-machine.md`). Print the path back and recommend a human review pass before Phase 0.\n\n### Step 6 — Generate `.seo/link-inventory.md`\n\nEvery phase reads this file to pick internal links. Use `assets/link-inventory-template.md`. Pre-populate from existing routes (features, tools, pricing, blog posts). Each phase appends to it as new pages ship.\n\n### Step 7 — Hand off\n\n```\n✓ Initialize complete\n\n  Roadmap:        docs/seo-machine.md\n  Brand context:  .seo/brand.md\n  Keyword cache:  .seo/keyword-research.json\n  Link inventory: .seo/link-inventory.md\n  Config:         .seo/config.json\n\nNext: review docs/seo-machine.md, then run me again to execute Phase 0.\n```\n\nDo not auto-execute Phase 0. Pattern priorities and competitor lists are decisions worth a human pass.\n\n---\n\n## Resume mode\n\nGoal: pick the next phase from the tracker, execute end-to-end with quality gates, hand back so the user can commit/PR.\n\n### Step 1 — Read state\n\nLoad `docs/seo-machine.md`, `.seo/brand.md`, `.seo/link-inventory.md`, `.seo/config.json`. Find the **Phase Status Tracker**, identify the next `pending` phase with the lowest number, print it back along with the two phases that follow.\n\n### Step 2 — Confirm scope\n\nSingle `AskUserQuestion`:\n- \"Continue with Phase N: [title]?\"\n- Options: \"Yes, start Phase N\" / \"Pick a different phase\" / \"Re-audit (refresh research)\" / \"Just show the tracker\"\n\n\"Different\" → list pending phases. \"Re-audit\" → loop back into Initialize steps 3–5. \"Show\" → print tracker and stop.\n\n### Step 3 — Execute\n\nPattern → reference mapping:\n\n| Phase type | Reference |\n|---|---|\n| Phase 0 — technical foundations | `references/technical-audit.md` |\n| Pattern A — `/alternatives/[competitor]` | `references/patterns/alternatives.md` |\n| Pattern B/C — `/for/[use-case]` or `/for/[audience]` | `references/patterns/use-case.md` |\n| Pattern D — `/compare/[a]-vs-[b]` | `references/patterns/compare.md` |\n| Pattern E — `/playbooks/[topic]` long-form | `references/patterns/playbooks.md` |\n| Striking-distance boost | `references/striking-distance.md` |\n| Off-page checklist phase | `references/off-page.md` |\n| Internal-link spine audit | `references/quality-bars.md` (link-audit section) |\n\nFor page-generating phases, the flow is always:\n\n1. **Re-research** — current competitor pricing, feature changes. Don't trust 60-day-old cached data on commercial-intent terms.\n2. **Generate the page payload** — output format follows the stack (`references/stacks/<framework>.md`) or `references/stacks/markdown-fallback.md`.\n3. **Verify** against the quality bar (word count, internal links, schema, honesty section on alts). Run `scripts/word_count.py` and `scripts/link_audit.py`. If a check fails, fix it — don't ship under-spec work.\n4. **Update `.seo/link-inventory.md`** with the new page.\n5. **Update the tracker row** in `docs/seo-machine.md` — status `completed`, PR ref or commit SHA. Same edit batch as the page work so reviewers see both in one diff.\n\n### Step 4 — Hand off (do NOT auto-commit)\n\n```\n✓ Phase N complete: [title]\n\nFiles changed:\n  app/controllers/marketing_controller.rb  (added entry)\n  app/frontend/pages/Alternatives/Show.tsx (no change — uses existing layout)\n  docs/seo-machine.md                      (tracker updated)\n  .seo/link-inventory.md                   (new page registered)\n\nQuality gates:\n  ✓ Word count: 712 / 600 min\n  ✓ Internal links: 2 alts, 1 feature, 1 tool\n  ✓ FAQ JSON-LD attached\n  ✓ Honesty section present (3 rows)\n\nSuggested commit: \"SEO Phase N: ship /alternatives/[slug]\"\n\nNext phase pending: Phase N+1 — [title]\n```\n\nOpen a PR only if the user has expressed they want that cadence. Otherwise let them drive git.\n\n---\n\n## Interactive principles\n\n| Rule | Why |\n|---|---|\n| Ask before you guess on positioning calls | The user's gut on which competitor or use-case to ship next often beats the data |\n| Show the numbers, not the conclusion | \"vol 400, KD 12, TP 1,800\" builds more trust than \"the data is good\" |\n| Be honest about what won't work | KD 80 at DR 8 = doomed. Say so, offer the closest winnable alternative |\n| One-sentence theory max per phase | The user doesn't need a recap of SEO theory every run |\n| Surface tradeoffs, not opinions | \"5 thin alternatives or 2 deep ones first?\" — state the tradeoff, ask |\n\n---\n\n## Adjacent skills (route here vs there)\n\n| Skill | When | When NOT |\n|---|---|---|\n| `seo-audit` | One-off diagnostic on an existing site | Forward execution — use this skill |\n| `seo-content` | Writing a single rankable article | A whole sprint — use this skill |\n| `competitor-alternatives` | One `/alternatives/<x>` page, ad-hoc | Pattern A as part of a sprint — use this skill |\n| `keyword-research` | Producing `brand/keyword-plan.md` | This skill consumes that artifact — chain them |\n| `ai-seo` | LLM-citation optimization for a few pages | Run after this skill ships ~10 indexed pages |\n\n---\n\n## Anti-patterns\n\n| Don't | Why |\n|---|---|\n| Target head terms when DR is low | \"Social media management tool\" at DR 8 is wasted work. KD ≤ DR+10 while DR is low. |\n| Ship pages with no inbound internal links | A new page nobody links to is an island. ≥2 inbound links from existing pages, same phase. |\n| Ship `/alternatives` pages without an \"honesty\" section | Three honest tradeoffs (where the competitor wins) is non-negotiable. Brand signal AND Google quality signal. |\n| Skip schema markup | FAQPage JSON-LD captures snippets. Article for playbooks. SoftwareApplication for homepage + use-case. Quality gate fails without them. |\n| Auto-commit | Always show diff summary; let the user commit (local conventions, hooks, branch naming). |\n| Restart Initialize when partial state exists | If `.seo/config.json` exists without the roadmap, prompt before wiping — they may have aborted mid-run. |\n\n---\n\n## File map\n\n| File | Purpose |\n|---|---|\n| `references/methodology.md` | Why-this-works theory + lessons from real phases |\n| `references/exa-recipes.md` | 7 Exa-native research recipes (replaces the old Ahrefs cookbook). Ahrefs appendix at the bottom for paid-precision escalation. |\n| `references/api-stack-recipes.md` | Cross-API compound recipes — pain-point mining, OSS competitor teardown, outreach prospect discovery, newcomer surveillance. Uses Exa + Firecrawl + gh + mktg-x + DeepWiki + last30days. |\n| `references/manual-research.md` | L0 fallback when no MCP available |\n| `references/patterns/alternatives.md` | Pattern A spec, data shape, quality bar, example |\n| `references/patterns/use-case.md` | Pattern B+C spec |\n| `references/patterns/compare.md` | Pattern D spec |\n| `references/patterns/playbooks.md` | Pattern E spec (2,500-word bar) |\n| `references/stacks/detection.md` | Stack-detection signal table |\n| `references/stacks/rails-inertia.md` | Rails + Inertia adapter (reference implementation) |\n| `references/stacks/nextjs.md` | Next.js App Router adapter |\n| `references/stacks/astro.md` | Astro content-collection adapter |\n| `references/stacks/markdown-fallback.md` | Universal markdown output format |\n| `references/technical-audit.md` | Phase 0 recipes (sitemap, robots, meta, schema) |\n| `references/striking-distance.md` | GSC pos 5–20 audit + boost recipe |\n| `references/off-page.md` | Backlink checklist + Ahrefs referring-domains research |\n| `references/quality-bars.md` | Verification spec per pattern |\n| `scripts/word_count.py` | Strip markup → word count |\n| `scripts/link_audit.py` | Verify internal-link minimums per page |\n| `scripts/tech_audit.py` | Sitemap.xml + robots.txt + meta-tag scanner |\n| `assets/roadmap-template.md` | `docs/seo-machine.md` skeleton |\n| `assets/brand-template.md` | `.seo/brand.md` skeleton |\n| `assets/link-inventory-template.md` | `.seo/link-inventory.md` skeleton |\n\n---\n\n## Outputs\n\nThe skill writes to **project paths**, not `brand/`. This is why `writes:` in `skills-manifest.json` is `[]` — the manifest declares only `brand/*.md` writes, and seo-machine's outputs live in the user's repo, not in brand memory.\n\n| Output | Mode | Purpose |\n|---|---|---|\n| `docs/seo-machine.md` | Initialize (write), Resume (update phase row) | Persistent sprint roadmap — Phase Status Tracker + Reference Data + Keyword Research Appendix. Single source of truth across sessions. |\n| `.seo/brand.md` | Initialize | Product context derived from repo + user answers (one-liner, persona, competitors, voice tags, anti-positioning). |\n| `.seo/link-inventory.md` | Initialize (create), Resume (append per phase) | Every internal-link target the skill can use. Each phase appends new pages. |\n| `.seo/keyword-research.json` | Initialize | Cached raw output from Ahrefs / Exa / manual research. Read by every phase, refreshed every 30 days. |\n| `.seo/config.json` | Initialize | Stack info, research backend choice, project IDs. Persists machine-readable state. |\n| Phase-specific page files | Resume (per phase) | Stack-native page files (e.g. `app/controllers/marketing_controller.rb` + `app/frontend/pages/Alternatives/Show.tsx` for Rails+Inertia; `app/[pattern]/[slug]/page.tsx` for Next.js App Router; etc.). Paths follow `references/stacks/<framework>.md`. |\n\nThis follows the **Long-Arc Sprint Persistence Pattern** documented in `AGENTS.md` — `docs/seo-machine.md` is the canonical doc that survives session interruption.\n\n## /cmo integration\n\n`/cmo` routes here under **Playbook #9 — SEO Authority Build, Path B (programmatic sprint)**. On a cold project /cmo first spawns `mktg-brand-researcher`, `mktg-audience-researcher`, `mktg-competitive-scanner` in parallel (foundation), runs `keyword-research` to populate `brand/keyword-plan.md`, then hands off here. After every phase, /cmo spawns `mktg-content-reviewer` + `mktg-seo-analyst` in one message to score the page batch before the user commits.\n\nSee `skills/cmo/rules/playbooks.md` and `skills/cmo/rules/sub-agents.md` for the full handoff contract.","tags":["seo","machine","marketing","cli","moizibnyousaf","agent-skills","ai-agents","ai-marketing","brand-memory","brand-voice","claude-code","claude-code-skills"],"capabilities":["skill","source-moizibnyousaf","skill-seo-machine","topic-agent-skills","topic-ai-agents","topic-ai-marketing","topic-brand-memory","topic-brand-voice","topic-claude-code","topic-claude-code-skills","topic-cli","topic-cmo","topic-marketing-automation","topic-marketing-cli","topic-seo"],"categories":["marketing-cli"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/MoizIbnYousaf/marketing-cli/seo-machine","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add MoizIbnYousaf/marketing-cli","source_repo":"https://github.com/MoizIbnYousaf/marketing-cli","install_from":"skills.sh"}},"qualityScore":"0.459","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 18 github stars · SKILL.md body (19,789 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:05:52.399Z","embedding":null,"createdAt":"2026-05-14T01:04:00.075Z","updatedAt":"2026-05-18T19:05:52.399Z","lastSeenAt":"2026-05-18T19:05:52.399Z","tsv":"'+1':1886 '+10':2126 '-0':1319 '-3':337 '-5':318 '/alternatives':260,476,482,1655,1879,2055,2156 '/blog':342 '/cmo':2613,2615,2632,2664 '/compare':278,474,1124,1670 '/for':299,304,488,1106,1660,1665 '/last30days':664,1117,1218 '/page.tsx':2582 '/playbooks':323,1108,1677 '0':392,1314,1379,1449,1514,1521,1649,2366 '1':259,396,442,543,628,851,1352,1384,1559,1713,1859,1861,1946 '1/10':368 '10':352,2098 '12':1944 '2':277,336,457,522,571,726,896,1353,1592,1736,1857,2003,2147,2332 '20':364,425,979,2376 '3':294,298,494,601,965,990,1037,1632,1640,1750,1871 '30':2544 '4':273,317,322,966,1296,1782,1818 '400':1942 '5':341,363,424,1335,1633,1789,1999,2375 '500':2333 '6':1451 '60':1725 '600':1853 '7':687,991,1046,1486,2255 '712':1852 '8':1967,2120 '80':942,1964 '800':1947 '9':2620 'abort':2236 'across':85,2486 'activ':441 'ad':1833,2058 'ad-hoc':2057 'adapt':2345,2352,2358 'add':707 'adjac':2011 'advanc':641,1081,1096,1133 'agenc':988 'agents.md':2603 'aggreg':667 'ahref':696,709,744,750,767,780,789,800,1054,1142,1208,1262,2264,2266,2383,2534 'ai':329,1099,2083 'ai-cit':328 'ai-seo':2082 'alon':710,1209 'along':1584 'alreadi':270,421,932,948 'alt':1764,1858 'altern':27,67,90,246,360,374,398,1975,2001,2053 'alway':1712,2205 'ambigu':889 'analyst':2673 'angl':477 'answer':2496 'anti':1015,2102,2505 'anti-pattern':2101 'anti-posit':1014,2504 'api':702,1059,1201,2279 'app':15,2350,2579,2585 'app/controllers/marketing_controller.rb':1832,2574 'app/frontend/pages/alternatives/show.tsx':1835,2575 'app/views/marketing':923 'append':1478,2511,2525 'appendix':781,1269,1291,1367,2267,2481 'arc':2597 'area':332 'articl':2044,2188 'artifact':2079 'asc':1404 'ask':591,908,1910,2010 'askuserquest':891,964,1596 'assets/brand-template.md':1032,2416 'assets/link-inventory-template.md':1464,2419 'assets/roadmap-template.md':1340,2413 'astro':120,2354 'astro.config':582 'attach':1867 'audienc':305,484,1666,2641 'audience.md':451 'audit':150,394,844,1299,1613,1626,1698,1702,2023,2377 'auth':672 'auth-wal':671 'author':327,2622 'auto':131,1376,1518,1824,2203 'auto-commit':1823,2202 'auto-detect':130 'auto-execut':1517 'auto-popul':1375 'autocomplet':1116 'avail':2309 'b':281,1084,1127,1191,1673,2321,2625 'b/c':307,1659 'b2b':984 'back':73,1249,1440,1552,1583,1628 'backend':603,617,627,2551 'backlink':1159,2381 'bar':1755,2317,2335 'base':865,869 'baselin':1062 'batch':1805,2681 'bear':218 'beat':102,1932 'becom':1312 'blog':93,253,365,380,409,1474 'boost':419,1408,1686,2378 'bottom':784,2270 'branch':2216 'brand':145,444,461,499,525,898,957,996,1010,1070,1347,1493,2173,2430,2442,2459,2637 'brand/keyword-plan.md':448,2074,2656 'brand/positioning.md':931 'brand/voice-profile.md':929 'bucket':486 'build':4,46,57,1948,2623 'buyer':952 'c':1101,2322 'cach':1275,1497,1729,2530 'cadenc':1900 'call':1916 'candid':1389 'canon':2607 'cap':1188 'capabl':708 'captur':2186 'case':31,71,302,404,1104,1663,1927,2196 'categori':1429 'chain':809,2080 'chained-in':808 'chang':1721,1831,1837 'check':184,540,1771 'checklist':1420,1691,2382 'choic':622,2552 'citat':330,2087 'claude.md':511,913 'closest':1973 'cluster':717,1216 'cold':2630 'collect':2357 'color':1348 'commerci':1733 'commercial-int':1732 'commit':1801,1825,1874,2204,2212,2685 'commit/pr':1557 'compani':680,1076,1155 'company-research':679 'comparison':28,68,91,247,293,400,1026,1119 'competit':2645 'competitor':261,310,478,662,719,993,1085,1090,1226,1525,1656,1718,1923,2052,2167,2287,2501 'competitor-altern':2051 'competitors.md':450 'complet':1490,1797,1828 'compon':870 'composer.json':580 'composit':1147 'compound':703,1202,2280 'conclus':1940 'config':587,1502 'config.toml':589 'config.yml':588 'configur':1433 'confirm':1593 'consol':738 'consum':2077 'contain':832 'content':1178,2039,2356,2668 'content-collect':2355 'context':146,445,462,526,900,1494,2491 'continu':600,1597 'contract':2694 'control':868,1358 'controller-bas':867 'convent':855,862,2214 'convers':88,226,265,348 'conversion-first':87 'convert':362 'cookbook':697,1055,2265 'cost':258 'count':1069,1757,1851,2397 'crawl':1320 'creat':2509 'cron':1243 'cross':701,1200,2278 'cross-api':700,1199,2277 'css':922 'curat':1281,1368 'current':1717 'd':283,1118,1669,2326 'data':758,1355,1730,1934,1953,2314,2478 'day':338,1318,1727,2545 'day-old':1726 'decis':219,238,1284,1528 'decision-readi':1283 'declar':2440 'deep':1112,1223,2004 'deepwiki':1229,2301 'default':635,820,1435 'defer':350 'demand':1122 'depend':821 'deriv':506,1148,2492 'desc':1400,1402 'design':514,920 'design-token':919 'detect':132,144,179,575,852,897,2339 'diagnost':2027 'diff':1816,2207 'differ':1609,1620 'direct':992 'directori':1421 'discoveri':531,723,1110,1217,1233,2291 'distanc':418,1407,1685 'doc':2608 'docs/seo-machine.md':139,155,185,831,1294,1436,1492,1506,1563,1795,1841,2414,2464,2604 'document':787,2601 'doesn':1985 'domain':1061,1163,1344,2386 'doom':1968 'dozen':62 'dr':1063,1169,1187,1345,1966,2111,2119,2125,2128 'dr-cap':1186 'draw':335 'drive':473,1007,1904 'e':326,1138,1676,2330 'e.g':983,999,2573 'earli':96 'ecosystem':811 'edit':1364,1804 'end':52,54,172,174,825,1425,1545,1547 'end-to-end':51,171,1544 'engin':21,55 'enhanc':496 'entir':698 'entri':1834 'escal':817,2275 'estim':1064 'etc':2587 'everi':182,902,1454,1993,2514,2540,2543,2662 'exa':630,638,642,652,655,689,730,773,794,1041,1048,1075,1078,1082,1093,1097,1111,1114,1130,1134,1150,1157,1166,1167,1195,1222,1230,1234,1241,1245,2257,2295,2535 'exa-n':688,793,1040,1047,2256 'exa-recipes.md':1271 'exa-stack':629,729,772 'exampl':2318 'execut':170,1512,1519,1543,1641,2033 'exist':142,156,199,355,433,516,873,933,1415,1469,1839,2030,2151,2223,2226 'explicit':411 'express':1896 'f':1158 'fact':1343 'fail':1772,2199 'failur':541 'fall':611,1248 'fallback':127,743,2305 'famili':860 'faq':1863 'faqpag':2182 'fastest':434,1412 'featur':1471,1720,1860 'file':196,198,454,500,864,879,947,1360,1458,1830,2240,2242,2564,2572 'file-bas':863 'fill':970,1339 'find':845,1311,1567 'fine':456 'firecrawl':657,1115,1135,2296 'first':89,228,904,2006,2633 'fit':1189 'fix':1331,1382,1773 'flow':1710 'follow':733,1044,1590,1743,2589,2593 'font':1349 'footnot':747 'form':1681 'format':1742,2363 'forward':2032 'foundat':1298,1381,1651,2649 'founder':986 'framework':118,859 'free':735,1005,1011 'front':1411 'frontend':854 'full':524,651,2692 'g':1177 'gap':911,971,1179 'gate':178,1550,1849,2198 'gatsbi':586 'gatsby-config':585 'gemfil':579 'gemfile.lock':916 'generat':469,1336,1452,1707,1737 'generic':379 'gh':660,1083,1228,2297 'git':544,565,876,1905 'github':1072 'goal':824,1535 'goe':533 'good':1955 'googl':736,1322,2176 'grep':880 'group':838,1369,1390 'gsc':427,2373 'guess':1913 'gut':1920 'hand':1487,1551,1819,2658 'handoff':2693 'hard':538 'harder':1333 'head':2108 'high':314 'highest':264 'hoc':2059 'home':885 'homepag':2193 'honest':1000,1025,1957,2163 'honesti':1761,1868,2160 'hook':2215 'hour':274,295,319,437 'human':1444,1531 'id':2554 'identifi':858,1572 'ie':881 'implement':2347 'import':237 'inbound':333,2135,2148 'index':100,106,353,1067,1181,2099 'indexed-pag':1066 'indi':987 'inertia':122,2344,2578 'info':753,2549 'initi':138,197,471,520,564,822,1489,1630,2219,2465,2489,2508,2529,2547 'insid':550 'integr':2614 'intent':227,230,266,349,485,803,1734 'interact':1906 'intern':1461,1695,1758,1855,2136,2401,2516 'internal-link':1694,2400,2515 'interrupt':2612 'inventori':153,1500 'invoc':183 'is-inside-work-tre':548 'island':2146 'jargon':1004 'json':1865,2184 'json-ld':1864,2183 'jtbd':308 'jump':428 'kd':1143,1403,1943,1963,2124 'keyword':37,76,147,464,833,1012,1038,1182,1289,1365,1496,2071,2479,2652 'keyword-research':2070,2651 'know':974 'l0':2304 'land':25,65,883 'languag':871 'last30days':2302 'late':405 'layer':766,1263 'layout':1840 'ld':1866,2185 'lesson':2250 'let':1902,2209 'like':959 'limit':754 'liner':978,2499 'link':152,334,1462,1499,1696,1701,1759,1856,2137,2142,2149,2402,2517 'link-audit':1700 'list':480,1526,1621 'live':2451 'llm':2086 'llm-citat':2085 'load':217,443,460,463,1562 'load-bear':216 'local':2213 'long':1680,2596 'long-arc':2595 'long-form':1679 'lookup':1088,1196 'loop':1627 'low':2113,2130 'lowest':347,1579 'ls':878 'ls-file':877 'machin':3,45,50,2448,2557 'machine-read':2556 'make':241 'manag':2116 'manifest':2439 'manual':614,727,2536 'map':1644,2241 'markdown':126,2361 'market':272,517,874,882 'markup':2181,2395 'matter':359 'max':968,1980 'may':2234 'mcp':637,656,749,801,2308 'md':493,1747,2443,2591 'media':2115 'memori':2460 'mention':1071 'messag':2676 'meta':1305,2370,2410 'meta-tag':1304,2409 'mid':2238 'mid-run':2237 'min':1854 'mine':2285 'minim':645 'minimum':2403 'miss':453 'mktg':633,669,677,806,935,1220,2299,2636,2640,2644,2667,2671 'mktg-audience-research':2639 'mktg-brand-research':2635 'mktg-competitive-scann':2643 'mktg-content-review':2666 'mktg-nativ':632,676,934 'mktg-seo-analyst':2670 'mktg-x':668,1219,2298 'mode':129,133,209,542,615,728,823,1534,2462 'month':1329 'move':1207 'multi':18 'multi-phas':17 'n':397,1600,1606,1827,1877,1885 'name':169,311,995,2217 'nativ':112,634,678,690,795,936,1042,1049,2258,2570 'near':1409 'need':205,1987 'negoti':2172 'never':408,607 'new':1482,1787,1845,2139,2526 'newcom':724,1239,2292 'next':162,1504,1538,1574,1881,1930 'next.config':583 'next.js':119,2349,2584 'no-jargon':1002 'nobodi':2141 'non':2171 'non-negoti':2170 'number':799,1580,1937 'numer':763 'nuxt.config':584 'off-pag':1417,1688 'off-page-seo':1172 'offer':1971 'often':1931 'old':1728,2263 'one':166,373,576,977,1385,1426,1815,1977,2005,2025,2054,2498,2675 'one-lin':976,2497 'one-off':2024 'one-sent':1976 'open':1888 'oper':9 'opinion':1998 'optim':2088 'option':287,1602 'order':214,223,255,358,619,1396 'organ':7,47,58 'organic-traff':6 'oss':661,718,1074,1225,2286 'otherwis':960,1901 'output':1278,1741,2362,2422,2450,2461,2532 'outreach':721,1231,1422,2289 'own-sit':1192 'owner':989 'package.json':513,578,915 'page':26,66,99,105,248,276,297,321,340,354,361,375,420,483,489,518,875,884,927,1068,1174,1359,1388,1419,1483,1690,1706,1739,1788,1808,1846,2056,2092,2100,2132,2140,2152,2157,2405,2527,2563,2571,2680 'page-gener':1705 'pages/index':925 'paid':816,1261,2273 'paid-precis':2272 'pain':715,1214,2283 'pain-point':714,1213,2282 'parallel':2648 'pars':547 'part':2063 'partial':2221 'pass':1446,1532 'past':740,1253 'paste-from-ui':739,1252 'path':191,1356,1434,1439,2428,2588,2624 'pattern':224,256,262,282,306,325,840,1371,1392,1395,1522,1642,1653,1658,1668,1675,2060,2103,2311,2320,2325,2329,2392,2580,2600 'payload':1740 'pend':163,1575,1622,1883 'peopl':683,1237 'people-research':682,1236 'per':275,296,320,339,436,1153,1267,1387,1428,1981,2391,2404,2512,2566 'per-result':1152 'perfect':104 'persist':80,562,892,2471,2555,2599 'persona':982,2500 'phase':19,164,391,395,406,836,1313,1372,1378,1383,1427,1448,1455,1477,1513,1520,1539,1569,1576,1588,1599,1605,1610,1623,1645,1648,1692,1708,1826,1876,1882,1884,1982,2154,2253,2365,2469,2474,2513,2524,2541,2561,2567,2663 'phase-specif':2560 'pick':160,1460,1536,1607 'plan':465 'playbook':32,72,252,407,2190,2619 'plus':846 'point':716,1215,2284 'popul':1377,1467,2655 'portabl':125 'pos':423,2374 'posit':472,1016,1915,2506 'positioning.md':449 'post':254,366,381,1475 'potenti':1399 'pr':1798,1890 'pre':1466 'pre-popul':1465 'precis':765,798,2274 'prerequisit':539 'present':447,1870 'price':887,926,1473,1719 'primari':981,1058 'principl':1907 'print':1437,1581,1635 'prioriti':1523 'probe':636 'produc':137,2073 'product':899,975,1019,2490 'programmat':24,64,2626 'progress':495 'project':937,2427,2553,2631 'prompt':2230 'propos':905 'prospect':722,1160,1232,2290 'proxi':1164,1170 'publish':95,213 'publish-ear':94 'pull':1198 'purpos':1057,2243,2463 'pyproject.toml':590 'qualiti':177,1549,1754,1848,2177,2197,2316 'queri':313,646,790 'question':945,967 'queue':430 'rail':121,2343,2577 'rank':422,1091,1184 'rankabl':2043 'rather':775 'ratio':316 'raw':1277,2531 're':211,530,597,1612,1625,1715 're-audit':1611,1624 're-discoveri':529 're-research':1714 'read':157,856,901,938,1456,1560,2538 'readabl':2558 'reader':268 'readi':1285 'readme.md':512,914 'real':36,75,2252 'recap':1989 'recip':691,704,796,1050,1056,1190,1203,2260,2281,2367,2379 'recommend':1442 'record':192,620 'reddit/x/hn':666 'ref':1799 'refer':1162,1354,1643,1647,2346,2385,2477 'references/api-stack-recipes.md':706,1205,2276 'references/exa-recipes.md':693,786,1045,2254 'references/manual-research.md':734,1251,2303 'references/methodology.md':2244 'references/off-page.md':1693,2380 'references/patterns/alternatives.md':1657,2310 'references/patterns/compare.md':1674,2324 'references/patterns/playbooks.md':1682,2328 'references/patterns/use-case.md':1667,2319 'references/quality-bars.md':1699,2388 'references/stacks':492,1746,2590 'references/stacks/astro.md':2353 'references/stacks/detection.md':857,2336 'references/stacks/markdown-fallback.md':1749,2359 'references/stacks/nextjs.md':2348 'references/stacks/rails-inertia.md':2342 'references/striking-distance.md':1687,2372 'references/technical-audit.md':1652,2364 'referring-domain':1161,2384 'reflect':389 'refresh':1614,2542 'refus':608 'regist':1847 'rememb':207 'replac':694,777,1052,1141,1274,2261 'repo':187,510,570,2456,2494 'request':412 'requir':972 'requirements.txt':581 'research':38,77,148,536,602,616,626,653,681,684,834,1039,1077,1156,1238,1290,1366,1615,1716,2072,2259,2387,2480,2537,2550,2638,2642,2653 'resolut':618 'resolv':604,888 'restart':2218 'result':1154 'resum':20,84,154,200,1533,2467,2510,2565 'retroact':1330 'return':757 'rev':546 'rev-pars':545 'revers':1087 'reverse-lookup':1086 'review':1445,1505,1811,2669 'roadmap':81,151,222,387,468,537,563,1317,1338,1491,2229,2473 'robot':1303,2369 'robots.txt':2408 'root':188 'rout':861,1470,2013,2616 'router':2351,2586 'row':1386,1793,1872,2470 'rule':180,220,1908 'run':567,610,827,1300,1508,1765,1994,2093,2239,2650 'saa':985 'satur':1140 'say':43,949,1969 'scanner':2412,2646 'schema':1308,1760,2180,2371 'scope':345,1594 'score':2678 'scrape':659,1137 'scripts/link_audit.py':1768,2398 'scripts/tech_audit.py':1301,2406 'scripts/word_count.py':1766,2393 'search':59,370,640,737,1080,1095,1113,1132,1151,1168,1224 'second':231 'section':1027,1292,1703,1762,1869,2161 'see':605,1171,1812,2686 'seed':466 'select':491 'sentenc':1978 'seo':2,44,49,1175,1875,1991,2022,2038,2084,2447,2621,2672 'seo-audit':2021 'seo-cont':2037 'seo-machin':1,2446 'seo/brand.md':847,906,1030,1495,1564,2417,2488 'seo/config.json':194,624,894,1503,1566,2225,2546 'seo/keyword-research.json':1280,1498,2528 'seo/link-inventory.md':849,1453,1501,1565,1784,1844,2420,2507 'serp':658,1136,1139,1146 'serp-composition-deriv':1145 'session':86,2487,2611 'sha':1802 'shape':1321,2315 'ship':23,61,249,372,1484,1777,1878,1929,2097,2131,2155 'show':1617,1634,1935,2206 'signal':507,663,903,912,1149,2174,2178,2340 'singl':235,963,1595,2042,2482 'site':13,1098,1194,1327,1342,1416,2031 'sitemap':1302,2368 'sitemap.xml':2407 'skeleton':1035,2415,2418,2421 'skill':240,502,559,665,685,1176,1362,2012,2017,2036,2050,2069,2076,2096,2424,2520 'skill-seo-machine' 'skills-manifest.json':2436 'skills/cmo/rules/playbooks.md':2687 'skills/cmo/rules/sub-agents.md':2689 'skip':528,941,2179 'slug':1880,2581 'snippet':2187 'social':2114 'softwareappl':2191 'sound':958 'sourc':2483 'source-moizibnyousaf' 'spawn':2634,2665 'spec':1780,2313,2323,2327,2331,2390 'specif':2562 'spine':1697 'sprint':2047,2066,2472,2598,2627 'stack':111,143,490,573,595,631,654,731,774,853,1043,1346,1745,2338,2548,2569 'stack-detect':2337 'stack-nat':110,2568 'stack.md':452 'star':1073 'start':1604 'state':1561,2007,2222,2559 'status':1373,1570,1796,2475 'step':521,850,895,1036,1295,1334,1351,1450,1485,1558,1591,1631,1639,1817 'still':503 'stop':554,1638 'straight':534 'strategi':1013 'strike':417,1406,1684 'striking-dist':416,1405,1683 'strip':2394 'subscript':752 'subscription-info-limits-and-usag':751 'succeed':553 'success':648 'suggest':1873 'summari':1100,1286,2208 'surfac':331,458,1995 'surveil':725,1240,2293 'surviv':2610 'sweep':1105 'system':10 'tabl':812,2341 'tag':998,1306,2411,2503 'tail':1424 'tail-end':1423 'tailwind.config':917 'target':479,2107,2518 'teardown':720,1227,2288 'tech':149,393 'technic':843,1001,1297,1380,1650 'technical-audit':842 'tell':555 'ten':378 'term':1735,2109 'theori':1979,1992,2249 'thin':98,2000 'third':286 'three':108,2162 'tier':1006 'titl':1601,1829,1887 'today':101 'token':515,921 'tool':1472,1862,2117 'top':34,769,1266 'topic':324,385,1109,1678 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-marketing' 'topic-brand-memory' 'topic-brand-voice' 'topic-claude-code' 'topic-claude-code-skills' 'topic-cli' 'topic-cmo' 'topic-marketing-automation' 'topic-marketing-cli' 'topic-seo' 'tp':1945 'tp/volume':315 'tracker':159,837,1374,1542,1571,1619,1636,1792,1842,2476 'tradeoff':1996,2009,2164 'traffic':8,48,60,229,1398 'tree':552 'trust':1724,1950 'truth':2485 'twitter':674 'two':128,291,1587 'two-vendor':290 'type':1646 'ui':742,1255 'unavail':732,1247 'under-spec':1778 'understand':1324 'uniqu':1307 'univers':2360 'unless':410 'updat':1783,1790,1843,2468 'upgrad':791 'usag':756 'use':30,39,70,301,403,649,961,1023,1031,1103,1463,1662,1838,1926,2034,2048,2067,2195,2294,2522 'use-cas':29,69,300,402,1102,1661,1925,2194 'user':42,83,116,168,202,415,557,593,761,1259,1555,1894,1918,1984,2211,2454,2495,2684 'valid':1121 'vendor':292 'verif':2389 'verifi':1751,2399 'via':1165 'voic':997,2502 'vol':1941 'volum':371,1120,1401 'volume/kd/tp':764 'vs':280,866,1126,1672,2015 'wall':673 'want':762,1898 'wast':2122 'web':639,1079,1094,1131 'webset':1235,1242 'week':109 'whatev':1309 'whole':2046 'why-this-work':2245 'win':435,1413,2168 'winnabl':1974 'wipe':2232 'within':1393 'without':309,2158,2200,2227 'won':1960 'word':980,1756,1850,2334,2396 'work':439,504,551,1781,1809,1962,2123,2248 'workflow':1256 'worth':377,1529 'write':113,560,1028,1129,1430,2040,2425,2434,2444,2466 'written':830 'x':670,1221,2300 'yes':1603 'zero':498","prices":[{"id":"49ea96d4-718c-4e5c-b774-cab075b719ba","listingId":"057e3b29-420e-499a-88b9-4ee2ed67953b","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"MoizIbnYousaf","category":"marketing-cli","install_from":"skills.sh"},"createdAt":"2026-05-14T01:04:00.075Z"}],"sources":[{"listingId":"057e3b29-420e-499a-88b9-4ee2ed67953b","source":"github","sourceId":"MoizIbnYousaf/marketing-cli/seo-machine","sourceUrl":"https://github.com/MoizIbnYousaf/marketing-cli/tree/main/skills/seo-machine","isPrimary":false,"firstSeenAt":"2026-05-14T01:04:00.075Z","lastSeenAt":"2026-05-18T19:05:52.399Z"}],"details":{"listingId":"057e3b29-420e-499a-88b9-4ee2ed67953b","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"MoizIbnYousaf","slug":"seo-machine","github":{"repo":"MoizIbnYousaf/marketing-cli","stars":18,"topics":["agent-skills","ai-agents","ai-marketing","brand-memory","brand-voice","claude-code","claude-code-skills","cli","cmo","marketing-automation","marketing-cli","seo","skills-sh","typescript"],"license":"mit","html_url":"https://github.com/MoizIbnYousaf/marketing-cli","pushed_at":"2026-05-13T21:06:05Z","description":"Agent-native marketing cli: 51 skills, 5 research agents, brand memory that compounds, plus a local Studio dashboard (beta). single agent-native cli, then /cmo in ur coding agent..","skill_md_sha":"10f50b74733f1549bf2aa29f21fc2e409e6bb222","skill_md_path":"skills/seo-machine/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/MoizIbnYousaf/marketing-cli/tree/main/skills/seo-machine"},"layout":"multi","source":"github","category":"marketing-cli","frontmatter":{"name":"seo-machine","description":"Build an organic-traffic operating system for any site or app: a multi-phase, resumable engine that ships programmatic landing pages (alternatives, comparisons, use-cases, playbooks) on top of real keyword research. Use when the user says 'SEO machine', 'build organic traffic', 'rank on Google', 'we need traffic', 'alternatives pages', 'comparison pages', '/for/ pages', 'programmatic SEO', or 'build an SEO engine'. Distinct from `seo-audit` (one-off diagnostic) and `seo-content` (single-article writer): this skill owns research, planning, page generation, internal linking, off-page checklist, and the persistent phase tracker across the whole run. Resumable — every invocation continues the last run."},"skills_sh_url":"https://skills.sh/MoizIbnYousaf/marketing-cli/seo-machine"},"updatedAt":"2026-05-18T19:05:52.399Z"}}