agentsclimarketplace

Programmatic seo

Skill DariuszCiesielski/polish-agent-skills/skills/seo/programmatic-seo

SEO at scale — generowanie setek stron z szablonów per keyword pattern. "[usługa] + [miasto]", "[produkt] vs [produkt]", "[narzędzie] dla [branży]". Triggery: "programmatic SEO", "SEO at scale", "template pages", "generuj strony SEO", "strony lokalne", "miasto+usługa", "vs pages", "porównania", "masowe strony".From its SKILL.md

Install
npx -y skills add DariuszCiesielski/polish-agent-skills --skill programmatic-seo

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

6.2 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it

Programmatic SEO — Template Pages at Scale

Generowanie setek/tysięcy stron z szablonów pod long-tail keywords. Sprawdzona taktyka SaaS: Zapier (integrations pages), Wise (currency pages), Nomadlist (city pages).

Kiedy używać

  • Produkt ma powtarzalny wzorzec keywords (usługa×miasto, narzędzie×branża)
  • Chcesz pokryć setki long-tail keywords jednym template
  • Masz dane strukturalne (baza miast, lista integracji, katalog branż)
  • Użytkownik mówi: "programmatic SEO", "strony lokalne", "masowe strony"

Zależności

  • product-marketing-context → target-keywords.md (keyword patterns)
  • seo → walidacja generowanych stron
  • content-strategy → topic clusters jako źródło patterns
  • schema-markup → schema per generated page

Wzorce (patterns)

Pattern 1: [Usługa] + [Miasto]

Dla: lokalne usługi, agencje, SaaS z local focus

/uslugi/seo-pozycjonowanie-warszawa
/uslugi/seo-pozycjonowanie-krakow
/uslugi/seo-pozycjonowanie-wroclaw

Dane: lista miast × lista usług Template: H1 z miastem, lokalne social proof, mapa, CTA regionalne

Pattern 2: [Produkt] vs [Konkurent]

Dla: SaaS z rozpoznawalną konkurencją

/porownania/produkt-vs-mailchimp
/porownania/produkt-vs-sendinblue
/porownania/produkt-vs-convertkit

Dane: lista konkurentów × kryteria porównania Template: tabela porównawcza, feature-by-feature, verdict

Pattern 3: [Narzędzie] dla [Branży]

Dla: SaaS horizontal z vertical use cases

/rozwiazania/crm-dla-agencji-marketingowych
/rozwiazania/crm-dla-biur-nieruchomosci
/rozwiazania/crm-dla-firm-szkoleniowych

Dane: lista branż × feature highlights per branża Template: branżowe case study, specific features, branżowy jargon

Pattern 4: [Integracja] + [Produkt]

Dla: SaaS z wieloma integracjami

/integracje/slack
/integracje/google-sheets
/integracje/zapier

Dane: lista integracji × opis workflow Template: jak połączyć, use cases, setup guide

Pattern 5: Glossary / Słownik

Dla: branże z dużo terminologii

/slownik/roi-return-on-investment
/slownik/cac-customer-acquisition-cost
/slownik/ltv-lifetime-value

Dane: lista terminów × definicje Template: definicja, formuła, przykład, powiązane terminy

Implementacja w Next.js

Krok 1: Przygotuj dane

// src/data/cities.ts
export const cities = [
  { name: "Warszawa", slug: "warszawa", population: 1794000, region: "mazowieckie" },
  { name: "Kraków", slug: "krakow", population: 780000, region: "małopolskie" },
  // ...
];

// src/data/services.ts
export const services = [
  { name: "Pozycjonowanie SEO", slug: "seo-pozycjonowanie", description: "..." },
  { name: "Tworzenie stron www", slug: "tworzenie-stron", description: "..." },
];

Krok 2: Dynamic route

// src/app/uslugi/[service]-[city]/page.tsx
import { cities } from "@/data/cities";
import { services } from "@/data/services";

export function generateStaticParams() {
  return cities.flatMap(city =>
    services.map(service => ({
      "service-city": `${service.slug}-${city.slug}`,
    }))
  );
}

