ZentimesESEN
Caso · cliente en producción

kenetg.com

Sitio oficial de un creador de contenido, construido y mantenido por mí, con la capa de GEO encima: grafo de entidad, superficie legible por máquinas y acceso libre para los crawlers de IA. Abajo están las cifras que he medido y, con el mismo tamaño de letra, lo que todavía no he medido.

Cliente
KenetG — creador de contenido (Twitch, League of Legends, VR)
Mi papel
Desarrollo, infraestructura, SEO técnico y GEO
Stack observable
Next.js (App Router) · CMS headless en host aparte · nginx · Google Cloud
Estado
En producción · implementación verificable · medición GEO pendiente

Contexto

01

KenetG es un creador de contenido en español: directo en Twitch, League of Legends, comunidad y sesiones de VR, y forma parte de la organización de esports Nocturne Gale. Como casi todos los creadores, su presencia vivía repartida entre plataformas de terceros —Twitch, YouTube, TikTok, Instagram, X, Discord— y ninguna de ellas es suya.

Eso tiene una consecuencia concreta para un motor de IA. Cuando alguien pregunta «quién es KenetG» o «dónde hace directo KenetG», el modelo necesita un origen propio, estable y verificable que citar. Un puñado de perfiles de plataforma no cumple: no declaran entidad, no se enlazan entre sí y el motor no tiene forma de saber que hablan del mismo sujeto.

El encargo fue construir y mantener ese origen: la web oficial como punto canónico de la marca, escrita para que una máquina la pueda leer, entender y citar, no solo para que la lea una persona.

Una restricción que conviene decir en voz alta desde el principio: cuando empezó el trabajo no existía una línea base de citación medida. Sin ese «antes», no se puede atribuir un «después». Es exactamente el motivo por el que el bloque 3 de esta página está vacío en vez de relleno.

Método

02

Lo que se implementó. Cada punto de esta lista es código en producción y se puede comprobar desde fuera; los comandos están en el bloque 5.

01

Grafo de entidad, no etiquetas sueltas

JSON-LD con Organization, WebSite y Person enlazados por @id y con sameAs hacia los 7 perfiles oficiales. El objetivo es que «KenetG en Twitch», «KenetG en TikTok» y «kenetg.com» sean el mismo nodo para el motor, y no tres desconocidos con el mismo nombre.

02

Una capa de tipo por página

Encima del grafo de entidad, cada página declara lo que es: WebPage, CollectionPage, ProfilePage, ContactPage, FAQPage o BlogPosting, con su BreadcrumbList. Un motor que extrae no tiene que adivinar si está leyendo un perfil, un índice o un artículo.

03

Preguntas y respuestas en formato extraíble

La página de preguntas frecuentes lleva FAQPage con 6 pares pregunta/respuesta en JSON-LD. Es el formato que un motor puede citar literalmente sin tener que interpretar la maquetación.

04

Superficie pensada para máquinas

llms.txt como índice curado de la marca (hechos, rutas principales, canales oficiales, blog) y llms-full.txt con el contenido volcado. Ambos se anuncian desde robots.txt y llevan sello de generación, así que no se quedan obsoletos en silencio.

05

Puerta abierta a los crawlers de IA

El robots.txt no contiene ni un solo Disallow global: solo cierra el panel de administración y la API interna. El fallo que más veo en auditorías —bloquear sin querer a GPTBot o PerplexityBot— aquí no ocurre.

06

Render en servidor y base técnica

Next.js con App Router: el contenido llega en el HTML, no detrás de JavaScript, que es la diferencia entre que un extractor te lea o no. Debajo, lo aburrido y necesario: canonical por página, sitemap con lastmod, 404 real, redirecciones http→https y www→dominio raíz, HTTP/2 y TLS 1.3.

Medición

03

Pendiente — lo define y lo ejecuta la capa GEO

Aquí es donde iría la única prueba que de verdad demuestra que el GEO ha funcionado: un panel de consultas reales re-ejecutado en los motores. Hoy no existe, así que este bloque está vacío a propósito. Prefiero una página con un hueco visible a una página con una cifra inventada.

