Designs and builds SEO pages at scale from one template plus a dataset, using twelve proven page playbooks.
Produces a pSEO strategy document, a page template, and the populated dataset that together generate a set of ranking pages from one repeating keyword pattern. It picks from 12 playbooks (locations, comparisons, integrations, personas, glossary, directory, templates, curation, conversions, examples, translations, profiles), designs the URL structure and schema markup, plans the hub-and-spoke internal linking, and sets the indexation strategy. It also emits a pseo-plan-v1 schema block recording the playbook, keyword pattern, planned page count, data sources and build stack. Whether the pages actually go live depends on your stack, which it confirms before designing anything.
This skill has no button. You start it by saying what you want. Any of these will do it:
| If you actually want | Use this instead |
|---|---|
| designing and building a single landing page | frontend-design |
| fewer than roughly 30 pages, which is a landing-page project not a pSEO one | frontend-design |
| keyword volume and difficulty research on its own | keyword-research |
| writing one editorial article | blog-writer |
| coding the template's actual HTML and CSS | frontend-design |
| fitting the page set into the site's pillar and content structure | content-system-architect |
| What you need | Why | |
|---|---|---|
| A way to build pages from data: a site codebase you can edit (Astro, Next.js, Hugo, Eleventy, or a plain HTML build script), or a CMS with bulk-page capability (a WordPress custom post type, Webflow CMS collections, or an API or CSV import) | with neither, you get a strategy document, a template and a data file for someone else to implement, not live pages | Required |
| The dataset itself: one row per page, carrying every field the template renders. For a locations playbook that means per-city local providers, local pricing and local regulations. For comparisons it means real feature-by-feature data on each product. For a directory it means the actual entries and their attributes | a dataset that only holds the variable (the city name, the competitor name) produces the same page repeated, which is the thin-content failure this skill exists to avoid | Required |
| An answer on where the data came from and how it stays current: first-party, product-derived, user-generated, licensed, or public | the skill ranks defensibility by source and a stale dataset produces a decaying page set | Required |
A repeatable keyword pattern with its variables named, e.g. [service] in [city], plus how many unique combinations exist | without the pattern there is nothing to template and no way to size the opportunity | Required |
context.md in brand memory stating the website and tech stack | the skill confirms the stack against its platform requirements before it designs anything | Required |
brand/[workspace]/verified-claims.md with any number, result or testimonial that will appear in page copy, marked consent: ok-as-stated | unbacked specifics get genericised or marked as a proof gap, and a template claim repeats on every page | Required |
ica-output.md for search intent and audience language, and owner-profile.md for positioning | without them the intro and CTA on each page read as generic filler | Optional |
keyword-plan.md from a prior keyword-research run | patterns anchor to already-validated targets instead of estimated demand | Optional |
_default) or a client (client--*), loads the brand files subject to freshness rules, and reads past learnings.md entries tagged programmatic-seo.[ESTIMATED].assets.md.brand/[workspace]/content/pseo/ in flat mode or brand/[workspace]/products/[slug]/content/pseo/ in product mode[YYYY-MM-DD]-pseo-[playbook]-[topic-slug].mdpseo-plan-v1 schema block recording playbooks, keyword_pattern, page_count_planned, data_sources, url_structure, stack, template_path and statusassets.md dated and tagged programmatic-seokeyword-research for real numbers, otherwise every figure is flagged [ESTIMATED].| The mistake | Do this instead |
|---|---|
| Bringing a spreadsheet that is just a list of cities or competitor names and expecting pages from it | Bring one row per page with several genuine fields per row: local pricing, local regulations, real feature values, actual entries. If you cannot fill the row, that page should not exist. |
| Chasing a page-count target | Treat any number as a rule of thumb, not a goal. A small set of pages that each earn their place beats a large set of thin ones, and the thin ones drag the good ones down. |
| Publishing every combination the pattern allows | Prioritise high-volume patterns for generation and internal-link weight, and noindex the very thin variations instead of publishing them. |
| Putting the page set on a subdomain | Use subfolders. Subfolders consolidate domain authority, subdomains split it. site.com/templates/resume/, not templates.site.com/resume/. |
| Running this for a 15-page build | Below roughly 30 pages, treat it as a landing-page project and chain frontend-design instead. |
| Assuming the strategy document means pages exist | Confirm who is running the generation and where. Strategy, template and data are files, not a live page set. |
Build the uniqueness levers into the template as conditional sections that render only when a row actually holds that data. Rows with richer data then produce visibly richer pages, instead of every page arriving at the same shape with different words in the slots. Pair that with one piece of per-page analysis or insight, and the page set stops looking templated to both readers and crawlers.