The project's README from github.com/aleksandr-alhoff/seo-landing. As one markdown file: README.md.
An agent skill for building high-performance, technically optimized SEO landing pages. Turn an AI coding agent into a technical SEO specialist.
Build and improve landing pages with:
🇷🇺 Описание скила на русском языке
Designed for agentic coding workflows and compatible with Agent Skills–style environments.
The skill guides an AI coding agent through the complete landing-page workflow:
AI can generate a beautiful landing page in seconds. The problem is that generated pages often contain:
SEO Landing Skill gives the agent a repeatable technical SEO workflow instead of relying on generic prompting.
An agent skill that builds and updates landing pages toward 100/100 lab PageSpeed and Core Web Vitals-friendly performance, and gets the technical SEO right. Static HTML, critical CSS, AVIF images, full schema.org markup, zero third-party requests on first load (deferred widgets, when used, are consent-gated and documented in the dependency manifest). These are optimization targets, not guaranteed outcomes — results depend on content, hosting, devices, and real traffic; Core Web Vitals status itself is determined by Google from field (RUM) data, not by lab tools.
BEFORE
Landing page
↓
LCP: 4.2s
Performance: 61
Missing schema
Large PNG
Render-blocking CSS
↓ SEO LANDING SKILL ↓
AFTER
Landing page
↓
LCP: 1.1s
Performance: 100
Schema.org ✓
AVIF ✓
Critical CSS ✓
Semantic HTML ✓
Format — Agent Skills (open standard originally developed by Anthropic): works in VS Code Copilot, Claude Code, OpenAI Codex, Google Antigravity, Cursor, Gemini CLI, OpenClaw, Hermes, and other compatible agents.
seo-landing/
├── SKILL.md # Main workflow: mode routing → brief → generation → stop point → validation → report
├── references/
│ ├── tech-spec.md # Technical spec (13 requirement sections + executable validation contract)
│ ├── server-config.md # Server config: caching, Brotli/gzip, security headers (Nginx/Apache)
│ ├── video-facade.md # Reference implementation of the "facade" pattern for YouTube
│ └── map-facade.md # Reference implementation of the "facade" pattern for map embeds
├── benchmark/ # Lab benchmark disclosure: fixture, raw Lighthouse reports, methodology
└── tests/
└── fixtures/broken-landing/ # Negative fixture: every validator gate must fail on it
fetchpriority="high" (a responsive imagesrcset/imagesizes preload only when measurement shows a benefit)<picture>, srcset/sizes, width/height, loading="lazy" for below-the-fold images only (never on the LCP image), breakpoints 320–1920WebSite, Organization, BreadcrumbList, FAQPage, VideoObject — emitted only when fact-backed and reported per the chosen video mode, never as a guaranteed search feature)prefers-reduced-motionX-Content-Type-Options, X-Frame-Options, Permissions-Policy, Referrer-Policy, per-page CSP, staged HSTS, HTTPS enforcement, rel="noopener noreferrer"defer; deferred third-party widgets (when used) are consent-gated, excluded from the budget, and disclosed in the dependency manifest<video> or a documented direct embed) exists when video search matters (tech-spec §9). Maps remain facade-only.<details>, slider via scroll-snap, modal via <dialog>One reproducible lab benchmark: Lighthouse CLI 13.4.1, mobile emulation, simulated throttling. Original — an Angular SPA (102 requests, 1 run); the same page rebuilt as static HTML with this skill (17–18 requests, median of 5 runs). Full disclosure — fixture, exact flags, raw JSON reports, timestamps, and aggregation method — is in benchmark/README.md.
| Metric | Original | Rebuilt | Gain |
|---|---|---|---|
| Performance | 75 | 100 | +25 |
| Accessibility | 75 | 100 | +25 |
| Best Practices | 73 | 100 | +27 |
| LCP | 3.3 s | 1.6 s | −52% |
| Total Blocking Time | 490 ms | 13 ms | −97% |
| TTI | 9.4 s | 1.6 s | −83% |
| Data transferred | 769 KiB | 110 KiB | −86% |
| Requests | 102 | 17 | −83% |
These are lab numbers for one before/after pair. They are not field Core Web Vitals (Google determines CWV status from CrUX/RUM field data at the 75th percentile, and Lighthouse cannot measure INP without real interaction), and they are not a guarantee that another page, host, device, or audience will reach the same results — the skill's targets are optimization goals, not promised outcomes.
The skill is hosted at github.com/aleksandr-alhoff/seo-landing. Clone the repository — the repo root is the skill folder itself — then run the commands below from the directory that contains seo-landing/:
git clone https://github.com/aleksandr-alhoff/seo-landing.git
Every recipe below is self-contained: it creates its destination directory first, then copies the skill into it. Each one must exit with status 0 and leave the layout <skills-dir>/seo-landing/SKILL.md in place.
Note: cp -R from a git clone also copies the clone's .git directory into the installation — harmless, but unnecessary. To keep installations lean, replace cp -R seo-landing <dir>/ with rsync -a --exclude=.git seo-landing <dir>/seo-landing/ (the same sync used for updates below).
# VS Code Copilot
mkdir -p ~/.copilot/skills
cp -R seo-landing ~/.copilot/skills/
# Claude Code
mkdir -p ~/.claude/skills
cp -R seo-landing ~/.claude/skills/
# OpenAI Codex CLI / ChatGPT desktop
mkdir -p ~/.agents/skills
cp -R seo-landing ~/.agents/skills/
# Cursor
mkdir -p ~/.cursor/skills
cp -R seo-landing ~/.cursor/skills/
# Gemini CLI
mkdir -p ~/.gemini/skills
cp -R seo-landing ~/.gemini/skills/
# Google Antigravity
mkdir -p ~/.gemini/config/skills
cp -R seo-landing ~/.gemini/config/skills/
# OpenCode
mkdir -p ~/.config/opencode/skills
cp -R seo-landing ~/.config/opencode/skills/
# OpenClaw (via CLI — installs into the shared ~/.openclaw/skills)
openclaw skills install git:aleksandr-alhoff/seo-landing --global
# or from a local clone: openclaw skills install ./seo-landing --global
# or manually:
mkdir -p ~/.openclaw/skills
cp -R seo-landing ~/.openclaw/skills/
# Hermes
mkdir -p ~/.hermes/skills
cp -R seo-landing ~/.hermes/skills/
OpenClaw also picks up skills from ~/.agents/skills (the Codex path above), and Hermes can scan it too if you add ~/.agents/skills to skills.external_dirs in ~/.hermes/config.yaml.
Gemini CLI can also install straight from a Git repository:
gemini skills install https://github.com/aleksandr-alhoff/seo-landing.git
# Shared .agents/skills — picked up by VS Code Copilot, Codex, Cursor, Antigravity, Gemini CLI, OpenCode, OpenClaw, Hermes
mkdir -p .agents/skills
cp -R seo-landing .agents/skills/
# Claude Code
mkdir -p .claude/skills
cp -R seo-landing .claude/skills/
# VS Code Copilot (GitHub-style location)
mkdir -p .github/skills
cp -R seo-landing .github/skills/
# OpenClaw (workspace skills — highest precedence)
# via CLI: openclaw skills install ./seo-landing
mkdir -p skills
cp -R seo-landing skills/
# Hermes (project-local; then trust the repo once: hermes skills trust)
mkdir -p .hermes/skills
cp -R seo-landing .hermes/skills/
Two facts drive everything below:
git pull changes only the clone. An installed copy made with cp -R is independent — pulling the source clone does NOT update any installation.cp -R copies, it does not synchronize. GNU cp has no destination-sync/removal behavior: a file deleted upstream stays in the installed copy forever, producing a mixed release of old and new instructions.So an update is an explicit, bounded, idempotent sync into the resolved skill destination — never a blind re-copy.
| Client / scope | Installed skill destination ($DEST) |
|---|---|
| VS Code Copilot — global | ~/.copilot/skills/seo-landing |
| Claude Code — global | ~/.claude/skills/seo-landing |
| OpenAI Codex CLI / ChatGPT desktop — global | ~/.agents/skills/seo-landing |
| Cursor — global | ~/.cursor/skills/seo-landing |
| Gemini CLI — global | ~/.gemini/skills/seo-landing |
| Google Antigravity — global | ~/.gemini/config/skills/seo-landing |
| OpenCode — global | ~/.config/opencode/skills/seo-landing |
| OpenClaw — global | ~/.openclaw/skills/seo-landing |
| Hermes — global | ~/.hermes/skills/seo-landing |
| Shared per-project (Copilot, Codex, Cursor, Antigravity, Gemini CLI, OpenCode, OpenClaw, Hermes) | .agents/skills/seo-landing |
| Claude Code — per project | .claude/skills/seo-landing |
| VS Code Copilot — per project (GitHub-style) | .github/skills/seo-landing |
| OpenClaw — workspace (highest precedence) | skills/seo-landing |
| Hermes — per project | .hermes/skills/seo-landing |
Run from the directory that contains the updated seo-landing/ clone, with $DEST set to the destination from the table above:
DEST=~/.copilot/skills/seo-landing # ← substitute the right destination
# 1. Recovery first: back up the current installation (the sync is destructive).
cp -R "$DEST" "$DEST.backup-$(date +%Y%m%d)"
# 2. Bounded idempotent sync: copy new/changed files AND delete files inside
# $DEST that no longer exist upstream. --delete only ever touches $DEST.
rsync -a --delete --exclude=.git seo-landing/ "$DEST/"
# 3. Verify: zero differences (exit status 0) and the installed SKILL.md
# matches the source revision byte-for-byte.
diff -qr -x .git seo-landing "$DEST" && cmp "$DEST/SKILL.md" seo-landing/SKILL.md
Notes:
rsync -a --delete is available out of the box on macOS (openrsync) and on typical Linux systems; --exclude=.git keeps the clone's history out of the installation.rm -rf "$DEST" && cp -R "$DEST.backup-<date>" "$DEST". (macOS openrsync does not support --backup, so the explicit copy is the verified mechanism.)SKILL.md becomes byte-identical to the source revision.diff -qr -x .git seo-landing "$DEST"
Exit status 0 (no output) means the installation matches the clone exactly. Any printed difference is a stale, modified, or extra file — re-run the update sync to resolve it. To check which specification version is installed, read the Version line at the top of $DEST/references/tech-spec.md (the single source of truth for versions).
Agents read skills when a session starts. After updating, start a new chat session (or restart the agent CLI) before relying on the new version. Clients that gate skills behind trust/approval (e.g. Hermes: hermes skills trust) may require re-trusting the updated copy.
rm -rf "$DEST" # the destination from the table above
If the copy was installed through a client CLI (openclaw skills install, gemini skills install), prefer that client's own uninstall command when it provides one; otherwise removing the destination directory is sufficient. Also remove any backups ($DEST.backup-*) you no longer need.
Symlinking the clone into a skills directory (so git pull updates it in place) is possible in principle, but official symlink support, trust handling, and reload behavior differ per client and are NOT verified here — treat this as experimental. The rsync sync above is the supported, client-independent update path.
Once installed, the skill is picked up automatically by its description — just ask your agent to "build a landing page from a brief with focus on SEO and PageSpeed".
<workspace>/<project-slug>/) with index.html and every local asset it references (all image variants, favicon), plus — conditionally — styles.css (deferred CSS only), script.js (when JS is used), robots.txt, sitemap.xml, ASSETS.md, and SERVER-SETUP.md. Missing source images are requested from the user, never invented.Aleksandr Alhov — 14+ years of experience in SEO, content marketing, and GEO/AEO. Runs an SEO boutique for product teams working across EN, LATAM, MENA, and CIS markets: building in-house SEO departments turnkey, launching profitable corporate media, discovering growth hypotheses in the SEO channel, and providing hands-on SEO consulting.
Co-founder of:
Made for the t.me/sdelay_tam channel — a cozy SEO channel for product teams. SEO questions: t.me/alhov.
MIT — free to use, modify, and distribute, including commercially. Just keep the copyright notice. Specification: see references/tech-spec.md — the current version and change record are declared there.