Lo que tiene que ir aquí cuando el panel exista

  • El panel de consultas: el conjunto fijo de preguntas reales que alguien escribiría para llegar a esta marca, y por qué se eligieron esas.
  • Los motores en los que se ejecuta y la versión o fecha de corte de cada uno.
  • Las repeticiones por consulta: las respuestas de IA no son deterministas, así que una sola ejecución no es una medida, es una anécdota.
  • La tasa de citación: en cuántas de las respuestas objetivo aparece la marca, con qué cita y en qué posición.
  • La línea base y la fecha del corte anterior, para que el «antes y después» sea comparable y no un recuerdo.
  • Quién sale citado en el hueco cuando la marca no sale.

Qué se puede afirmar hoy y qué no

Hoy se puede afirmar: el trabajo está implementado y es verificable con los comandos de abajo. Hoy NO se puede afirmar: que la marca sea citada más a menudo por un motor de IA gracias a él. Esa frase solo se escribirá aquí cuando haya un panel detrás, con su fecha.

Resultado

04

Lo que sí está medido hoy: la implementación, comprobada desde fuera. Todas las cifras se tomaron el mismo día y cada una lleva su fecha y el modo de obtenerla.

Medido con curl desde una VM de Google Cloud en europe-west1, la misma región que el origen. Los tiempos son una cota inferior de red, no lo que ve un visitante desde su casa.

Superficie para máquinas

4.309 B

llms.txt servido (HTTP 200, text/plain)

54 líneas y 23 enlaces, en 7 secciones: hechos, principal, canales oficiales, blog, preguntas frecuentes, contenido completo y legal

5.455 B

llms-full.txt servido (HTTP 200, text/plain)

con sello «Generado desde https://kenetg.com/ el 2026-09-04»: se regenera, no es un fichero fósil

0

reglas Disallow globales en robots.txt

215 B; solo /admin/ y /api/ cerrados; declara el sitemap y anuncia los dos ficheros llms

12

URLs en sitemap.xml, las 12 con lastmod

2.252 B, application/xml; 11 páginas más 1 entrada de blog

Datos estructurados

12 de 12

páginas con JSON-LD válido

las 12 URLs del sitemap, descargadas y parseadas con json.loads una por una; ninguna falla al parsear

2

bloques JSON-LD en las 9 páginas de contenido

uno con el grafo de entidad, idéntico en las 12; otro específico de la página. Las 3 páginas legales llevan solo el primero

16

tipos de Schema.org distintos declarados

Organization, WebSite, Person, ImageObject, ContactPoint, WebPage, ProfilePage, CollectionPage, ContactPage, FAQPage, Question, Answer, BlogPosting, BreadcrumbList, ItemList y ListItem

7

perfiles oficiales enlazados con sameAs

declarados a la vez en el nodo Organization y en el nodo Person del grafo

6

pares pregunta/respuesta en FAQPage

contados sobre el JSON-LD de /faq/

8 de 12

páginas con BreadcrumbList

las 9 de contenido menos la portada, que es la raíz y no tiene ruta que declarar; las 3 legales tampoco lo llevan

Disponibilidad y rendimiento

17 de 17

endpoints responden HTTP 200

las 12 URLs del sitemap más robots.txt, sitemap.xml, llms.txt, llms-full.txt y el feed RSS

64,5 ms

TTFB mediano de la portada

5 muestras seguidas con curl: 62,1 · 64,5 · 62,6 · 66,1 · 66,5 ms

57–173 ms

rango de TTFB en los 16 endpoints

una muestra por endpoint; el más lento es /privacidad/

−83,3 %

peso del HTML de la portada con gzip

59.415 B sin comprimir frente a 9.940 B con Accept-Encoding: gzip

404

respuesta ante una URL inexistente

un 404 real, no un 200 blando que ensucia el índice

2 de 2

redirecciones canónicas correctas

http→https devuelve 301 y www→dominio raíz devuelve 301

Seguridad y stack

10

cabeceras de seguridad presentes

HSTS con preload, CSP, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy, COOP, CORP, X-Permitted-Cross-Domain-Policies y Origin-Agent-Cluster

TLS 1.3

