{"id":87046,"date":"2026-05-19T14:36:33","date_gmt":"2026-05-19T19:36:33","guid":{"rendered":"https:\/\/niixer.com\/?p=87046"},"modified":"2026-05-19T15:23:14","modified_gmt":"2026-05-19T20:23:14","slug":"vibe-coding-disciplina-lemuseo","status":"publish","type":"post","link":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/","title":{"rendered":"Vibe Coding con Disciplina: c\u00f3mo construimos lemuSeo, una plataforma de auditor\u00eda SEO impulsada por IA"},"content":{"rendered":"\n<p>El desarrollo de software y el marketing digital est\u00e1n convergiendo en un punto sin precedentes. Hoy es posible construir una plataforma empresarial completa de auditor\u00eda SEO, anal\u00edtica e inteligencia competitiva guiando a una IA con instrucciones en lenguaje natural, sin un equipo de ingenier\u00eda tradicional.<\/p>\n\n\n\n<p>Esto es posible gracias al <strong>Vibe Coding<\/strong>, la metodolog\u00eda que est\u00e1 redefiniendo qui\u00e9n puede crear software y c\u00f3mo se hace. Sin embargo, en este proyecto adoptamos una variante propia: <strong>vibe coding gobernado por especificaciones<\/strong>. En lugar de generar c\u00f3digo a partir de prompts sueltos, cada feature pasa primero por un proceso de <strong><em>Spec-Driven Development<\/em> (SDD)<\/strong> que documenta el problema, la arquitectura y los criterios de aceptaci\u00f3n antes de que la IA escriba una sola l\u00ednea.<\/p>\n\n\n\n<p>El resultado es <strong>lemuSeo<\/strong>, una plataforma SaaS construida por un equipo de la Universidad Central que integra PageSpeed Insights, un motor propio de scraping con Playwright, 16 chequeos t\u00e9cnicos al estilo WooRank, simuladores deterministas de Google Search Console y Google Business Profile, an\u00e1lisis de sentimiento heur\u00edstico y un comparador competitivo multidominio \u2014 todo orquestado desde un dashboard unificado.<\/p>\n\n\n\n<p>Este art\u00edculo documenta qu\u00e9 es el Vibe Coding, por qu\u00e9 lo combinamos con SDD, qu\u00e9 herramientas usamos y c\u00f3mo se construy\u00f3 lemuSeo desde cero.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"386\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-222.png\" alt=\"\" class=\"wp-image-87092\" style=\"width:760px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-222.png 686w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-222-300x169.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u00bfQu\u00e9 es el Vibe Coding y por qu\u00e9 nos importa?<\/strong><\/h2>\n\n\n\n<p>El Vibe Coding es una metodolog\u00eda de desarrollo basada en la generaci\u00f3n autom\u00e1tica de c\u00f3digo mediante instrucciones en lenguaje natural. En lugar de escribir cada l\u00ednea, el usuario describe <strong>**qu\u00e9**<\/strong> quiere construir y un modelo de inteligencia artificial lo materializa.<\/p>\n\n\n\n<p>El t\u00e9rmino fue acu\u00f1ado en febrero de 2025 por Andrej Karpathy, cofundador de OpenAI y exdirector de IA en Tesla (Karpathy, 2025). En noviembre de 2025, el Diccionario Collins lo eligi\u00f3 como palabra del a\u00f1o, reconociendo su impacto cultural y tecnol\u00f3gico (Collins Dictionary, 2025). Su frase fundacional resume la l\u00f3gica: <em>*\u201cNo es realmente programar; simplemente veo cosas, digo cosas, ejecuto cosas y copio cosas\u201d*<\/em> (Karpathy, 2025).<\/p>\n\n\n\n<p>En este enfoque, el rol del creador cambia radicalmente. Ya no es necesario dominar React, TypeScript o Go: la funci\u00f3n principal del operador humano es <strong>guiar, describir y refinar<\/strong> los resultados que produce la IA.<\/p>\n\n\n\n<p>Su relevancia se entiende en tres dimensiones:<\/p>\n\n\n\n<p>&#8211; <strong>Democratizaci\u00f3n del software.<\/strong> Profesionales de marketing, comunicaci\u00f3n y administraci\u00f3n pueden transformar ideas en productos digitales funcionales sin depender de un equipo de desarrollo.<\/p>\n\n\n\n<p>&#8211; <strong>Aceleraci\u00f3n del ciclo de creaci\u00f3n.<\/strong> Lo que antes tomaba semanas de planificaci\u00f3n t\u00e9cnica puede generarse, probarse y refinarse en horas.<\/p>\n\n\n\n<p>&#8211; <strong>Cambio de paradigma.<\/strong> El Vibe Coding no solo cambia <em>*c\u00f3mo*<\/em> se hace el software; tambi\u00e9n cambia <em>*qui\u00e9n*<\/em> puede hacerlo.<\/p>\n\n\n\n<p>Seg\u00fan Y Combinator, en marzo de 2025 el 25 % de sus startups ya ten\u00eda bases de c\u00f3digo generadas casi por completo mediante IA. Garry Tan, CEO de la aceleradora, afirm\u00f3 que diez ingenieros pueden realizar hoy el trabajo que antes requer\u00eda equipos de hasta cien personas (Tan, 2025).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nuestro giro: Vibe Coding + Spec-Driven Development<\/strong><\/h2>\n\n\n\n<p>Construir lemuSeo no es lo mismo que construir un MVP descartable. Hay un contrato de datos entre el frontend y el motor de scraping, hay decisiones de arquitectura que afectan el costo de hosting, y hay vulnerabilidades de seguridad que un MVP improvisado suele dejar abiertas (SSRF en el endpoint de scraping es un caso paradigm\u00e1tico).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u00bfQu\u00e9 es OpenSpec?<\/strong><\/h3>\n\n\n\n<p><strong>OpenSpec<\/strong> es un sistema abierto de <em>Spec-Driven Development<\/em> dise\u00f1ado para trabajar con agentes de IA generadores de c\u00f3digo (Claude Code, Cursor, Copilot, Gemini, etc.). Funciona como una capa de control sobre el repositorio: cada cambio significativo se modela como un <em>*change*<\/em> con tres artefactos m\u00ednimos \u2014`proposal.md` (qu\u00e9 y por qu\u00e9), `design.md` (c\u00f3mo) y `tasks.md` (pasos verificables)\u2014 que se validan antes de tocar c\u00f3digo y se archivan en `openspec\/specs\/` cuando se cierran. La spec resultante se vuelve la fuente de verdad sobre el comportamiento observable del sistema.<\/p>\n\n\n\n<p>Para una IA, OpenSpec resuelve un problema concreto: el modelo nunca tiene que <strong>adivinar<\/strong> qu\u00e9 deber\u00eda hacer el sistema. La spec se le pasa como contexto verificable y el c\u00f3digo generado se contrasta contra ella. Para el equipo humano, OpenSpec resuelve otro problema: cada decisi\u00f3n arquitect\u00f3nica queda trazable, fechada y revisable como un commit m\u00e1s del repo.<\/p>\n\n\n\n<p>El flujo en lemuSeo es:<\/p>\n\n\n\n<p>1. Una <em>spec<\/em> describe el contrato observable del sistema (`openspec\/specs\/audit-contract\/spec.md`).<\/p>\n\n\n\n<p>2. Un <em>change<\/em> propone una modificaci\u00f3n: `proposal.md` (qu\u00e9 y por qu\u00e9), `design.md` (c\u00f3mo), `tasks.md` (pasos verificables).<\/p>\n\n\n\n<p>3. Reci\u00e9n entonces la IA genera el c\u00f3digo, contra ese contrato.<\/p>\n\n\n\n<p>4. Al archivar el change, la spec queda actualizada y el cambio queda trazable.<\/p>\n\n\n\n<p>Esto soluciona el problema central del Vibe Coding puro: el c\u00f3digo generado por IA puede ser dif\u00edcil de mantener si no hay una fuente de verdad sobre <strong>qu\u00e9 deber\u00eda hacer<\/strong> el sistema. Con SDD esa fuente de verdad existe y vive en el repositorio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Ventajas del enfoque<\/strong><\/h3>\n\n\n\n<p>&#8211; <strong>Velocidad de prototipado real.<\/strong> La arquitectura completa de lemuSeo \u2014 autenticaci\u00f3n con Clerk, dashboard internacionalizado, motor de scraping en Go, m\u00f3dulos SEO y comparador competitivo \u2014 se gener\u00f3 en una fracci\u00f3n del tiempo que hubiera requerido un equipo tradicional.<\/p>\n\n\n\n<p>&#8211; <strong>Accesibilidad t\u00e9cnica.<\/strong> Ning\u00fan integrante del equipo necesit\u00f3 dominar Next.js 15, TypeScript, Tailwind o Go\/Fiber para obtener un resultado de nivel profesional. El conocimiento del negocio fue suficiente para guiar a la IA.<\/p>\n\n\n\n<p>&#8211; <strong>Iteraci\u00f3n sin fricci\u00f3n.<\/strong> Cuando un m\u00f3dulo no se comportaba como se esperaba, en lugar de depurar c\u00f3digo se ajustaba el prompt o se refinaba la spec.<\/p>\n\n\n\n<p>&#8211; <strong>Trazabilidad auditable.<\/strong> Cada feature tiene su propio change archivado (`web-foundation`, `ui-foundation`, `woorank-checker`, `gsc-simulator`, `competitor-compare`) con proposal, design y tasks.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Desventajas que asumimos<\/strong><\/h3>\n\n\n\n<p>&#8211; <strong>Calidad y mantenibilidad del c\u00f3digo.<\/strong> El c\u00f3digo generado por IA requiere revisi\u00f3n t\u00e9cnica posterior. Por eso incorporamos una capa de auditor\u00eda OWASP (m\u00e1s sobre esto al final del art\u00edculo).<\/p>\n\n\n\n<p>&#8211; <strong>Vulnerabilidades de seguridad.<\/strong> La rapidez puede llevar a omitir controles cr\u00edticos. Aceptar c\u00f3digo sin revisi\u00f3n expone datos sensibles, y nuestro endpoint de scraping es un blanco SSRF natural si no se valida la URL de entrada.<\/p>\n\n\n\n<p>&#8211; <strong>Limitaciones en l\u00f3gica compleja.<\/strong> El Vibe Coding es muy efectivo para prototipos, MVPs y plataformas de gesti\u00f3n. Sistemas con l\u00f3gica de negocio profunda a\u00fan requieren supervisi\u00f3n t\u00e9cnica.<\/p>\n\n\n\n<p>&#8211; <strong>Dependencia del modelo de IA.<\/strong> Los resultados dependen directamente del modelo utilizado y de su disponibilidad.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"663\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-223-1024x663.png\" alt=\"\" class=\"wp-image-87094\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-223-1024x663.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-223-300x194.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-223-768x498.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-223.png 1068w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>El ecosistema de herramientas<\/strong><\/h2>\n\n\n\n<p>El ecosistema de Vibe Coding en 2025-2026 se organiza por perfil de usuario y tipo de proyecto.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Plataformas full-stack (sin c\u00f3digo o bajo c\u00f3digo)<\/strong><\/h3>\n\n\n\n<p>Ideales para construir aplicaciones completas desde cero usando prompts en lenguaje natural:<\/p>\n\n\n\n<p>&#8211; <strong>Lovable.dev.<\/strong> Una de las m\u00e1s amigables para perfiles no t\u00e9cnicos. Permite construir y desplegar aplicaciones completas, conectar repositorios de GitHub y trabajar con bases de datos mediante Supabase. En 2025 alcanz\u00f3 una valoraci\u00f3n de 6.600 millones de d\u00f3lares (Lovable, 2025).<\/p>\n\n\n\n<p>&#8211; <strong>Bolt.new.<\/strong> Creada por StackBlitz, permite importar dise\u00f1os de Figma y convertirlos directamente en c\u00f3digo. Incluye un IDE en el navegador e integraci\u00f3n con GitHub y Supabase.<\/p>\n\n\n\n<p>&#8211; <strong>Replit.<\/strong> Combina entorno de desarrollo y despliegue en una sola interfaz. Ideal para aplicaciones funcionales con persistencia de datos listas para producci\u00f3n.<\/p>\n\n\n\n<p>&#8211; <strong>Vercel v0.<\/strong> Evolucion\u00f3 de generador de UI a plataforma completa de desarrollo frontend, con foco en calidad del c\u00f3digo y modo de dise\u00f1o visual.<\/p>\n\n\n\n<p><strong>Editores de c\u00f3digo con IA (para perfiles t\u00e9cnicos)<\/strong><\/p>\n\n\n\n<p>&#8211; <strong>Cursor.<\/strong> Uno de los pioneros, con m\u00e1s de un mill\u00f3n de usuarios en 2025 (Anysphere, 2025). Permite cambios directos en archivos del proyecto con soporte para servidores MCP.<\/p>\n\n\n\n<p>&#8211; <strong>Windsurf.<\/strong> Fork de VS Code con experiencia de usuario optimizada y previsualizaci\u00f3n integrada.<\/p>\n\n\n\n<p>&#8211; <strong>GitHub Copilot.<\/strong> Integrado en Visual Studio Code y JetBrains, ofrece sugerencias contextuales, chat conversacional y modo agente para tareas multi-paso.<\/p>\n\n\n\n<p>&#8211; <strong>Claude Code.<\/strong> Herramienta CLI de Anthropic. Lee y comprende la base de c\u00f3digo completa al inicio de cada sesi\u00f3n y puede modificar docenas de archivos simult\u00e1neamente.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Las herramientas que efectivamente usamos en lemuSeo<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Herramienta<\/strong><\/td><td><strong>Rol en el proyecto<\/strong><\/td><\/tr><tr><td><strong>Vercel<\/strong><\/td><td>Despliegue serverless del dashboard Next.js<\/td><\/tr><tr><td><strong>Render \/ Railway<\/strong><\/td><td>Despliegue del scraper Go en contenedor con Chromium<\/td><\/tr><tr><td><strong>Claude Code<\/strong><\/td><td>Generaci\u00f3n y refactor del c\u00f3digo del monorepo, con orquestaci\u00f3n SDD<\/td><\/tr><tr><td><strong>OpenSpec<\/strong><\/td><td>Gobernanza spec-first: proposal, design, tasks por cada feature<\/td><\/tr><tr><td><strong>Supabase (MCP)<\/strong><\/td><td>Persistencia, autenticaci\u00f3n y RLS para snapshots de auditor\u00eda<\/td><\/tr><tr><td><strong>Clerk<\/strong><\/td><td>Autenticaci\u00f3n OAuth (Google, Microsoft) y gesti\u00f3n de sesiones<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>La decisi\u00f3n de usar SDD encima del Vibe Coding nos oblig\u00f3 a invertir tiempo en proposals y designs antes de tocar c\u00f3digo. A cambio, los seis cambios archivados hasta hoy tienen contratos verificables y se integraron sin retrabajos significativos.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>La arquitectura: dos agentes, un contrato<\/strong><\/h2>\n\n\n\n<p>lemuSeo es un <strong>monorepo h\u00edbrido<\/strong> con dos servicios que se comunican por un contrato HTTP versionado:<\/p>\n\n\n\n<p>&#8220;`<\/p>\n\n\n\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/p>\n\n\n\n<p>\u2502 dashboard-web (Next.js 15 App Router + Supabase + Clerk) \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 Orquesta requests \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 Llama PageSpeed Insights API (p\u00fablico, server-side) \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 Llama scraper-api (POST \/api\/audit) \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 Persiste hist\u00f3rico en Supabase (seo_snapshots) \u2502<\/p>\n\n\n\n<p>\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n\n\n\n<p>\u2502 \u2502<\/p>\n\n\n\n<p>\u25bc \u25bc<\/p>\n\n\n\n<p>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/p>\n\n\n\n<p>\u2502 Google PageSpeed API \u2502 \u2502 scraper-api (Go + Fiber) \u2502<\/p>\n\n\n\n<p>\u2502 (p\u00fablico, free tier) \u2502 \u2502 \u2500 Playwright headless \u2502<\/p>\n\n\n\n<p>\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2500 16 chequeos WooRank \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 GTM\/GA4\/Ads sniffer \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 Densidad de keywords \u2502<\/p>\n\n\n\n<p>\u2502 \u2500 Sentimiento heur\u00edstico \u2502<\/p>\n\n\n\n<p>\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n\n\n\n<p>&#8220;`<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Una decisi\u00f3n consciente: sin Service Accounts de Google<\/strong><\/h3>\n\n\n\n<p>Las plataformas comerciales se apoyan en cuentas de servicio para hablar con las APIs privadas de GA4, Google Ads o Google Business Profile. Esa ruta tiene fricciones operativas y, en contextos acad\u00e9micos, suele estar bloqueada. Por eso elegimos un camino distinto:<\/p>\n\n\n\n<p>&#8211; <strong>PageSpeed Insights<\/strong> lo consumimos con su endpoint p\u00fablico (no requiere autenticaci\u00f3n).<\/p>\n\n\n\n<p>&#8211; <strong>GTM, GA4 y Google Ads<\/strong> los detectamos por <em>sniffing<\/em> del HTML renderizado por Playwright, sin tocar APIs privadas.<\/p>\n\n\n\n<p>&#8211; <strong>Google Search Console y Google Business Profile<\/strong> los <strong>simulamos de forma determinista<\/strong> a partir de un PRNG sembrado con el dominio. Los datos no son reales, pero son consistentes entre sesiones y \u00fatiles para demostrar el flujo de UX y reporter\u00eda.<\/p>\n\n\n\n<p>Esta decisi\u00f3n est\u00e1 documentada en `AGENTS.md` y es probablemente el diferenciador m\u00e1s honesto del proyecto frente a otras plataformas que prometen integraciones que en la pr\u00e1ctica nunca se autorizan.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"562\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-niit-1024x562.png\" alt=\"\" class=\"wp-image-87106\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-niit-1024x562.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-niit-300x165.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-niit-768x422.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-niit-1536x843.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-niit-2048x1125.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Los m\u00f3dulos de lemuSeo en detalle<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Auditor\u00eda on-page con scraping real<\/strong><\/h3>\n\n\n\n<p>El coraz\u00f3n funcional del producto. El usuario ingresa una URL y `scraper-api` ejecuta:<\/p>\n\n\n\n<p>&#8211; <strong>Renderizado headless<\/strong> con Playwright (necesario para SPAs y para detectar scripts inyectados en runtime).<\/p>\n\n\n\n<p>&#8211; <strong>Extracci\u00f3n on-page<\/strong>: t\u00edtulo, meta description, jerarqu\u00eda H1-H6, cobertura de atributos `alt` en im\u00e1genes, longitud de contenido.<\/p>\n\n\n\n<p>&#8211; <strong>Detecci\u00f3n de tracking<\/strong>: GTM, GA4 y Google Ads identificados por sus IDs en el DOM renderizado y en el `dataLayer`.<\/p>\n\n\n\n<p>&#8211; <strong>Densidad de keywords<\/strong>: c\u00e1lculo de los t\u00e9rminos m\u00e1s relevantes con sus frecuencias relativas.<\/p>\n\n\n\n<p>&#8211; <strong>An\u00e1lisis de sentimiento<\/strong>: clasificaci\u00f3n ternaria (positivo \/ neutral \/ negativo) mediante heur\u00edstica local determinista \u2014 sin LLMs, sin costos por consulta, sin variabilidad entre ejecuciones.<\/p>\n\n\n\n<p>El resultado se devuelve como un JSON con un contrato fijo (`audit-contract` v0.2.0) y se persiste en la tabla `seo_snapshots` de Supabase.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>16 chequeos t\u00e9cnicos al estilo WooRank<\/strong><\/h3>\n\n\n\n<p>El change `woorank-checker` agreg\u00f3 un m\u00f3dulo de auditor\u00eda t\u00e9cnica con 16 chequeos agrupados por categor\u00eda:<\/p>\n\n\n\n<p>&#8211; <strong>Contenido<\/strong>: presencia y largo de title, meta description, H1, ratio texto\/HTML.<\/p>\n\n\n\n<p>&#8211; <strong>Mobile-friendly<\/strong>: viewport meta, fuentes legibles, ausencia de Flash.<\/p>\n\n\n\n<p>&#8211; <strong>Tecnolog\u00eda<\/strong>: detecci\u00f3n de HTTPS, HSTS, compresi\u00f3n, <em>favicon<\/em>.<\/p>\n\n\n\n<p>&#8211; <strong>Indexaci\u00f3n<\/strong>: robots.txt, sitemap.xml, canonical, Open Graph.<\/p>\n\n\n\n<p>Cada chequeo aporta a un <strong>score agregado 0-100<\/strong>, presentado en la UI con un <em>ring<\/em> SVG por categor\u00eda dentro de la pesta\u00f1a \u201cWooRank\u201d en `\/audit\/[snapshotId]`. La l\u00f3gica de scoring vive en Go con tests unitarios (`woorank_test.go`, `sentiment_test.go`, `tracking_test.go`), lo cual es relevante: a pesar de haberse generado con asistencia de IA, el c\u00f3digo est\u00e1 cubierto por tests reproducibles.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Search Console simulado, pero coherente<\/strong><\/h3>\n\n\n\n<p>El change `gsc-simulator` resuelve un problema concreto: no podemos conectarnos al GSC del usuario sin Service Accounts. La soluci\u00f3n fue construir un simulador con cinco rutas (`\/gsc\/performance`, `\/gsc\/pages`, `\/gsc\/queries`, `\/gsc\/devices`, `\/gsc\/countries`) y un generador determinista basado en un PRNG sembrado por dominio.<\/p>\n\n\n\n<p>\u00bfPor qu\u00e9 importa esto? Porque los datos son <strong>estables<\/strong>: el dominio `niixer.com` siempre arroja la misma serie temporal de clics e impresiones, lo que permite demostrar el flujo de UX y reporter\u00eda sin invertir en datos sint\u00e9ticos aleatorios que confundir\u00edan al usuario. Las propiedades disponibles son las que ya est\u00e9n en `seo_snapshots`, as\u00ed que GSC se siente como una extensi\u00f3n natural del flujo de auditor\u00eda.<\/p>\n\n\n\n<p>La visualizaci\u00f3n usa SVG nativo: series de tiempo con tooltips, donuts por dispositivo y mapas de calor por pa\u00eds. Cero dependencias de librer\u00edas de gr\u00e1ficos pesadas.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Comparador competitivo on-demand<\/strong><\/h3>\n\n\n\n<p>El change `competitor-compare` permite auditar hasta cuatro dominios simult\u00e1neamente reutilizando `runFullAudit`. Los resultados se muestran en:<\/p>\n\n\n\n<p>&#8211; <strong>Tabla con heatmap<\/strong> por m\u00e9trica, con codificaci\u00f3n de color por percentil.<\/p>\n\n\n\n<p>&#8211; <strong>Radar SVG de seis ejes<\/strong> que cruza Title Quality, Meta Quality, H1, Alt Coverage, WooRank Score y Sentiment Polarity.<\/p>\n\n\n\n<p>&#8211; <strong>Keyword gap<\/strong>: lista de t\u00e9rminos en los que un competidor aparece y el dominio propio no, ordenados por densidad.<\/p>\n\n\n\n<p>Este m\u00f3dulo <strong>no persiste datos<\/strong>: es on-demand, ideal para an\u00e1lisis ad-hoc sin contaminar el hist\u00f3rico del usuario.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dashboard con i18n y theming<\/strong><\/h3>\n\n\n\n<p>El change `web-foundation` estableci\u00f3 las bases del frontend:<\/p>\n\n\n\n<p>&#8211; <strong>Next.js 15 App Router<\/strong> con segmentaci\u00f3n `[locale]\/(auth)` y `[locale]\/(protected)`.<\/p>\n\n\n\n<p>&#8211; <strong>next-intl<\/strong> para internacionalizaci\u00f3n con archivos de mensajes versionados.<\/p>\n\n\n\n<p>&#8211; <strong>next-themes<\/strong> para modo claro\/oscuro persistente.<\/p>\n\n\n\n<p>&#8211; <strong>Sitemap, robots y manifest<\/strong> generados din\u00e1micamente.<\/p>\n\n\n\n<p>&#8211; <strong>Metadatos SEO<\/strong> con tests unitarios (`metadata.test.ts`) \u2014 s\u00ed, hicimos SEO de la plataforma de SEO.<\/p>\n\n\n\n<p>El change `ui-foundation` consolid\u00f3 la capa visual con <strong>16 primitivos de Shadcn\/ui<\/strong>, <strong>lucide-react<\/strong>, <strong>sonner<\/strong> para toasts y <strong>react-hook-form + zod<\/strong> para formularios validados. El `ThemeToggle` y el `LocaleSwitcher` se migraron a `ToggleGroup` para coherencia visual.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>C\u00f3mo se construy\u00f3: el flujo SDD real<\/strong><\/h2>\n\n\n\n<p>A diferencia de un proyecto puro de Vibe Coding, cada feature de lemuSeo pas\u00f3 por seis fases formales:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Fase<\/strong><\/td><td><strong>Comando<\/strong><\/td><td><strong>Artefacto<\/strong><\/td><\/tr><tr><td>Iniciar feature<\/td><td>`\/sdd-init &lt;feature>` <\/td><td>`openspec\/changes\/&lt;feature>\/`<\/td><\/tr><tr><td>Product spec<\/td><td>`\/sdd-prd &lt;feature>`<\/td><td>`proposal.md` <\/td><\/tr><tr><td>Arquitectura<\/td><td>`\/sdd-arch &lt;feature>` <\/td><td>design.md`<\/td><\/tr><tr><td>Plan de tareas<\/td><td>`\/sdd-plan &lt;feature>`<\/td><td> `tasks.md` <\/td><\/tr><tr><td>Review<\/td><td>`\/sdd-review &lt;feature>`\u00a0<\/td><td>`validate` + archive<\/td><\/tr><tr><td>Estado<\/td><td>`\/sdd-status &lt;feature>`<\/td><td>`openspec list` <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Regla dura del proyecto<\/strong>: ning\u00fan pull request de feature se mergea sin su `openspec\/changes\/&lt;feature>\/` archivado en `openspec\/specs\/`.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"552\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-226-1024x552.png\" alt=\"\" class=\"wp-image-87115\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-226-1024x552.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-226-300x162.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-226-768x414.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-226-1536x828.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/image-226.png 1888w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Estructura de los prompts utilizados<\/strong><\/h3>\n\n\n\n<p>Los prompts en este proyecto siguieron una estructura de cinco elementos consistente con las mejores pr\u00e1cticas del Vibe Coding profesional:<\/p>\n\n\n\n<p>1. <strong>Contexto del producto.<\/strong> Descripci\u00f3n del tipo de plataforma, su prop\u00f3sito y el perfil del operador.<\/p>\n\n\n\n<p>2. <strong>Stack tecnol\u00f3gico.<\/strong> Especificaci\u00f3n expl\u00edcita: Next.js 15 App Router, TypeScript estricto, Tailwind, Shadcn\/ui, Supabase, Go 1.23 + Fiber + Playwright.<\/p>\n\n\n\n<p>3. <strong>Contrato a respetar.<\/strong> El JSON de respuesta del scraper, definido en `audit-contract\/spec.md`, es citado en cada prompt que toca esa interfaz.<\/p>\n\n\n\n<p>4. <strong>M\u00f3dulos requeridos.<\/strong> Lista numerada y detallada de funcionalidades.<\/p>\n\n\n\n<p>5. <strong>Arquitectura de carpetas.<\/strong> Estructura de directorios esperada para garantizar modularidad.<\/p>\n\n\n\n<p>La diferencia con un flujo de Vibe Coding cl\u00e1sico es el paso 3: el contrato. Al referenciar expl\u00edcitamente la spec, la IA genera c\u00f3digo que respeta el contrato observable del sistema, lo que reduce dr\u00e1sticamente los desajustes entre frontend y backend.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Lecciones del proceso<\/strong><\/h2>\n\n\n\n<p>El caso de lemuSeo deja varias lecciones operativas para equipos que quieran construir plataformas empresariales con Vibe Coding:<\/p>\n\n\n\n<p>1. <strong>El conocimiento del dominio pesa m\u00e1s que el conocimiento t\u00e9cnico.<\/strong> El equipo no necesit\u00f3 saber programar para definir una arquitectura <em>*enterprise*<\/em>. S\u00ed necesit\u00f3 saber qu\u00e9 m\u00e9tricas necesita un equipo de marketing digital, qu\u00e9 chequeos hace un especialista SEO al revisar un sitio, y qu\u00e9 decisiones puede tomar un CMO mirando un dashboard.<\/p>\n\n\n\n<p>2. <strong>El prompt es solo el principio: la spec es la garant\u00eda.<\/strong> Los prompts producen c\u00f3digo; las specs producen sistemas. Sin SDD, el c\u00f3digo generado se vuelve dif\u00edcil de mantener apenas crece.<\/p>\n\n\n\n<p>3. <strong>Honestidad sobre lo que es real y lo que es simulado.<\/strong> Diferenciar PageSpeed real, scraping real, y simuladores deterministas es lo que separa una demo de un producto cre\u00edble.<\/p>\n\n\n\n<p>4. <strong>La seguridad no es opcional, aunque la IA tienda a omitirla.<\/strong> Por eso incorporamos una capa de auditor\u00eda OWASP propia.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Capa de seguridad: auditor\u00eda OWASP integrada en el flujo de desarrollo<\/strong><\/h2>\n\n\n\n<p>Una de las desventajas conocidas del Vibe Coding es que el c\u00f3digo generado puede omitir controles de seguridad cr\u00edticos. En una plataforma que recibe URLs arbitrarias del usuario y las navega con un navegador headless, eso es un riesgo concreto: <strong>Server-Side Request Forgery<\/strong> (SSRF) hacia recursos internos, <em>secrets<\/em> hardcoded en componentes cliente, <em>*verbose errors*<\/em> que filtran rutas internas, XSS en contenido scrapeado que se reinyecta en el dashboard.<\/p>\n\n\n\n<p>Para mitigar esto, el repositorio incluye una <em>skill<\/em> personalizada llamada `reviewer-owasp` que ejecuta una auditor\u00eda est\u00e1tica siguiendo la <strong>metodolog\u00eda de seis fases de identificaci\u00f3n de vulnerabilidades<\/strong> (reconocimiento, escaneo y enumeraci\u00f3n, escaneo automatizado, an\u00e1lisis manual, validaci\u00f3n con PoC conceptual, informe priorizado por CVSS) propuesta por la Facultad de Ingenier\u00eda y Ciencias B\u00e1sicas de la Universidad Central (Universidad Central, s.f.).<\/p>\n\n\n\n<p>La skill cruza esa taxonom\u00eda acad\u00e9mica con el OWASP Top 10 (OWASP Foundation, 2021) y los identificadores CWE de MITRE (MITRE Corporation, 2024), genera un reporte markdown priorizado por puntaje CVSS v3.1 (FIRST, 2019) y pregunta expl\u00edcitamente al desarrollador si desea remediar los hallazgos antes de tocar una sola l\u00ednea de c\u00f3digo. Es una pieza peque\u00f1a pero clave: convierte la auditor\u00eda de seguridad en parte del flujo cotidiano y no en un evento que se hace \u201ccuando hay tiempo\u201d.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusi\u00f3n<\/strong><\/h2>\n\n\n\n<p>lemuSeo demuestra que el Vibe Coding es viable para construir plataformas empresariales reales, <strong>siempre que se combine con una capa de gobernanza<\/strong>. Para nosotros esa capa fue SDD\/OpenSpec, pero la lecci\u00f3n de fondo es m\u00e1s general: las IAs son excelentes generando c\u00f3digo, mediocres definiendo qu\u00e9 deber\u00eda hacer ese c\u00f3digo, y francamente malas sosteniendo coherencia arquitect\u00f3nica a lo largo del tiempo. Esos tres roles los tiene que poner el humano.<\/p>\n\n\n\n<p>El equipo que construy\u00f3 la plataforma no necesit\u00f3 dominar React, Tailwind, TypeScript ni Go. Lo que s\u00ed necesit\u00f3 fue saber qu\u00e9 problema estaba resolviendo, c\u00f3mo se ver\u00eda una soluci\u00f3n correcta y c\u00f3mo verificar que la IA estaba produciendo lo correcto. Esa es, en \u00faltima instancia, la habilidad que el Vibe Coding est\u00e1 convirtiendo en la m\u00e1s valiosa.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"\u00bfQu\u00e9 es esto del Harness Engineering?\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/q9Vaoz0hd0U?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Profundizar en el c\u00f3digo: el repositorio est\u00e1 abierto<\/strong><\/h2>\n\n\n\n<p>Este art\u00edculo cubre las decisiones de dise\u00f1o y la metodolog\u00eda, pero el detalle t\u00e9cnico fino \u2014cada chequeo WooRank, el contrato exacto del scraper, el c\u00f3digo del simulador determinista de GSC, los tests de sentimiento\u2014 vive en el repositorio p\u00fablico:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\" type=\"link\" id=\"https:\/\/github.com\/bue221\/seo-tool-universidad\">https:\/\/github.com\/bue221\/seo-tool-universidad<\/a><\/p>\n\n\n\n<p>Quien quiera entender c\u00f3mo se construy\u00f3 lemuSeo a fondo puede empezar por estos puntos de entrada:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/blob\/main\/AGENTS.md\">AGENTS.MD<\/a> &#8212; Arquitectura de agentes, contrato HTTP entre `dashboard-web` y `scraper-api`, decisiones clave (por qu\u00e9 sin Service Accounts de Google, por qu\u00e9 Playwright en vez de colly, por qu\u00e9 sentimiento heur\u00edstico en vez de LLM).<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/tree\/main\/openspec\/specs\/audit-contract\">openspec\/specs\/audit-contract\/spec.md<\/a> \u2014 Contrato de datos v0.2.0 entre frontend y scraper. Fuente de verdad de la API.<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/tree\/main\/openspec\/specs\/dashboard-web\">openspec\/specs\/dashboard-web\/spec.md<\/a> \u2014 Spec actual del dashboard (v0.7.0), con todos los m\u00f3dulos UI y sus capacidades observables.<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/tree\/main\/openspec\/changes\/archive\">openspec\/changes\/archive\/<\/a> \u2014 <strong>La historia completa del producto en specs.<\/strong> Cada subcarpeta es un cambio archivado con su `proposal.md`, `design.md` y `tasks.md`. Leerlas en orden cronol\u00f3gico es leer c\u00f3mo evolucion\u00f3 lemuSeo decisi\u00f3n por decisi\u00f3n:<\/p>\n\n\n\n<p>&#8211; `web-foundation` \u2014 i18n, theming, SEO de la propia plataforma.<\/p>\n\n\n\n<p>&#8211; `ui-foundation` \u2014 16 primitivos Shadcn\/ui + lucide + sonner.<\/p>\n\n\n\n<p>&#8211; `woorank-checker` \u2014 los 16 chequeos t\u00e9cnicos + tests en Go.<\/p>\n\n\n\n<p>&#8211; `gsc-simulator` \u2014 el simulador determinista con PRNG sembrado por dominio.<\/p>\n\n\n\n<p>&#8211; `competitor-compare` \u2014 el comparador multi-dominio con radar SVG.<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/tree\/main\/scraper-api\/internal\/audit\">scraper-api\/internal\/audit\/<\/a> \u2014 N\u00facleo del motor: `onpage.go`, `tracking.go`, `keywords.go`, `sentiment.go`, `woorank.go`, con sus tests respectivos.<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/tree\/main\/dashboard-web\/src\/lib\">dashboard-web\/src\/lib\/<\/a> \u2014 Capa de orquestaci\u00f3n: cliente del scraper, PageSpeed Insights, integraci\u00f3n Supabase, generador del simulador GSC.<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\/tree\/main\/.claude\/skills\/reviewer-owasp\">.claude\/skills\/reviewer-owasp\/ <\/a>\u2014 La skill de auditor\u00eda OWASP descrita en este art\u00edculo, con su checklist completo de patrones de detecci\u00f3n.<\/p>\n\n\n\n<p>Leer un repositorio bien gobernado por specs es, en muchos sentidos, m\u00e1s instructivo que leer la documentaci\u00f3n: las specs cuentan <strong>por qu\u00e9<\/strong> se tom\u00f3 cada decisi\u00f3n, los commits cuentan <strong>c\u00f3mo<\/strong> se materializ\u00f3, y los tests cuentan <strong>qu\u00e9<\/strong> se considera correcto. Todo eso es p\u00fablico.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Recursos t\u00e9cnicos del proyecto<\/strong><\/p>\n\n\n\n<p>&#8211; Repositorio p\u00fablico: <a href=\"https:\/\/github.com\/bue221\/seo-tool-universidad\">https:\/\/github.com\/bue221\/seo-tool-universidad<\/a><\/p>\n\n\n\n<p>&#8211; Specs activas: `openspec\/specs\/audit-contract`, `openspec\/specs\/dashboard-web`<\/p>\n\n\n\n<p>&#8211; Changes archivados: `web-foundation`, `ui-foundation`, `woorank-checker`, `gsc-simulator`, `competitor-compare`<\/p>\n\n\n\n<p>&#8211; Skill de seguridad: `.claude\/skills\/reviewer-owasp`<\/p>\n\n\n\n<p>&#8211; Contrato de datos: `audit-contract` v0.2.0<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9ditos:<\/h3>\n\n\n\n<p><strong>Autores:<\/strong> <a href=\"https:\/\/niixer.com\/?s=Omar+Daniel+Gait%C3%A1n+Porras\">Omar Daniel Gait\u00e1n Porras<\/a>, <a href=\"https:\/\/niixer.com\/?s=Andr%C3%A9s+Camilo+Plaza+Jim%C3%A9nez\">Andr\u00e9s Camilo Plaza Jim\u00e9nez<\/a>, <a href=\"https:\/\/niixer.com\/?s=Kevin+Camilo+Lozano+Castellanos\">Kevin Camilo Lozano Castellanos<\/a> <\/p>\n\n\n\n<p><strong>Editor:<\/strong> <a href=\"https:\/\/niixer.com\/?s=Carlos+Iv%C3%A1n+Pinz%C3%B3n+Romero\">Carlos Iv\u00e1n Pinz\u00f3n Romero<\/a><\/p>\n\n\n\n<p><strong>C\u00f3digo:<\/strong> <a href=\"https:\/\/niixer.com\/?s=UCHE-1\">UCHE-1<\/a><\/p>\n\n\n\n<p><strong>Universidad:<\/strong> <a href=\"https:\/\/niixer.com\/?s=Universidad+Central\">Universidad Central<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fuentes<\/h3>\n\n\n\n<p>Anysphere. (2025). <em>*Cursor: The AI code editor*<\/em> [Sitio web del producto]. https:\/\/www.cursor.com\/<\/p>\n\n\n\n<p>Collins Dictionary. (2025, noviembre). Word of the year 2025: Vibe coding. <em>*Collins Dictionary Language Blog*<\/em>. https:\/\/www.collinsdictionary.com\/woty<\/p>\n\n\n\n<p>FIRST. (2019). <em>*Common Vulnerability Scoring System version 3.1: Specification document*<\/em>. Forum of Incident Response and Security Teams. https:\/\/www.first.org\/cvss\/v3.1\/specification-document<\/p>\n\n\n\n<p>Karpathy, A. [@karpathy]. (2025, 2 de febrero). <em>*There&#8217;s a new kind of coding I call \u201cvibe coding\u201d\u2026*<\/em> [Publicaci\u00f3n en X]. X. https:\/\/x.com\/karpathy\/status\/1886192184808149383<\/p>\n\n\n\n<p>Lovable. (2025). <em>*Lovable: Build software with words*<\/em> [Sitio web del producto]. https:\/\/lovable.dev\/<\/p>\n\n\n\n<p>MITRE Corporation. (2024). <em>*Common Weakness Enumeration (CWE) list version 4.14*<\/em>. https:\/\/cwe.mitre.org\/<\/p>\n\n\n\n<p>Next.js. (2025). <em>*Next.js 15 documentation*<\/em>. Vercel. https:\/\/nextjs.org\/docs<\/p>\n\n\n\n<p>OWASP Foundation. (2021). <em>*OWASP Top 10: 2021*<\/em> [Est\u00e1ndar de seguridad de aplicaciones web]. https:\/\/owasp.org\/Top10\/<\/p>\n\n\n\n<p>Playwright. (2025). <em>*Playwright for Node.js: End-to-end testing and automation*<\/em> [Documentaci\u00f3n t\u00e9cnica]. Microsoft. https:\/\/playwright.dev\/<\/p>\n\n\n\n<p>Supabase. (2025). <em>*Supabase documentation: Row Level Security*<\/em>. https:\/\/supabase.com\/docs\/guides\/auth\/row-level-security<\/p>\n\n\n\n<p>Tan, G. [@garrytan]. (2025, marzo). <em>*25% of YC Winter 2025 startups have 95% AI-generated codebases*<\/em> [Publicaci\u00f3n en X]. X. https:\/\/x.com\/garrytan<\/p>\n\n\n\n<p>Universidad Central, Facultad de Ingenier\u00eda y Ciencias B\u00e1sicas. (s.f.). <em>*Identificaci\u00f3n de vulnerabilidades: Estrategias y metodolog\u00edas para la ciberseguridad proactiva*<\/em> [Documento t\u00e9cnico]. Universidad Central de Colombia.<\/p>\n\n\n\n<p>Y Combinator. (2025). <em>*YC Winter 2025 batch overview*<\/em>. https:\/\/www.ycombinator.com\/blog<\/p>\n\n\n\n<p>Plaza Jim\u00e9nez, A. C. (2026). <em>*seo-tool-universidad: Plataforma lemuSeo de auditor\u00eda SEO con Vibe Coding y Spec-Driven Development*<\/em> [C\u00f3digo fuente]. GitHub. https:\/\/github.com\/bue221\/seo-tool-universidad<\/p>\n\n\n\n<p>OpenSpec Contributors. (2025). <em>*OpenSpec: Spec-driven development for AI coding agents*<\/em> [Software de c\u00f3digo abierto]. GitHub. https:\/\/github.com\/Fission-AI\/OpenSpec<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El desarrollo de software y el marketing digital est\u00e1n convergiendo en un punto sin precedentes. Hoy es posible construir una plataforma empresarial completa de auditor\u00eda SEO, anal\u00edtica e inteligencia competitiva guiando a una IA con instrucciones en lenguaje natural, sin un equipo de ingenier\u00eda tradicional. Esto es posible gracias alSeguir Leyendo<\/p>\n","protected":false},"author":36,"featured_media":87105,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[4547],"tags":[3902,4602,364,4419,4521],"class_list":["post-87046","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vibe-coding","tag-ai","tag-harness-engineer","tag-paginas-web-2","tag-prompts","tag-vibe-coding"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Vibe Coding con Disciplina: as\u00ed construimos lemuSeo &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos<\/title>\n<meta name=\"description\" content=\"Vibe coding con disciplina: c\u00f3mo combinamos IA, SDD y revisi\u00f3n humana para construir lemuSeo, una plataforma SEO real y mantenible.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vibe Coding con Disciplina: as\u00ed construimos lemuSeo &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"og:description\" content=\"Vibe coding con disciplina: c\u00f3mo combinamos IA, SDD y revisi\u00f3n humana para construir lemuSeo, una plataforma SEO real y mantenible.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/\" \/>\n<meta property=\"og:site_name\" content=\"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/niixer\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-19T19:36:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-19T20:23:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1416\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Andres Camilo Plaza Jimenez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andres Camilo Plaza Jimenez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Vibe Coding con Disciplina: as\u00ed construimos lemuSeo &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","description":"Vibe coding con disciplina: c\u00f3mo combinamos IA, SDD y revisi\u00f3n humana para construir lemuSeo, una plataforma SEO real y mantenible.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/","og_locale":"es_ES","og_type":"article","og_title":"Vibe Coding con Disciplina: as\u00ed construimos lemuSeo &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","og_description":"Vibe coding con disciplina: c\u00f3mo combinamos IA, SDD y revisi\u00f3n humana para construir lemuSeo, una plataforma SEO real y mantenible.","og_url":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/","og_site_name":"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","article_publisher":"https:\/\/www.facebook.com\/niixer\/","article_published_time":"2026-05-19T19:36:33+00:00","article_modified_time":"2026-05-19T20:23:14+00:00","og_image":[{"width":2560,"height":1416,"url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg","type":"image\/jpeg"}],"author":"Andres Camilo Plaza Jimenez","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Andres Camilo Plaza Jimenez","Tiempo de lectura":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#article","isPartOf":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/"},"author":{"name":"Andres Camilo Plaza Jimenez","@id":"https:\/\/niixer.com\/#\/schema\/person\/628821d86b02011d7e0e4f3dd7655a4c"},"headline":"Vibe Coding con Disciplina: c\u00f3mo construimos lemuSeo, una plataforma de auditor\u00eda SEO impulsada por IA","datePublished":"2026-05-19T19:36:33+00:00","dateModified":"2026-05-19T20:23:14+00:00","mainEntityOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/"},"wordCount":3867,"publisher":{"@id":"https:\/\/niixer.com\/#organization"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg","keywords":["AI","harness engineer","Paginas web","Prompts","vibe coding"],"articleSection":["Vibe Coding"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/","url":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/","name":"Vibe Coding con Disciplina: as\u00ed construimos lemuSeo &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","isPartOf":{"@id":"https:\/\/niixer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#primaryimage"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg","datePublished":"2026-05-19T19:36:33+00:00","dateModified":"2026-05-19T20:23:14+00:00","description":"Vibe coding con disciplina: c\u00f3mo combinamos IA, SDD y revisi\u00f3n humana para construir lemuSeo, una plataforma SEO real y mantenible.","breadcrumb":{"@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#primaryimage","url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg","width":2560,"height":1416,"caption":"Screenshot"},{"@type":"BreadcrumbList","@id":"https:\/\/niixer.com\/index.php\/2026\/05\/19\/vibe-coding-disciplina-lemuseo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/niixer.com\/"},{"@type":"ListItem","position":2,"name":"Vibe Coding con Disciplina: c\u00f3mo construimos lemuSeo, una plataforma de auditor\u00eda SEO impulsada por IA"}]},{"@type":"WebSite","@id":"https:\/\/niixer.com\/#website","url":"https:\/\/niixer.com\/","name":"Portal de noticias de tecnolog\u00eda, ciencia, Android, iOS, Realidad Virtual, Aumentada y Mixta, Videojuegos, computadores, todo lo mas reciente en tecnolog\u00eda","description":"Portal de noticias de tecnolog\u00eda","publisher":{"@id":"https:\/\/niixer.com\/#organization"},"alternateName":"Niixer","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/niixer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/niixer.com\/#organization","name":"Niixer","alternateName":"Niixer.com","url":"https:\/\/niixer.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/","url":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","width":140,"height":140,"caption":"Niixer"},"image":{"@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/niixer\/","https:\/\/www.instagram.com\/niixer.tecnologia\/"]},{"@type":"Person","@id":"https:\/\/niixer.com\/#\/schema\/person\/628821d86b02011d7e0e4f3dd7655a4c","name":"Andres Camilo Plaza Jimenez","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/f180322eae978c7dfc1b052414500f32a73326b159080d0fd4d8ae2224422dd3?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f180322eae978c7dfc1b052414500f32a73326b159080d0fd4d8ae2224422dd3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f180322eae978c7dfc1b052414500f32a73326b159080d0fd4d8ae2224422dd3?s=96&d=mm&r=g","caption":"Andres Camilo Plaza Jimenez"},"sameAs":["http:\/\/www.niixer.com"],"url":"https:\/\/niixer.com\/index.php\/author\/aplazaj\/"}]}},"jetpack_featured_media_url":"https:\/\/niixer.com\/wp-content\/uploads\/2026\/05\/SCR-20260519-nhxo-scaled.jpeg","_links":{"self":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/87046","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/users\/36"}],"replies":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/comments?post=87046"}],"version-history":[{"count":4,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/87046\/revisions"}],"predecessor-version":[{"id":87116,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/87046\/revisions\/87116"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media\/87105"}],"wp:attachment":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media?parent=87046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/categories?post=87046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/tags?post=87046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}