Generates fast, SEO-optimized static HTML landing pages targeting 100/100 PageSpeed (LCP < 2.5s, INP < 100ms, CLS < 0.1), full schema.org JSON-LD, AVIF images, critical CSS, zero external dependencies. Use when: user asks to create/build/generate a landing page, one-pager, or static site with focus on SEO, speed, or PageSpeed; asks for an SEO-friendly page from a brief/ТЗ; or asks to audit/fix a landing against a performance checklist.
npx skills add https://github.com/aleksandr-alhoff/seo-landing --skill seo-landing
Builds a static single-page HTML landing optimized for 100/100 PageSpeed and maximum SEO: critical CSS, AVIF images, full JSON-LD structured data, native-only interactivity, zero third-party requests on first load.
The skill serves three modes — pick one from the request (ask if ambiguous), because each mode collects different inputs and produces different output:
Representative routing:
Generation-only brief fields (target keywords, business type, CTA, media facts) are collected ONLY for generate and rebuild work. An audit or a targeted fix must not be blocked or delayed by missing generation inputs, and audit-only mode must not create or modify any project files.
Required before generating anything:
@id.WebSite markup, only when the page is the domain/subdomain home page): preferred site name, optional alternate names, and the canonical home URL — collected separately from the landing URL.BreadcrumbList markup, only when a real site hierarchy exists): the visible breadcrumb trail and canonical parent URLs.<html lang> (e.g. en-US, ar-SA), the base direction (ltr/rtl — RTL documents get dir="rtl" on <html>, and lang alone does not set directionality), and the Open Graph locale in language_TERRITORY format for og:locale (e.g. en_GB). Ask when direction is unknown for an RTL-capable language (tech-spec §2).Restaurant, Dentist, HardwareStore) — never chosen from target keywords. Never invent missing identity facts: fall back to Organization markup or omit entity markup until the facts are provided.contentUrl when applicable). Never invent missing media facts. Also collect the video mode with its trade-off stated: click-only facade (default — privacy/performance; the page will not satisfy Google's video discovery requirements and no video-search benefit is claimed) or SEO-discoverable (self-hosted <video> or a documented direct embed — required when video search traffic matters) (tech-spec §9).If domain or keywords are missing — ask first, do not invent them.
Audit an existing page without generating a replacement. No project files are created or modified in this mode — the deliverable is a report.
Apply targeted fixes to an existing page without a full rebuild.
Every project lives in its own folder inside the workspace — never write to the workspace root. The output is a multi-file project: every local resource referenced by the HTML must exist as a real file.
<workspace>/<project-slug>/
index.html # the generated landing page
styles.css # only when below-the-fold CSS is deferred (§1); absent when all CSS is inlined
script.js # only when the page uses JS (§10); single file, defer
images/ # every image variant referenced in src/srcset/preload/OG tags (AVIF/WebP/JPEG, all breakpoints)
favicon.png # stable square brand icon, ≥48×48
ASSETS.md # rights & provenance record for every asset
robots.txt
sitemap.xml
SERVER-SETUP.md # hosting instructions
Image branch:
srcset) from them.Build index.html strictly following references/tech-spec.md — 13 requirement sections (performance, HTML structure, SEO, security, CSS/fonts, forbidden list, testing, accessibility, embedded video, typical blocks, deferred widgets, content truthfulness & provenance, input sanitization & output encoding).
Treat every brief value as untrusted: encode it for its exact output context (HTML text, attribute, URL, JSON-LD), allow-list URL schemes (reject javascript:/unexpected data:), escape < in serialized JSON-LD, and validate structured IDs (e.g. YouTube ^[A-Za-z0-9_-]{11}$) before they reach any URL (tech-spec §13).
For embedded YouTube video use the facade pattern by default; the SEO-discoverable mode (self-hosted <video> or a documented direct embed) is an explicit brief choice with a disclosed trade-off, never a silent switch — rules and the Google discovery requirements in tech-spec §9, facade reference implementation in references/video-facade.md. Maps follow the facade rule only (tech-spec §10): a local screenshot in the initial DOM, the iframe inserted only on explicit activation — never a native loading="lazy" map iframe. Reference: references/map-facade.md.
robots.txt at the site root with a fully qualified Sitemap: line, never blocking the canonical page or required media.sitemap.xml with XML-escaped absolute canonical <loc> URLs matching the HTML canonical; lastmod only from a verifiable significant-content-change timestamp (omit when unknown — never use generation time blindly).Show the generated page to the user and ask explicitly whether the HTML version is OK. Do not proceed to validation and the final report until the user confirms. If there are remarks — fix and ask again.
Run the executable validation contract from tech-spec §7 — pinned commands against the served page, measured results only, explicit BLOCKER when a gate cannot run:
src/srcset, <source> srcset, preload href/imagesrcset, favicon, OG/Twitter images, CSS url(), script src) and verify each file exists in the project folder. Any missing referenced local resource is a hard failure — produce the file or remove the reference; never ship HTML pointing at files that were never created.reports/ — lab evidence only, never field Core Web Vitals and never WCAG certification.sitemap.xml, compare every <loc> with the HTML canonical, check the Sitemap: URL in robots.txt, and request both deployed files successfully (HTTP 200).Fix any violations found before reporting. Disclose evidence honestly: every reported number comes with the exact command and artifact path that produced it; a gate that could not run is reported as BLOCKER: <reason> instead of a number. Never output a PageSpeed/LCP score that was not actually measured.
Briefly list:
src/srcset/preload/OG URL must resolve to a real file in the project folder; missing source images are requested from the user, not invented (OUTPUT contract).javascript:/unexpected data: URLs, and self-test generation with hostile values (quotes, </script>, event-handler payloads) (tech-spec §13).defer before </body>.Take aleksandr-alhoff/seo-landing from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.