transporte, sobre HTTP/2

cifrado TLS_AES_256_GCM_SHA384, certificado Let's Encrypt para kenetg.com

0

cabeceras X-Powered-By

no se emite ninguna. El stack tampoco se esconde y se lee en las cabeceras: server: nginx, el Vary con next-router-* (Next.js App Router) y las cookies de Auth.js. El CMS sí vive en un host aparte: /admin redirige 301 a admin.kenetg.com

2

enlaces hreflang por página, autorreferenciales

es y x-default apuntando a la propia URL, en las 12. El sitio es monolingüe (<html lang="es">), así que son redundantes, no incorrectos: no hay ninguna traducción que anunciar

Una cifra que NO aparece arriba: hoy el robots.txt no declara grupos propios para GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot o Google-Extended. Pasan por el comodín User-agent: *, así que hoy tienen acceso, pero nombrarlos uno a uno documenta la intención y protege de que un Disallow futuro los deje fuera por accidente. Es una mejora pendiente, y aparece aquí porque un caso que solo enseña lo que salió bien no es un caso, es un anuncio.

Validación

05

Nada de lo anterior hay que creérselo. Estos comandos se ejecutan en cualquier terminal y devuelven las mismas cifras del bloque 4 —o las que haya el día que los ejecutes, que para eso cada cifra lleva fecha—.

  1. curl -sI https://kenetg.com/ | grep -i -E 'strict-transport|content-security|x-frame'

    las cabeceras de seguridad, servidas en cada respuesta

  2. curl -s https://kenetg.com/robots.txt

    ningún Disallow global, el sitemap declarado y los dos ficheros llms anunciados

  3. curl -s https://kenetg.com/sitemap.xml | grep -c '<loc>'

    12

  4. curl -s https://kenetg.com/ | grep -c '<script type="application/ld+json">'

    2 — el grafo de entidad y la capa de la página

  5. curl -s -o /dev/null -w '%{http_code} %{time_starttransfer}s\n' https://kenetg.com/llms.txt

    200, y el tiempo que dé desde donde estés

  6. curl -s -o /dev/null -w '%{http_code}\n' https://kenetg.com/una-url-que-no-existe/

    404

Lo que falta en esta página, dicho sin rodeos

  • El panel de medición GEO del bloque 3: no existe todavía. Es el trabajo más importante que queda.
  • El testimonio del cliente: pendiente de que KenetG lo dé con sus propias palabras. Prefiero un hueco a una frase escrita por mí y firmada por otro.
  • Las capturas de las respuestas de IA: irán aquí cuando el panel se haya ejecutado y haya algo real que capturar.

Aprendizaje

06

La parte técnica del GEO es la fácil. Un grafo de entidad bien enlazado, un llms.txt curado, unos crawlers sin bloquear y un render en servidor son trabajo conocido: se implementa, se comprueba desde fuera y se acabó. Todo el bloque 4 de esta página se genera con curl en dos minutos.

La parte difícil es la otra: saber si sirvió de algo. Y ahí este caso llega con una deuda que asumo por escrito — se implementó antes de montar la medición, y sin línea base previa no hay forma honesta de atribuir un resultado. Se puede enseñar lo que se construyó; no se puede enseñar el efecto.

Así que el orden cambia para el siguiente. Primero el panel de consultas y su ejecución de referencia, con fecha; después el código. Cuesta una semana más al principio y es la diferencia entre un caso y un folleto.

Y de ahí sale la regla que gobierna esta página entera: «implementado y verificable» se puede escribir; «implementado y por eso funciona» no se escribe hasta que haya un panel detrás. Si alguien te vende GEO y no te sabe decir cómo va a medirlo, te está vendiendo la parte fácil al precio de la difícil.

¿Quieres el tuyo, con el bloque 3 relleno desde el principio?

Te hago una mini-auditoría gratis: unas cuantas consultas reales de tu sector, ejecutadas en vivo, para ver quién sale citado hoy y dónde eres invisible. Esa ejecución es tu línea base — y con ella el «antes y después» ya se puede medir.

Escríbeme

Ver el sitio del clienteEnlace canónico de este caso