用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill programmatic-seo-pages命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | programmatic-seo-pages |
| description | >- Use when this capability is needed. |
Generate many high-intent SEO pages from a single template + a dataset. Done right, this captures long-tail traffic the brand team would never write by hand. Done wrong, you ship thin doorway pages and tank the whole domain.
Companion skills: programmatic-seo-content-quality, seo-ssr-and-prerendering, seo-meta-tags-spa, seo-structured-data, seo-sitemap-generation.
| Pattern | Examples | Search intent |
|---|---|---|
| Location pages | /locations/[city], /dentist/[city] | "dentist in austin" |
| Comparisons | /compare/[a]-vs-[b] | "notion vs evernote" |
| Alternatives | /alternatives/[brand] | "alternatives to mailchimp" |
| Integrations | /integrations/[tool] | "stripe integration" |
| Templates / use-cases | /templates/[category]/[name] | "marketing plan template" |
| Glossary / wiki | /glossary/[term] | "what is bounce rate" |
Pick one or two patterns first. Don't ship five at once.
Each template needs a row per page with enough unique data to justify existence:
create table public.location_pages (
slug text primary key,
city text not null,
state text not null,
country text not null,
lat numeric, lng numeric,
service_areas text[],
testimonials jsonb,
avg_price_cents int,
faqs jsonb, -- [{ q, a }]
hero_image_url text,
published boolean default false,
noindex boolean default false,
created_at timestamptz default now(),
updated_at timestamptz default now()
);
create index location_pages_published_idx on public.location_pages (published) where published = true;
Rules:
published boolean so drafts never leak into sitemap.noindex flag per row — kill underperformers without deleting.// /locations/[slug]
export default function LocationPage() {
const { slug } = useParams();
const { data: page } = useLocationPage(slug);
if (!page) return <NotFound />;
return (
<>
<Seo
title={`${page.service} in ${page.city}, ${page.state}`}
description={`Find ${page.service} in ${page.city}. ${page.unique_hook}.`}
path={`/locations/${page.slug}`}
image={page.hero_image_url}
/>
<JsonLd data={buildLocalBusinessSchema(page)} />
<JsonLd data={buildFaqSchema(page.faqs)} />
<JsonLd data={buildBreadcrumbSchema(page)} />
<Hero city= = = />
);
}
Each section must take page-specific data. If your testimonials section says "Loved by customers" identically on every page, it's filler.
These pages must be in the raw HTML — Googlebot can render JS, but at scale you'll hit crawl-budget issues.
// vite-ssg includedRoutes
export async function includedRoutes() {
const slugs = await fetchAllPublishedSlugs();
return [
"/",
"/pricing",
...slugs.map((s) => `/locations/${s}`),
];
}
For thousands of pages: split into chunks and run prerender in parallel, or move to true SSR (seo-ssr-and-prerendering).
/alternatives/[brand] not /best/alternatives/to/[brand]/2026.mailchimp-alternatives not the-best-mailchimp-alternatives).Programmatic pages need internal links to be discovered and ranked:
/locations lists all cities; /integrations lists all tools.RelatedX component per template, deterministic per row (sorted by proximity, popularity, etc.).Generate dynamically — one PNG per row, cached.
og:image.@vercel/og) or Cloudflare Workers — generate on first request, cache.Cheap fallback: a single branded OG with the page title overlaid via CSS in a screenshot service.
programmatic-seo-content-quality).published + noindex flags so you can curate.sitemap.xml only when published = true.Source: charanjit-singh/lovable-skills — distributed by TomeVault.