export function generateMetadata({ params }) {
  const { city, service } = parseParams(params);
  return {
    title: `${service.name} ${city.name} — [Firma] | Lokalni eksperci`,
    description: `${service.name} w ${city.name}. ${service.description} Sprawdź ofertę →`,
  };
}

Krok 3: Template strony

Każda generated page MUSI mieć:

  1. Unikalny H1 z keyword + lokalizacja
  2. Min. 300 słów unikalnej treści (nie tylko zmienione miasto)
  3. Lokalne social proof (jeśli dostępne)
  4. Schema markup (LocalBusiness lub Service)
  5. Internal links do 3+ powiązanych stron
  6. CTA dopasowane do kontekstu

Krok 4: Anti-thin content

Problem: 100 stron z identyczną treścią i tylko zmienionym miastem = thin content → kara.

Rozwiązanie — warstwy unikalności:

WarstwaOpisMin. % unikalnej treści
1 — VariablesMiasto, region, dane lokalne10%
2 — ConditionalSekcje widoczne tylko dla wybranych miast/branż20%
3 — Data-drivenLokalne statystyki, ceny, dane demograficzne20%
4 — AI-generatedUnikalne paragrafy per kombinacja (batch generate)30%

Cel: min. 50% unikalnej treści per strona. Reszta to wspólny template.

Quality gates

Przed publikacją sprawdź:

  • Min. 300 słów per strona (500+ preferowane)
  • Unikalny title i meta description per strona
  • Min. 50% unikalnej treści (nie tylko zmienne)
  • Schema markup (BreadcrumbList + typ strony)
  • Canonical URL ustawiony poprawnie
  • Internal links do 3+ stron
  • Sitemap zawiera wszystkie generated pages
  • robots.txt nie blokuje generated pages
  • Brak duplicate content (sprawdź sample 10 stron)

Skalowanie

SkalaStronPodejście
Mała10-50Ręczne dane + template
Średnia50-500CSV/JSON + generateStaticParams
Duża500-5000Baza danych + ISR (revalidate)
Mega5000+On-demand ISR + sitemap index

Cross-references

  • seo → walidacja generated pages
  • content-strategy → topic clusters → keyword patterns
  • schema-markup → schema per generated page
  • internal-linker → linking strategy dla generated pages
  • product-marketing-context → target-keywords.md (źródło patterns)

Pułapki

  • Thin content — Google karze strony z <50% unikalnej treści. Nie generuj 1000 stron z jednym zmienionym słowem
  • Canonicalization — każda generated page ma swój canonical. Nie wskazuj na wspólną stronę
  • Sitemap — przy 5000+ stronach użyj sitemap index (max 50k URL per sitemap)
  • noindex test pages — nie indeksuj stron z placeholder data
  • Incremental — zacznij od 10-20 stron, sprawdź czy Google indeksuje, potem skaluj

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Gives 0 of the 12 instructions most marketing audience skills give in ~1.9k tokens

Counted across 690 of the 894 authors here whose files we hold, read 2026-08-07

  • Apply Poppins font to headingsin 41 of 690, across 6 files
  • Apply Lora font to body textin 41 of 690, across 6 files
  • Use Arial fallback for headingsin 39 of 690, across 4 files
  • Use Georgia fallback for body textin 39 of 690, across 4 files
  • Maintain text hierarchy and formattingin 39 of 690, across 4 files
  • Use accent colors for non-text shapesin 38 of 690, across 3 files
  • Use RGB values for precise color matchingin 38 of 690, across 3 files
  • Use brand colors for primary text and backgroundsin 36 of 690, across 1 file
  • Read product marketing context file before asking questions, starting, or auditingin 35 of 690, across 23 files
  • Use active voice instead of passive voicein 26 of 690, across 10 files
  • Implement or generate appropriate JSON-LD structured datain 24 of 690, across 17 files
  • Prioritize clarity over clevernessin 22 of 690, across 8 files

Said here and by no other author read

  • write at least 300 words per page
  • ensure at least 50 percent unique content
  • link internally to three related pages
  • add all generated pages to the sitemap
  • start by generating ten to twenty pages

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.