seo-geo
Skill1 starsChanged 5 months agoMITView on GitHub
Skill especializado en SEO técnico y GEO (Generative Engine Optimization) para aplicaciones web. Úsalo siempre que el usuario mencione: metatags, Open Graph, Twitter Cards, datos estructurados, JSON-LD, Schema.org, canonical, hreflang, sitemap, robots.txt, Core Web Vitals, rendimiento SEO, optimización para motores de búsqueda, optimización para IA (ChatGPT, Perplexity, Gemini, Bing AI), rich snippets, breadcrumbs, FAQ schema, LocalBusiness, posicionamiento web, o cualquier tarea donde se quiera mejorar la visibilidad de una app en buscadores tradicionales o en motores de IA generativa. También debe activarse si el usuario pide "hacer la app más visible", "mejorar el SEO", "añadir metadatos", "optimizar para buscadores", o cuando genere páginas HTML/React/Next.js/Nuxt/Angular que deban estar bien posicionadas.
55 other projects use a version of this.
Adopted by
Most recently taken up by
- seranking/seo-skillstheir own version, first seen Nov 8, 2026
- whyashthakker/estacktheir own version, first seen Nov 8, 2026
- julianosirtori/skillstheir own version, first seen Nov 8, 2026
- alpit-patel/seo-aeo-geo-kittheir own version, first seen Nov 8, 2026
- figueroaignacio/ignaciofigueroa.devtheir own version, first seen Nov 8, 2026
- theexperiencecompany/gaiatheir own version, first seen Nov 3, 2026
Used with
Projects with it also use seo-agentic, seo-competitor-pages and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
AgriciDanielSkillseo-agentic
Audit and fix agent readiness: the Lighthouse Agentic Browsing fraction, accessibility tree for agents, robots.txt and Content-Signal for AI agents, WAF treatment of agent traffic, llms.txt, Markdown delivery, ai-catalog.json, /.well-known discovery files, and WebMCP tools. Use when the user asks whether AI agents can use or browse the site, or about llms.txt or WebMCP. Exclude AI citability and brand signals (seo-geo) and commerce protocol depth (seo-ecommerce).
Also in 5 projects that use this
megastepSkillseo-competitor-pages
Generate SEO-optimized competitor comparison and alternatives pages. Covers "X vs Y" layouts, "alternatives to X" pages, feature matrices, schema markup, and conversion optimization. Use when user says "comparison page", "vs page", "alternatives page", "competitor comparison", or "X vs Y".
Also in 21 projects that use this
megastepSkillseo-images
Image optimization analysis for SEO and performance. Checks alt text, file sizes, formats, responsive images, lazy loading, and CLS prevention. Use when user says "image optimization", "alt text", "image SEO", "image size", or "image audit".
Also in 20 projects that use this
timruebenachSkillseo-google
Google SEO APIs: Search Console (Search Analytics, URL Inspection, Sitemaps), PageSpeed Insights v5, CrUX field data with 25-week history, Indexing API v3, and GA4 organic traffic. Provides real Google field data for Core Web Vitals, indexation status, search performance, and organic traffic trends. Use when user says "search console", "GSC", "PageSpeed", "CrUX", "field data", "indexing API", "GA4 organic", "URL inspection", "google api setup", "real CWV data", "impressions", "clicks", "CTR", "position data", "LCP", "INP", "CLS", "FCP", "TTFB", or "Lighthouse scores".
Also in 13 projects that use this
timruebenachSkillseo-image-gen
AI image generation for SEO assets: OG/social preview images, blog hero images, schema images, product photography, infographics. Powered by Gemini via nanobanana-mcp. Requires banana extension installed. Use when user says \"generate image\", \"OG image\", \"social preview\", \"hero image\", \"blog image\", \"product photo\", \"infographic\", \"seo image\", \"create visual\", \"image-gen\", \"favicon\", \"schema image\", \"pinterest pin\", \"generate visual\", \"banner\", or \"thumbnail\".
Also in 12 projects that use this
- +3 more from megastep
- +4 more from timruebenach
Other versions55 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 55
- AgriciDaniel/claude-seo★ 20ksame name
- ReScienceLab/opc-skills★ 1.9ksame name
- theexperiencecompany/gaia★ 325same name
- eunomia-bpf/eunomia.dev★ 244same name
- seranking/seo-skills★ 201same name
- zhtyyx/codex-seo★ 152same name
- PostPlusAI/postplus-skills★ 27same name
- chuhaiqu/skills★ 22same name
- coopersimson96/ai-content-system★ 17same name
- whyashthakker/agent-skills-marketing★ 15same name
45 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository5 other files it gives its agents.
- angularSkill
- bemitSkill
- bemSkill
- commitlintSkill
- itcssSkill
The file
Files
SEO & GEO Skill
Guía de referencia profesional para implementar SEO técnico completo y GEO (Generative Engine Optimization) en aplicaciones web modernas. Cubre desde metaetiquetas básicas hasta datos enriquecidos JSON-LD, estrategias de contenido para IA generativa, y auditoría técnica.
Índice
- Fundamentos SEO — Etiquetas META
- Open Graph y Social Cards
- Datos Estructurados JSON-LD
- GEO — Generative Engine Optimization
- SEO Técnico Avanzado
- Core Web Vitals y Rendimiento
- SEO Local y Multiidioma
- Auditoría y Checklist
- Patrones por Framework
1. Fundamentos SEO — Etiquetas META
Bloque <head> mínimo obligatorio
<head>
<!-- Codificación y viewport -->
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0" />
<!-- Título: 50-60 caracteres. Palabra clave principal al inicio. -->
<title>Palabra Clave Principal | Marca</title>
<!-- Meta description: 150-160 caracteres. CTA implícito. -->
<meta
name="description"
content="Descripción clara, relevante y con CTA. Máximo 160 caracteres para evitar truncamiento en SERPs." />
<!-- Canonical: siempre apuntar a la URL canónica definitiva -->
<link
rel="canonical"
href="https://tudominio.com/ruta-canonica/" />
<!-- Robots: por defecto index, follow. Ajustar según página -->
<meta
name="robots"
content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1" />
<!-- Autor y copyright (opcional pero recomendado) -->
<meta
name="author"
content="Nombre del autor o empresa" />
</head>Meta robots — Valores importantes
| Directiva | Uso |
noindex | Evitar indexación (páginas de pago, duplicadas) |
nofollow | No seguir enlaces de la página |
noarchive | Google no muestra caché |
noimageindex | No indexar imágenes de la página |
max-snippet:-1 | Sin límite de fragmento en SERPs |
max-image-preview:large | Previsualización de imagen grande |
Etiquetas de control adicionales
<!-- Control de indexación por robots específicos -->
<meta
name="googlebot"
content="index, follow" />
<meta
name="bingbot"
content="index, follow" />
<!-- Tema de color (PWA y móviles) -->
<meta
name="theme-color"
content="#1a73e8" />
<!-- Verificación de propiedad (no SEO pero necesario) -->
<meta
name="google-site-verification"
content="TOKEN" />2. Open Graph y Social Cards
Open Graph (Facebook, LinkedIn, WhatsApp)
<!-- Tipo de contenido -->
<meta
property="og:type"
content="website" />
<!-- Valores: website | article | product | book | profile | video.movie -->
<meta
property="og:url"
content="https://tudominio.com/pagina/" />
<meta
property="og:title"
content="Título para redes sociales (70 chars máx)" />
<meta
property="og:description"
content="Descripción para redes sociales (200 chars máx)" />
<!-- Imagen: mínimo 1200×630px, ratio 1.91:1, menos de 8MB -->
<meta
property="og:image"
content="https://tudominio.com/og/pagina.jpg" />
<meta
property="og:image:width"
content="1200" />
<meta
property="og:image:height"
content="630" />
<meta
property="og:image:alt"
content="Descripción de la imagen para accesibilidad" />
<meta
property="og:image:type"
content="image/jpeg" />
<meta
property="og:site_name"
content="Nombre de tu sitio" />
<meta
property="og:locale"
content="es_ES" />
<meta
property="og:locale:alternate"
content="en_US" />Twitter / X Cards
<!-- summary_large_image es el tipo más visible -->
<meta
name="twitter:card"
content="summary_large_image" />
<!-- Valores: summary | summary_large_image | app | player -->
<meta
name="twitter:site"
content="@handle_de_tu_marca" />
<meta
name="twitter:creator"
content="@handle_del_autor" />
<meta
name="twitter:title"
content="Título para Twitter (70 chars máx)" />
<meta
name="twitter:description"
content="Descripción para Twitter (200 chars máx)" />
<meta
name="twitter:image"
content="https://tudominio.com/og/pagina.jpg" />
<meta
name="twitter:image:alt"
content="Descripción de la imagen" />Open Graph para artículos
<meta
property="og:type"
content="article" />
<meta
property="article:published_time"
content="2025-01-15T10:00:00+01:00" />
<meta
property="article:modified_time"
content="2025-03-20T14:30:00+01:00" />
<meta
property="article:author"
content="https://tudominio.com/autor/nombre/" />
<meta
property="article:section"
content="Tecnología" />
<meta
property="article:tag"
content="SEO" />
<meta
property="article:tag"
content="Marketing Digital" />3. Datos Estructurados JSON-LD
Regla general: siempre usar <script type="application/ld+json"> en el <head> o al final del <body>. Nunca mezclar con el contenido HTML visible. Validar siempre en schema.org/docs/validator y en Rich Results Test.
3.1 Organization / WebSite (base de todo sitio)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://tudominio.com/#organization",
"name": "Nombre de tu empresa",
"url": "https://tudominio.com",
"logo": {
"@type": "ImageObject",
"url": "https://tudominio.com/logo.png",
"width": 512,
"height": 512
},
"sameAs": [
"https://www.linkedin.com/company/tu-empresa",
"https://twitter.com/tu_empresa",
"https://www.facebook.com/tuempresa",
"https://www.instagram.com/tuempresa"
],
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+34-900-000-000",
"contactType": "customer service",
"availableLanguage": ["Spanish", "English"]
}
},
{
"@type": "WebSite",
"@id": "https://tudominio.com/#website",
"url": "https://tudominio.com",
"name": "Nombre del sitio web",
"publisher": { "@id": "https://tudominio.com/#organization" },
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://tudominio.com/buscar?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
}
]
}
</script>3.2 WebPage (página genérica)
{
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https://tudominio.com/pagina/#webpage",
"url": "https://tudominio.com/pagina/",
"name": "Título de la página",
"description": "Descripción de la página",
"isPartOf": { "@id": "https://tudominio.com/#website" },
"about": { "@id": "https://tudominio.com/#organization" },
"datePublished": "2025-01-01",
"dateModified": "2025-03-15",
"breadcrumb": { "@id": "https://tudominio.com/pagina/#breadcrumb" }
}3.3 BreadcrumbList
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"@id": "https://tudominio.com/categoria/producto/#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Inicio",
"item": "https://tudominio.com"
},
{
"@type": "ListItem",
"position": 2,
"name": "Categoría",
"item": "https://tudominio.com/categoria/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Nombre del Producto"
}
]
}3.4 Article / BlogPosting
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Título del artículo (máx 110 chars)",
"description": "Descripción del artículo",
"image": {
"@type": "ImageObject",
"url": "https://tudominio.com/img/articulo.jpg",
"width": 1200,
"height": 630
},
"datePublished": "2025-01-15T10:00:00+01:00",
"dateModified": "2025-03-20T14:30:00+01:00",
"author": {
"@type": "Person",
"name": "Nombre del Autor",
"url": "https://tudominio.com/autor/nombre/",
"sameAs": "https://www.linkedin.com/in/nombre-autor"
},
"publisher": {
"@type": "Organization",
"name": "Nombre del sitio",
"logo": {
"@type": "ImageObject",
"url": "https://tudominio.com/logo.png"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://tudominio.com/blog/titulo-articulo/"
},
"articleSection": "SEO",
"wordCount": 2500,
"inLanguage": "es-ES"
}3.5 Product (e-commerce)
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Nombre del producto",
"description": "Descripción detallada del producto",
"image": ["https://tudominio.com/img/producto-1.jpg", "https://tudominio.com/img/producto-2.jpg"],
"sku": "SKU-12345",
"mpn": "MPN-67890",
"brand": {
"@type": "Brand",
"name": "Nombre de la marca"
},
"offers": {
"@type": "Offer",
"url": "https://tudominio.com/producto/nombre/",
"priceCurrency": "EUR",
"price": "29.99",
"priceValidUntil": "2025-12-31",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Tu Tienda"
},
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "0",
"currency": "EUR"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 3,
"unitCode": "DAY"
}
}
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "128",
"bestRating": "5",
"worstRating": "1"
},
"review": [
{
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
},
"author": {
"@type": "Person",
"name": "Usuario Ejemplo"
},
"reviewBody": "Excelente producto, muy recomendable."
}
]
}3.6 FAQPage
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "¿Cuál es la pregunta frecuente 1?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Respuesta completa y detallada a la pregunta 1."
}
},
{
"@type": "Question",
"name": "¿Cuál es la pregunta frecuente 2?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Respuesta completa y detallada a la pregunta 2."
}
}
]
}3.7 LocalBusiness (negocios físicos)
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"@id": "https://tudominio.com/#local-business",
"name": "Nombre del negocio",
"description": "Descripción del negocio",
"url": "https://tudominio.com",
"telephone": "+34 900 000 000",
"email": "info@tudominio.com",
"priceRange": "€€",
"currenciesAccepted": "EUR",
"paymentAccepted": "Cash, Credit Card",
"image": "https://tudominio.com/img/negocio.jpg",
"logo": "https://tudominio.com/logo.png",
"address": {
"@type": "PostalAddress",
"streetAddress": "Calle Ejemplo, 123",
"addressLocality": "Madrid",
"addressRegion": "Madrid",
"postalCode": "28001",
"addressCountry": "ES"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 40.4168,
"longitude": -3.7038
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Saturday",
"opens": "10:00",
"closes": "14:00"
}
],
"sameAs": [
"https://www.google.com/maps/place/TU_PLACE_ID",
"https://www.yelp.com/biz/tu-negocio"
],
"hasMap": "https://www.google.com/maps?q=40.4168,-3.7038"
}3.8 HowTo
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "Cómo hacer X paso a paso",
"description": "Guía completa para hacer X",
"image": "https://tudominio.com/img/howto.jpg",
"totalTime": "PT30M",
"estimatedCost": {
"@type": "MonetaryAmount",
"currency": "EUR",
"value": "0"
},
"supply": [{ "@type": "HowToSupply", "name": "Herramienta 1" }],
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Paso 1: Nombre descriptivo",
"text": "Descripción detallada del paso 1.",
"image": "https://tudominio.com/img/paso1.jpg",
"url": "https://tudominio.com/como-hacer-x/#paso-1"
}
]
}3.9 Event
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Nombre del evento",
"startDate": "2025-06-15T18:00:00+02:00",
"endDate": "2025-06-15T21:00:00+02:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"location": {
"@type": "Place",
"name": "Nombre del lugar",
"address": {
"@type": "PostalAddress",
"streetAddress": "Calle Ejemplo, 1",
"addressLocality": "Barcelona",
"addressCountry": "ES"
}
},
"image": "https://tudominio.com/img/evento.jpg",
"description": "Descripción del evento",
"offers": {
"@type": "Offer",
"url": "https://tudominio.com/evento/registro/",
"price": "0",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock",
"validFrom": "2025-01-01T00:00:00+01:00"
},
"organizer": {
"@type": "Organization",
"name": "Tu empresa",
"url": "https://tudominio.com"
}
}3.10 SoftwareApplication (apps web/móvil)
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Nombre de la App",
"description": "Descripción de la app",
"operatingSystem": "Web, iOS, Android",
"applicationCategory": "BusinessApplication",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "EUR"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "2500"
},
"screenshot": "https://tudominio.com/img/app-screenshot.jpg",
"featureList": "Feature 1, Feature 2, Feature 3",
"softwareVersion": "2.1.0"
}4. GEO — Generative Engine Optimization
GEO es la optimización del contenido para que los motores de IA generativa (ChatGPT, Perplexity, Gemini, Bing Copilot, Claude) citen o referencien tu contenido en sus respuestas.
Principios fundamentales GEO
Los LLMs no indexan HTML, indexan texto semántico legible. El contenido debe estar:
- Claramente estructurado con jerarquía H1 > H2 > H3
- Escrito en párrafos informativos completos (no solo bullets)
- Con definiciones explícitas ("X es...", "Se define como...")
- Con citas a fuentes autoritativas verificables
Estrategias concretas de GEO
4.1 E-E-A-T reforzado (Experience, Expertise, Authoritativeness, Trustworthiness)
<!-- Mostrar autor con credenciales verificables -->
<div
itemscope
itemtype="https://schema.org/Person">
<span itemprop="name">Dr. Nombre Apellido</span>
<span itemprop="jobTitle">Especialista en SEO con 10 años de experiencia</span>
<a
itemprop="sameAs"
href="https://www.linkedin.com/in/nombre"
>LinkedIn</a
>
</div>
<!-- Fechas visibles y actualizadas en el contenido -->
<time datetime="2025-03-20">Actualizado el 20 de marzo de 2025</time>4.2 Contenido optimizado para citas de IA
<!-- ✅ Correcto: definición directa y citable -->
## ¿Qué es el SEO técnico?
El SEO técnico es el conjunto de optimizaciones aplicadas a la
infraestructura de un sitio web para mejorar su rastreo e indexación
por parte de los motores de búsqueda. Incluye la optimización de
velocidad, estructura de URLs, datos estructurados y accesibilidad.
<!-- ❌ Incorrecto para GEO: fragmentado, sin definición clara -->
## SEO técnico
- Velocidad
- URLs
- Datos estructurados4.3 Metaetiquetas específicas para rastreadores de IA
<!-- Permitir a los rastreadores de IA indexar el contenido -->
<!-- NOTA: OAI-SearchBot y PerplexityBot respetan robots.txt -->
<!-- Si quieres bloquear rastreadores de IA para entrenamiento pero no para RAG -->
<meta
name="robots"
content="noai, noimageai" />
<!-- noai: no usar contenido para entrenamiento de modelos -->
<!-- noimageai: no usar imágenes para entrenamiento -->
<!-- Para permitir rastreo de Perplexity explícitamente en robots.txt: -->
<!-- User-agent: PerplexityBot -->
<!-- Allow: / -->4.4 llms.txt — Archivo de contexto para LLMs
Crea /llms.txt en la raíz del dominio (convención emergente, inspirada en robots.txt):
# Nombre de tu empresa
> Descripción concisa de qué hace tu empresa o producto.
Esta web es la fuente oficial de información sobre [tema].
## Contenido principal
- [Página de inicio](https://tudominio.com/): Descripción de la home
- [Guía completa de X](https://tudominio.com/guia/): Guía definitiva sobre X
- [API Reference](https://tudominio.com/docs/api/): Documentación técnica
- [Blog](https://tudominio.com/blog/): Artículos y tutoriales
## Información importante
- Fundada en: 2020
- Sede: Madrid, España
- Contacto: info@tudominio.com
- Licencia de contenido: CC BY-SA 4.0
## Lo que NO somos
No somos [empresa similar]. No ofrecemos [servicio que no ofrecemos].También puedes crear /llms-full.txt con el contenido completo del sitio para ingesta directa.
4.5 Citabilidad estructural
Para que los LLMs citen correctamente tu contenido, incluye:
<!-- Referencias y fuentes en el contenido -->
<article>
<h2>Afirmación basada en datos</h2>
<p>
Según el informe de Google Search Central (2024), el 53% de los usuarios abandona una página que
tarda más de 3 segundos en cargar.
</p>
<footer>
<cite>
Fuente:
<a
href="URL_FUENTE"
rel="noopener"
>Google Web Vitals Report 2024</a
>
</cite>
</footer>
</article>5. SEO Técnico Avanzado
5.1 robots.txt
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/private/
Disallow: /checkout/
Disallow: /*?*sessionid=
Disallow: /buscar?
# Archivos de mapa del sitio
Sitemap: https://tudominio.com/sitemap.xml
Sitemap: https://tudominio.com/sitemap-images.xml
# Rastreadores de IA para entrenamiento (opcional bloquear)
User-agent: GPTBot
Disallow: /contenido-exclusivo/
User-agent: Claude-Web
Disallow: /
# Rastreadores de IA para búsqueda (dejar pasar)
User-agent: PerplexityBot
Allow: /
User-agent: OAI-SearchBot
Allow: /5.2 sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>https://tudominio.com/</loc>
<lastmod>2025-03-20</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
<!-- Imágenes en sitemap -->
<image:image>
<image:loc>https://tudominio.com/img/hero.jpg</image:loc>
<image:caption>Descripción de la imagen para SEO</image:caption>
</image:image>
<!-- Versiones en otros idiomas -->
<xhtml:link rel="alternate" hreflang="es" href="https://tudominio.com/" />
<xhtml:link rel="alternate" hreflang="en" href="https://tudominio.com/en/" />
</url>
</urlset>5.3 Hreflang (multiidioma)
<!-- En el <head> de cada versión de la página -->
<link
rel="alternate"
hreflang="es"
href="https://tudominio.com/pagina/" />
<link
rel="alternate"
hreflang="es-ES"
href="https://tudominio.com/pagina/" />
<link
rel="alternate"
hreflang="es-MX"
href="https://mx.tudominio.com/pagina/" />
<link
rel="alternate"
hreflang="en"
href="https://tudominio.com/en/page/" />
<link
rel="alternate"
hreflang="en-US"
href="https://tudominio.com/en/page/" />
<link
rel="alternate"
hreflang="x-default"
href="https://tudominio.com/pagina/" />Reglas hreflang:
- Cada página debe apuntar a todas las variantes, incluida ella misma.
x-defaultindica la página por defecto cuando ningún idioma encaja.- Debe ser recíproco: si A apunta a B, B debe apuntar a A.
5.4 Preconnect, Prefetch y Preload
<!-- Preconnect: establecer conexión anticipada con dominios externos críticos -->
<link
rel="preconnect"
href="https://fonts.googleapis.com" />
<link
rel="preconnect"
href="https://fonts.gstatic.com"
crossorigin />
<link
rel="dns-prefetch"
href="https://www.google-analytics.com" />
<!-- Preload: cargar recursos críticos del LCP antes -->
<link
rel="preload"
as="image"
href="/img/hero.webp"
fetchpriority="high" />
<link
rel="preload"
as="font"
href="/fonts/Inter.woff2"
type="font/woff2"
crossorigin />
<link
rel="preload"
as="style"
href="/css/critical.css" />5.5 URLs canónicas — Casos especiales
<!-- Página con parámetros UTM: canonical a la URL limpia -->
<!-- URL real: /producto?utm_source=newsletter -->
<link
rel="canonical"
href="https://tudominio.com/producto/" />
<!-- Paginación: cada página tiene su propia canonical -->
<!-- /blog/page/2/ apunta a sí misma, no a /blog/ -->
<link
rel="canonical"
href="https://tudominio.com/blog/page/2/" />
<!-- AMP: en la página AMP, canonical apunta a la versión normal -->
<link
rel="canonical"
href="https://tudominio.com/articulo/" />
<!-- En la versión normal, apuntar a la AMP -->
<link
rel="amphtml"
href="https://tudominio.com/articulo/amp/" />6. Core Web Vitals y Rendimiento
Los CWV son factores de ranking confirmados por Google. Objetivo: pasar todos en verde.
| Métrica | Descripción | Objetivo | Bueno | Mejorar | Malo |
| LCP | Largest Contentful Paint | Carga del elemento principal | < 2.5s | 2.5-4s | > 4s |
| INP | Interaction to Next Paint | Respuesta a interacciones | < 200ms | 200-500ms | > 500ms |
| CLS | Cumulative Layout Shift | Estabilidad visual | < 0.1 | 0.1-0.25 | > 0.25 |
Optimización LCP
<!-- 1. Priorizar la imagen del LCP -->
<img
src="/img/hero.webp"
alt="Descripción relevante"
width="1200"
height="630"
fetchpriority="high"
loading="eager" />
<!-- 2. Evitar lazy loading en imágenes above-the-fold -->
<!-- ❌ Incorrecto -->
<img
src="/img/hero.webp"
loading="lazy" />
<!-- 3. Usar formatos modernos con fallback -->
<picture>
<source
type="image/avif"
srcset="/img/hero.avif" />
<source
type="image/webp"
srcset="/img/hero.webp" />
<img
src="/img/hero.jpg"
alt="Descripción"
width="1200"
height="630" />
</picture>Optimización CLS
<!-- Reservar espacio para imágenes con width y height -->
<img
src="/img/producto.webp"
width="400"
height="300"
alt="..." />
<!-- Reservar espacio para ads y embeds -->
<div style="min-height: 250px;">
<!-- Anuncio o embed cargado dinámicamente -->
</div>
<!-- Fuentes web sin FOUT/FOIT -->
<style>
@font-face {
font-family: 'Inter';
src: url('/fonts/Inter.woff2') format('woff2');
font-display: swap; /* Usar fuente del sistema hasta cargar la web font */
}
</style>7. SEO Local y Multiidioma
Señales SEO local
<!-- NAP consistente en toda la web (Name, Address, Phone) -->
<address
itemscope
itemtype="https://schema.org/PostalAddress">
<span itemprop="streetAddress">Calle Mayor, 10</span>,
<span itemprop="addressLocality">Madrid</span>, <span itemprop="postalCode">28001</span>,
<span itemprop="addressCountry">España</span>
</address>
<a
href="tel:+34900000000"
itemprop="telephone"
>+34 900 000 000</a
>Google Business Profile — Optimización complementaria
El JSON-LD de LocalBusiness debe ser idéntico a los datos en Google Business Profile:
- Nombre exacto del negocio
- Dirección en el mismo formato
- Teléfono con prefijo internacional
- Categorías de negocio alineadas
Meta de idioma y región
<html lang="es-ES">
<!-- Valores: es | es-ES | es-MX | en | en-US | ca | gl | eu -->
<!-- Content-Language en HTTP headers (configurar en servidor) -->
<!-- Content-Language: es-ES -->
</html>8. Auditoría y Checklist
Checklist SEO técnico por página
✅ Metadatos básicos
<title>único, 50-60 chars, keyword al inicio<meta description>único, 150-160 chars<link rel="canonical">correcto y sin trailing slash inconsistente<meta name="robots">configurado según tipo de página<html lang="xx-XX">definido
✅ Open Graph y Social
og:title,og:description,og:image(1200×630px mínimo)og:typecorrecto según el tipo de páginaog:urligual a la canonicaltwitter:card,twitter:title,twitter:image
✅ JSON-LD
Organization+WebSiteen el homeBreadcrumbListen páginas internas- Schema específico del tipo de página (Article, Product, FAQ, etc.)
- Validado en Rich Results Test de Google
- Sin errores en Schema.org Validator
✅ Técnico
- HTTPS activo y sin mixed content
- Redirects 301 (no 302) para URLs movidas
- Sin broken links internos (404)
robots.txtcorrecto y accesiblesitemap.xmlenviado en Google Search Console- Imágenes con
width+height+altdescriptivo - Fuentes con
font-display: swap - LCP < 2.5s, CLS < 0.1, INP < 200ms
✅ GEO
/llms.txtcreado y actualizado- Definiciones explícitas en el contenido
- E-E-A-T visible: autor, fechas, fuentes
noai/noimageaiconfigurado según política de contenido
Herramientas de validación
| Herramienta | URL | Para qué |
| Rich Results Test | search.google.com/test/rich-results | Validar JSON-LD |
| Schema Validator | validator.schema.org | Validar Schema.org |
| PageSpeed Insights | pagespeed.web.dev | CWV y rendimiento |
| Google Search Console | search.google.com/search-console | Indexación y cobertura |
| Open Graph Debugger | developers.facebook.com/tools/debug | Validar OG |
| Twitter Card Validator | cards-dev.twitter.com/validator | Validar Twitter Cards |
| Ahrefs Webmaster | ahrefs.com/webmaster-tools | Backlinks y auditoría |
| Screaming Frog | screamingfrog.co.uk/seo-spider | Crawl completo del sitio |
9. Patrones por Framework
Next.js 14+ (App Router)
// app/layout.tsx o app/[slug]/page.tsx
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: {
template: '%s | Nombre del Sitio',
default: 'Nombre del Sitio',
},
description: 'Descripción global del sitio',
metadataBase: new URL('https://tudominio.com'),
alternates: {
canonical: '/',
languages: {
'es-ES': '/es',
'en-US': '/en',
},
},
openGraph: {
title: 'Título OG',
description: 'Descripción OG',
url: 'https://tudominio.com',
siteName: 'Nombre del Sitio',
images: [{ url: '/og-image.jpg', width: 1200, height: 630 }],
locale: 'es_ES',
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: 'Título Twitter',
description: 'Descripción Twitter',
site: '@handle',
images: ['/og-image.jpg'],
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
'max-video-preview': -1,
'max-image-preview': 'large',
'max-snippet': -1,
},
},
};
// JSON-LD en Next.js
export default function Page() {
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'WebPage',
name: 'Título de la página',
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
{/* Contenido */}
</>
);
}Angular (con SSR/SSG obligatorio para SEO)
// En el componente o en un servicio SEO centralizado
import { Component, OnInit } from '@angular/core';
import { Meta, Title } from '@angular/platform-browser';
import { DOCUMENT } from '@angular/common';
@Component({
/* ... */
})
export class MiPaginaComponent implements OnInit {
constructor(
private meta: Meta,
private title: Title,
@Inject(DOCUMENT) private doc: Document,
) {}
ngOnInit() {
this.title.setTitle('Título de la página | Sitio');
this.meta.updateTag({ name: 'description', content: 'Descripción de 150-160 chars' });
this.meta.updateTag({ property: 'og:title', content: 'Título OG' });
this.meta.updateTag({ property: 'og:description', content: 'Descripción OG' });
this.meta.updateTag({ property: 'og:image', content: 'https://tudominio.com/og.jpg' });
this.meta.updateTag({ name: 'twitter:card', content: 'summary_large_image' });
// Canonical
const link = this.doc.createElement('link');
link.setAttribute('rel', 'canonical');
link.setAttribute('href', 'https://tudominio.com/pagina/');
this.doc.head.appendChild(link);
// JSON-LD
const script = this.doc.createElement('script');
script.type = 'application/ld+json';
script.text = JSON.stringify({ '@context': 'https://schema.org', '@type': 'WebPage' });
this.doc.head.appendChild(script);
}
}⚠️ Importante en Angular: Sin SSR (Angular Universal) o SSG, los bots no ejecutan JavaScript y el SEO es nulo. Usar @angular/ssr es obligatorio para SEO real.
Nuxt.js 3
// En el composable o en la página
useHead({
title: 'Título de la página',
meta: [
{ name: 'description', content: 'Descripción 150-160 chars' },
{ property: 'og:title', content: 'Título OG' },
{ property: 'og:image', content: 'https://tudominio.com/og.jpg' },
],
link: [{ rel: 'canonical', href: 'https://tudominio.com/pagina/' }],
script: [
{
type: 'application/ld+json',
innerHTML: JSON.stringify({ '@context': 'https://schema.org', '@type': 'WebPage' }),
},
],
});
// O con useSeoMeta (Nuxt 3.x):
useSeoMeta({
title: 'Título',
description: 'Descripción',
ogTitle: 'Título OG',
ogImage: 'https://tudominio.com/og.jpg',
twitterCard: 'summary_large_image',
});HTML estático (sin framework)
Usar los bloques de código directamente de las secciones 1, 2 y 3 de esta guía.
Notas de uso del skill
- Siempre validar el JSON-LD generado en Rich Results Test antes de desplegarlo.
- No inventar datos: todos los valores de Schema.org deben corresponder a información real y verificable.
- Los tipos de Schema.org soportados para rich results varían. Consultar la galería de rich results de Google para la lista oficial actualizada.
- GEO es una disciplina emergente (2024-2025). Las mejores prácticas evolucionan rápido;
/llms.txtes una convención en adopción, no un estándar oficial a fecha de creación de este skill.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

