Auditoría técnica del proyecto MarkeUP

doc-auditoria-MarkeUp

Auditoría de MarkeUP: estado, rendimiento, SEO y dependencias

El estado técnico de MarkeUP: rendimiento, dependencias, SEO y accesibilidad, con el histórico de novedades y correcciones de cada auditoría desde julio de 2026.

Admin15 de junio de 2026, 00:0022 min de lectura

Orden de lectura recomendado: doc-readme → doc-guia → doc-arquitectura → doc-buscador → doc-operacion → doc-publicar → doc-auditoria

Auditoría: 2026-09-14 · Build: 385 páginas, 0 errores, 0 warnings · Dependencias: 0 vulnerabilidades · Posts: 74 · Tests: 76


ÁreaEstadoObservaciones
Build✅ Saludable385 páginas, 0 errores CI, 0 warnings
Dependencias✅ Optimizadas18 producción + 4 desarrollo (22→18, sin no usadas)
Cobertura de tests✅ Ampliada76 tests (posts, tags, graph, search-rank, search-graph, social-share)
SEO✅ CompletadoCanonical por página, Open Graph article:*, author meta, Schema.org rico, sitemap changefreq, RSS atom+image
Rendimiento✅ Optimizadosrcset 640–1920, preload LCP + fuente, Service Worker, CSS @layer + rich.css externa
Legal del sitio✅ Nuevo/privacy, /terms, /faq, banner cookies RGPD, footer legal
Accesibilidad✅ Cubiertaskip-link, focus-visible, un <main>, alt/og:alt, a11y-check.mjs (10 páginas OK)
Interactividad🆕 Rich previewTooltips hover + ![[post]] → rich card, llm.txt, manifiesto /api/posts.json
Seguridad✅ ReforzadoCSP, HSTS, X-Frame-Options DENY, nosniff, headers en _headers
Documentación✅ Actualizada5 docs del sistema (Sept 2026)
Gestión IA🆕 IndependienteHermes Agent movido a repo propio
CI/CD✅ ValidaciónGitHub Actions corre tests+build; deploy nativo Cloudflare Pages

ComponenteArchivosFunción
SOULSOUL.mdPersonalidad, protocolo LEER→ANALIZAR→PROPONER→CONFIRMAR→ESCRIBIR→LOGUEAR→INDEXAR
Memoryvault-index.md, conventions.md, backlog.mdÍndice de 63 slugs, ~150 tags, ~100 huérfanos, 22 ideas priorizadas
Rulesfrontmatter-spec.md, wikilinks-spec.md, style-guide.mdEspecificaciones formales de frontmatter, wikilinks y estilo
Skillscrear-post.md, ampliar-post.md, generar-wikilinks.md, auditar-vault.md, documentar.mdFlujos detallados para cada operación
Templatespost-template.mdPlantilla YAML con 21 variables

Capacidades: crear posts con frontmatter + wikilinks, ampliar notas, escanear/enriquecer wikilinks, auditar el vault (huérfanos, consistencia), verificar documentación.

  • Los 5 docs (doc-readme, doc-guia, doc-arquitectura, doc-operacion, doc-auditoria) reflejan el sistema Hermes
  • Conteos actualizados: 36→63 posts
  • Nuevo skill documentar.md para mantener los docs sincronizados

CambioDescripción
🔐 Security headers_headers: CSP adaptado al stack, HSTS preload, X-Frame-Options DENY, nosniff, COOP/CORP, Permissions-Policy
📡 Service Workersw.js v6: offline parcial. HTML network-only, /_astro+fuentes cache-first, /img/* network-first (su nombre no lleva hash y el contenido se regenera en el mismo path), pagefind network-first
🖼️ Imágenes siempre frescas_headers v10: /img/* y /img/og/* pasan de 30 días con stale-while-revalidate a max-age=300, must-revalidate, y sw.js v6 deja /img/* en network-first (antes cache-first, que congelaba la foto antigua para siempre). ⚠️ Aquello era una segunda capa del problema: la causa raíz estaba en el pipeline — con dos fuentes del mismo nombre (foto.jpeg + foto.webp) la imagen publicada dependía del orden de procesado, y producción servía la del clon limpio (el .jpeg ampliado) mientras local servía la última editada. Arreglado archivando las fuentes que sobran en src/content/posts/img/_originales/ (una sola fuente por nombre), con prioridad determinista como red de seguridad y npm run images:check bloqueante en CI
🌐 Dominio corregidosite now https://markeup.pages.dev (antes mybrain-limpio inexistente — canonicals rotos)
📦 Deps limpiadas22→18: quitados 2×fontsource, playwright, pagefind-ui, zod (transitivo). Sitemap ACTIVADO
🤖 Hermes Agent extraídoRepo independiente github.com/uriszarernesto-blip/hermes-agent (removido +6.5k archivos)
✅ CI validadorDeploy.yml → solo tests+build (Cloudflare Pages despliega nativo). Workflow verde constante
🕸️ /graph-2d eliminado301 redirect → /graphify (implementación superior). ForceGraph2D borrado (-545 líneas)
🐍 Comandos PythonImplantados: buscar, backlinks, renombrar, mover, limpiar, relacionadas, tags, index, daily, resumir
🖼️ Srcset realprocess-images genera 640/1280 junto al master 1920. ResponsiveImage usa <picture> real

CambioDescripción
⚖️ Páginas legales/privacy, /terms y /faq creadas y enlazadas en footer; cookies: banner CookieConsent (sin trackers, localStorage solos esenciales).
🔗 OpenGraph/autor completorel=canonical auto, article:published/modified/author/section/tag, twitter:creator, meta author, Schema.org Person[] + publisher con logo.
🧭 Sitemap + RSS + Robotschangefreq × entrada, /llms.txt y /api/posts.json en sitemap; feed RSS con <image>/autor/idioma; robots por crawler + usuario.
♿ Accesibilidadskip-link visible, focus-visible, un único <main> por página (limpieza <main> anidados), page 404 con sugerencias + noindex, a11y-check.mjs ampliado.
🪄 Rich previewspublic/preview.js (defer global): hover-tooltip sobre wikilinks/enlaces internos con imagen+metadatos y coreografía GSAP «la tarjeta se materializa y su foto se abre» (≈0,8 s, beats solapados). Contrato de suavidad: solo se animan transform, opacity y clip-path — ni una propiedad de layout (animar el tamaño era la causa de los tirones) —, sin backdrop-filter en la tarjeta, tamaño medido una sola vez y will-change retirado al terminar (clase .lp-anim). Secuencia: tarjeta (opacity + scale + y desde el lado del enlace) y bloom → metadatos + título palabra a palabra (stagger 24 ms, ya con la tarjeta: si no, se vería un panel vacío) → la foto se abre por cortina (clip-path: inset(100%…)→inset(0%)) mientras la miniatura se asienta (scale 1,14→1) y un reflejo la cruza una vez → descripción y CTA con su flecha. El estado por defecto del CSS es el FINAL: sin GSAP, sin clip-path: inset() o con prefers-reduced-motion, la tarjeta aparece completa (plan B sin código). Alcance: cuerpo (.prose), wikilinks y cualquier enlace con data-preview="on" —incluidas las píldoras de «Posts que enlazan a este artículo», que viven fuera del cuerpo y por eso van marcadas (plantilla + setBacklinks)—. Cambio de enlace: se reutiliza la misma tarjeta, que viaja al enlace nuevo (transform puro desde la posición anterior) y vuelve a revelar su contenido — un solo nodo, sin parpadeo ni contenedores a medias; la timeline es única por tarjeta (killTl(node)) y underPop() pregunta qué hay debajo para atender un enlace tapado. Colocación con recorte final al viewport (nunca se sale). Medido en Chrome real: p50 17 ms / p95 18 ms (60 fps, sin picos). Verificación: npm run verify:preview (CDP: tamaño constante, cortina, cascada del texto, frame pacing, escena 2 de dos enlaces contiguos y escena 3 de backlinks) + src/lib/preview-choreography.test.ts.
🤖 llm.txt/llms.txt estándar (página + posts) y manifiesto /api/posts.json para tooltips/cards/agentes.
⚙️ ShareComponente SocialShare en posts: X, LinkedIn, Facebook, WhatsApp, Telegram y copiar enlace.

CambioDescripción
🔧 sync-images.js reparadoEra destructivo (leía solo .md en el primer nivel → borraba las 207 imágenes). Ahora: dry-run por defecto, --apply obligatorio, guardarraíl que aborta con 0 posts, protege /img/og/, escanea frontmatter + markdown + wikilinks + código (`src/**/*.astro
🛡️ 0 vulnerabilidades13 → 0: overrides scoped (js-yaml, nanoid, postcss, browserslist) + subida a Astro 7.3.2, Tailwind v4 (@tailwindcss/vite), DaisyUI 5.
🔍 validate-slugs.mjsDetecta colisiones de slug/alias entre posts (73 posts, 156 aliases, 0 colisiones). Bloqueante en CI.
📋 Schema Zod estrictotitle, slug y description ahora obligatorios; canonicalUrl tolera null.
⚙️ ToolingPrettier + ESLint + husky + lint-staged. Pre-commit = formato → slugs → tests.
🗺️ Sitemap mejoradoExcluye noIndex, añade <lastmod> por post (73).
📊 Analytics opt-inCloudflare Web Analytics vía PUBLIC_CF_ANALYTICS_TOKEN (sin cookies, GDPR-friendly). Sin token no emite nada.
🔒 CSP hardeningAñadidas script-src-elem, style-src-elem, media-src, manifest-src; dominio de Cloudflare Insights permitido.
⚡ RendimientoBackgroundImage con image-set() responsive; tooltip de Graphify usa variante -640; preload de fuentes (Roboto Flex + Material Symbols); cache de HTML en _headers.
♿ a11y-check ampliadoVerifica <h1> único, labels de inputs (incl. implícitos), rel=noopener en target=_blank, texto accesible en enlaces/botones, preload de fuentes. Arreglados <h1> faltante en /search y aria-label del buscador.
🧹 Repositorio.git 304→207 MB (purga de 28 ficheros pesados borrados vía filter-repo); hermes-agent/ y embeddings de Obsidian archivados fuera del working tree; rama main-backup obsoleta eliminada.
📖 DocsNuevos README.md y CONTRIBUTING.md; doc-arquitectura/doc-operacion/doc-guia actualizados a Tailwind v4.

Verificación: 379 páginas, 30/30 tests, validate:slugs OK, validate:share 379/379, a11y 11/11, npm audit 0.

CambioDescripción
🐛 Fix crítico botones de compartirLos enlaces propagaban una ruta relativa (/posts/slug) → WhatsApp/LinkedIn/Facebook compartían un enlace roto (WhatsApp compartía literalmente /posts/caretas-mascaras sin dominio). Ahora se comparte la URL absoluta (https://markeup.pages.dev/posts/slug).
🧩 Nuevo src/lib/social-share.tsLógica pura y testeable (buildShareLinks, buildShareText). Lanza si recibe una URL no absoluta → el bug no puede repetirse.
📱 Web Share APIEn móvil (táctil) los botones abren el panel nativo de compartir con la URL completa; degrada a los enlaces por red en escritorio.
🐦 Twitter Cards completasAñadidos twitter:url, twitter:domain, twitter:image:width/height.
👤 Handle de Xtwitter:site y twitter:creator = @splitzforx (constante TWITTER_HANDLE en BaseLayout). Se eliminó el twitter:creator = "Admin" inválido que X ignoraba.
🏷️ og:site_name corregidoMarkUP → MarkeUP, coherente con Footer y RSS.
📐 Ratio OG 1.91:1Por defecto se declara 1200×630 (ratio ideal para summary_large_image); las imágenes de fallback 1920×1080 se reescalan dentro de ese marco.
🔗 Schema.org autorauthor[].sameAs = ["https://x.com/splitzforx"] y article:author:profile.
✅ Validador nuevoscripts/mjs/validate-share.mjs (npm run validate:share): audita OG + Twitter Cards + URLs absolutas de compartir en dist/. Falla con código 1 → apto para CI.
🧪 Testssrc/lib/social-share.test.ts (9 casos). Total Vitest: 30 tests.

Auditoría de limpieza del sitio: archivos caducos, duplicaciones, artefactos generados versionados e inconsistencias de marca.

CambioDescripción
🏷️ Marca unificadaEl <title> de los posts decía | Multiblog mientras og:site_name decía MarkeUP. Se unificó todo a MarkeUP (17 Multiblog + 6 MarkUP → 0). Señales de marca contradictorias para buscadores y redes.
🐛 Preload duplicadoroboto-flex.woff2 se precargaba dos veces en BaseLayout → petición y parseo repetidos. Ahora se declara una sola vez.
♻️ Helper compartidogetCategoryImage() estaba duplicada literalmente en /category/:cat y /category/:cat/page/:n. Extraída a resolveCategoryImage() en src/lib/images.ts.
🗑️ Artefacto generado versionadopublic/pagefind/ (147 ficheros) estaba en git con un índice obsoleto (129 fragmentos / page_count 129) frente al build real (203 fragmentos). Es una caché que regenera scripts/dev-search.js; sale del control de versiones y entra en .gitignore.
🧹 Archivo históricocline-instructions.md, task_progress.md, GIT-HISTORY-CLEANUP.md y hermes/ movidos a docs/archive/ (obsoletos, conservados por trazabilidad). Eliminados directorios vacíos, 32 .DS_Store y __pycache__/.
🧭 SitemapSe quitó /llms.txt (un .txt no es una URL rastreable).
🤫 Ruido en testscleanSlug() emitía un console.warn en el caso esperado de slug vacío; ahora es silencioso.
🔍 Rutas demo/animated-sections y /admin/* marcadas noIndex y desenlazadas de la home (siguen accesibles, fuera de índices).
🧪 Linter de wikilinks reparadovalidate-wikilinks.mjs tenía 4 bugs que generaban 121 falsos positivos: analizaba el frontmatter como prosa, confundía el interior de [[wikilink]] con un corchete suelto, marcaba enlaces de referencia [texto][2] y reportaba líneas relativas al cuerpo. Ahora 121 → 0, con líneas exactas.
📖 Docs sincronizadasCorregidos conteos desactualizados (76 tests, 74 posts, 385 páginas) y referencias a ficheros inexistentes (optimize-images.js, graph-2d.astro).

Verificación: 385 páginas, 76/76 tests, validate:slugs OK, npm audit 0 vulnerabilidades.


Auditoría completa de las animaciones del sitio (nueve subsistemas) medida en navegador real: gates de movimiento, de tooltip y uno nuevo de grafos, más sondas de preestado, accesibilidad y ritmo de frames.

CambioDescripción
🐛 opacity pisada en las tarjetasLa cortina de salida de los bloques (m-block-exit) se aplicaba también a los elementos que son bloque y beat a la vez (.post-card, el hero del artículo…). Una animación gana al style en línea, así que la tarjeta aparecía a opacidad 1 antes de entrar y perdía el fundido de entrada. Medido en el mismo elemento: opacity: 1 + animation-name: m-block-exit → ahora 0 + none.
🐛 Tres caminos rotos en el grafo 2Dcanvas.dispatch('zoom', …) se llamaba sobre el elemento del DOM en vez de sobre la selección de d3: el encuadre automático (a los ~14 s de cargar), el atajo de teclado r y el botón «↺ Reset todo» lanzaban TypeError y no hacían nada.
♿ Movimiento reducidoEl latido de la cabecera de cada artículo (breathe, 10 s en bucle) y el rótulo de Ventajas seguían animando con la preferencia activada; los grafos no la miraban en absoluto (física, partículas y latido continuos). Con reduce la simulación se resuelve de golpe y nada queda en bucle.
⚡ Tooltip más finoLa miniatura se descarga al detectar el enlace y se espera su decodificación antes de abrir la tarjeta, en vez de dentro de la animación: el pico de frame baja de 70/34/54 ms a 49/30/32 ms (p95 18-20 ms) y el gate deja de dar rojo.
🧹 Código muertoRetirados el parallax y la cortina de imagen (0 usos en el sitio), la regla inerte #Tabla-de-contenido y dos selectores que nunca llegaban a aplicarse en la página de demostración.
🔧 Build reparadoEl hook de pre-commit prettificaba el GSAP minificado de public/vendor/, de modo que npm run build fallaba en su segundo paso. Esa carpeta queda fuera de Prettier.
🧪 Gatesvalidate cubre ahora el listado y una categoría; nace un gate para los grafos 2D/3D y un test de contrato entre el CSS de movimiento y sus módulos.
🧠 Grafos con un solo cerebroEl 2D y el 3D decidían por su cuenta qué pintar. Ahora comparten estado (src/lib/graph-state.ts): vistas (Notas por defecto, Blogs, Tags, Huérfanos, Todo), consulta con sintaxis (tag:, path:, type:, -excluir, OR), foco con profundidad y política de etiquetas. La vista por defecto dibuja 105 nodos y 722 enlaces en vez de 416 y 1200: los tags son el 75 % de los nodos y ahogaban la estructura.
🔗 Vistas compartiblesEl estado va en la URL (?v=todo&q=tag:yoga&f=post:el-aura&d=2), así que una vista concreta se puede enlazar. Lo que no se entiende se ignora: una URL no puede romper el grafo.
🏷️ Etiquetas del 3DSolo se ven las del nodo y sus vecinos al pasar el ratón (más las 5 categorías): antes estaban TODAS encendidas y tapaban el dibujo. Se encienden mutando la visibilidad del sprite, sin reconstruir los objetos.
🛡️ Contrato de los datos del grafonpm run validate:graph (en el build) comprueba ids únicos, extremos de enlace existentes y números finitos en las 12 páginas que embeben un grafo: un solo dato raro podía dejar el lienzo en negro sin que fallara ningún validador.

Verificación: 326 tests, movimiento 40/40 (portada, listado con 691 beats, una categoría, un artículo y dos pasadas de movimiento reducido), tooltip 3/3, grafos 15/15, CLS 0 y p95 de 16,7 ms.


  1. Arquitectura limpia: Separación clara en capas (lib → pages → components → layout). Sin dependencias circulares.
  2. CSS modular: @layer para control de cascada, overrides DaisyUI fuera de layer, 0% CSS duplicado.
  3. SEO completo: BreadcrumbList (Schema.org), OG tags con dimensiones de imagen, Twitter Cards, preload de LCP, fetchpriority="high".
  4. Imágenes responsivas: Pipeline completo con Sharp: crop 1920×1080 + 3 tamaños (1920/1280/640) en WebP calidad 82. <picture> + srcset + sizes (100vw en hero, 33vw en cards) + aspect-ratio en todos los componentes. Cloudflare sirve los archivos tal cual (no los reoptimiza).
  5. Fuentes locales: Roboto Flex + Material Symbols cargadas sin CDN externo, font-display: swap.
  6. Build automatizado: npm run build = images + astro + pagefind en un solo comando.
  7. 192 páginas estáticas: Sin servidor, sin base de datos, hosting en CDN global.
  8. Búsqueda offline e inteligente: Pagefind indexa solo los 73 artículos (data-pagefind-body), se enriquece con el grafo de wikilinks/aliases y se reordena con una jerarquía estricta (título → contenido → contiene). Ver doc-buscador.
  9. Grafo interactivo: 3D (Three.js) y 2D (D3.js) para visualizar relaciones entre contenido.
  10. Scroll suave: Lenis 1.3 con soporte táctil y re-inicialización con View Transitions.
  11. Generación automática de posts: Script generar_articulo.py que, a partir de una URL, extrae contenido, detecta categoría, genera tags y produce un artículo Markdown completo vía Ollama (qwen2.5-coder:7b-64k) con frontmatter validado contra el schema Zod del blog.
  12. Detección inteligente de categorías: El script analiza el texto extraído contra un diccionario de palabras clave por categoría (Humano, Documentación, Máquina, Opinión, Literatura) y asigna automáticamente la más relevante.
  13. Normalización de tags: Sistema de extracción de palabras frecuentes con filtrado de stopwords en español, normalización a formato palabra-compuesta y aseguramiento de cantidad mínima (3) y máxima (8) de etiquetas.

#ProblemaImpactoPrioridad
1Cobertura de tests baja (solo 6 tests en posts.ts)Alto — regresiones no detectadas en tags.ts, graph.ts, images.tsAlta
2Script sync-obsidian.js obsoleto en package.jsonBajo — script sync referencia archivo inexistenteBaja
3package.json name: multiblog-obsidian (no coincide con markeup/)Bajo — solo afecta a npm internalsBaja
4Sin E2E testsMedio — no hay tests de integración para páginas renderizadasMedia
5Sin tests de a11y automatizadosMedio — no hay axe-core ni pa11y en CIMedia
6Sin TypeScript en componentes AstroBajo — los .astro usan JSX sin type-checking estricto en propsBaja
7Posts de prueba (posiblemente existan archivos de test)Bajo — pueden aparecer en build si no están en draftBaja
8Lighthouse CI umbrales no verificados recientementeMedio — los umbrales en lighthouserc.json pueden no reflejar realidadMedia

PaqueteVersiónUsoEstado
astro^4.0.0Framework SSG✅ Activo
@astrojs/rss^4.0.0RSS feed✅ Activo
@astrojs/sitemap^3.0.0Sitemap XML✅ Activo
@astrojs/tailwind^5.0.0Integración Tailwind✅ Activo
@tailwindcss/typography^0.5.20Estilos .prose✅ Activo
daisyui^4.0.0Componentes UI + temas✅ Activo
3d-force-graph^1.80.0Grafo 3D✅ Activo
three^0.184.0Three.js (grafo 3D)✅ Activo
three-spritetext^1.10.0Texto en grafo 3D✅ Activo
pagefind^1.5.2Búsqueda full-text✅ Activo
@pagefind/default-ui^1.5.2UI de búsqueda✅ Activo
sharp^0.33.5Procesamiento imágenes✅ Activo
gray-matter^4.0.3Parse frontmatter✅ Activo
unist-util-visit^5.1.0AST traversal (wikilinks)✅ Activo
zod^4.4.3Validación schema✅ Activo
lenis^1.3.23Smooth scroll✅ Activo
rehype-slug^6.0.0IDs en headings✅ Activo
rehype-autolink-headings^7.1.0Anchor links✅ Activo
gsap^3.15.0Animaciones (¿en uso?)⚠️ Verificar
@fontsource/*^5.2.8Fuentes (cargamos locales)⚠️ Posiblemente redundante

PaqueteVersiónUsoEstado
typescript^5.0.0Type checking✅ Activo
vitest^4.1.8Test runner✅ Activo
@vitest/ui^4.1.8UI de tests✅ Activo
@types/node^20.0.0Tipos Node.js✅ Activo

  • gsap — Verificar si realmente se usa en el código actual. Si no, eliminar.
  • @fontsource/roboto-flex — Las fuentes se cargan localmente desde public/fonts/. Este paquete puede ser redundante.

Estas dependencias son independientes del ecosistema npm y no afectan al build de Astro. Se gestionan con uv pip install y no aparecen en package.json.

PaqueteVersiónUsoEstado
python3.xRuntime del script✅ Requerido
requestsrecienteDescarga HTTP + API Ollama✅ Activo
trafilaturarecienteExtracción de texto principal (primario)✅ Activo
beautifulsoup4recienteParseo HTML (fallback)✅ Activo
ollamalatestServidor LLM local✅ Requerido
qwen2.5-coder:7b-64klatestModelo de generación de artículos✅ Requerido

OptimizaciónImplementaciónImpacto
Imágenes responsivas<picture> + srcset 640w/1280w/1920w + sizes (100vw hero / 33vw cards)LCP ↓
Preload LCP<link rel="preload"> + fetchpriority="high" en heroLCP ↓↓
Font display swapfont-display: swap en Roboto Flex + Material SymbolsFCP ↓
Aspect ratiostyle="aspect-ratio: 16/9" en todas las imágenes (hero, tarjetas y miniaturas de búsqueda)CLS ↓
Lazy loadingloading="lazy" en PostCard + decoding="async"LCP ↑
CSS modular@layer para especificidad controladaFCP ↓
Chunk splittingchunkSizeWarningLimit: 1000kB, carga asíncrona Three.jsFCP ↓
View TransitionsFade 1000msUX ↑

OptimizaciónPrioridadEsfuerzo
Lighthouse CI en pre-commit hookMediaBajo
Eliminar CSS no utilizado (PurgeCSS)BajaMedio
Service Worker para offlineBajaAlto

AspectoEstado
npm audit0 vulnerabilidades conocidas
Secretos en códigoNo detectados
.gitignoreSyncthing, Obsidian, logs, .env ignorados
HTTPSCloudflare Pages fuerza HTTPS
Headers de seguridadNo configurados (CSP, HSTS) — delegado a Cloudflare
Admin panelProtegido con JWT (login.astro)

  • Documentación actualizada a Julio 2026
  • Imágenes responsivas implementadas
  • OG tags completos + BreadcrumbList
  • Preload LCP + fetchpriority=“high”

  • Eliminar dependencias no usadas (@fontsource × 2, playwright, pagefind-ui, zod)
  • Renombrar package.json name a markeup
  • Eliminar script sync-[[obsidian-sharpen-thinking|Obsidian]].js (ya no existía)
  • Implementar Service Worker para offline parcial
  • Configurar headers de seguridad (CSP, HSTS, X-Frame) en _headers
  • CI Build & Test validando cada push (workflow activo)
  • Redirigir /graph-2d → /graphify (eliminado código redundante)
  • Corregir dominio site a markeup.pages.dev (canonicals)

  • Añadir tests para tags.ts y graph.ts
  • Implementar axe-core/pa11y en CI para tests de a11y

  • Añadir tests E2E con Playwright (reinstalar dep cuando se creen)
  • Automatizar Lighthouse CI como pre-commit hook
  • Activar Service Worker (actualmente registrado; NO pre-cache crítico)

FechaCambio
2026-11-09🐛 Fix botones de compartir (URL absoluta, bug WhatsApp), Twitter Cards completas (twitter:url/domain/image:width/height), handle X @splitzforx, og:site_name → MarkeUP, ratio OG 1.91:1, social-share.ts + 9 tests, validador validate-share.mjs
2026-09-04⚖️ Legal (privacy/terms/faq + cookie consent), SEO/article/author completo, a11y (skip/focus/main único/404), rich tooltips + rich cards, /llms.txt, /api/posts.json, SocialShare
2026-09-04🔐 Security headers (CSP/HSTS/nosniff), Service Worker offline, dominio canonical corregido a markeup.pages.dev, /graph-2d→Graphify redirect, CI validador
2026-09-03📦 Deps 22→18, sitemap activado, package rename a markeup, Hermes Agent extraído a repo propio, imágenes srcset real
2026-07-08🆕 Hermes Agent: sistema de gestión IA con 5 skills, 12 archivos. Documentación actualizada (63 posts). Skill documentar.md
2026-07-03Imágenes responsivas (srcset), preload LCP, font-display swap, OG tags completos, BreadcrumbList JSON-LD
2026-06-29Scripts deploy.sh y commit-local.sh, desactivación watchexec, compresión audio
2026-06-15Glassmorphism unificado, documentación reestructurada
2026-02-07CSS modular, warnings de build resueltos, 191→192 páginas

DocumentoContenido
doc-readme-MarkeUpVisión general y stack
doc-guia-MarkeUpInstalación y configuración
doc-arquitectura-MarkeUpArquitectura y componentes
doc-operacion-MarkeUpComandos y troubleshooting

Auditoría generada: 2026-07-09 20:33 Posts: 65 | Build: 347 páginas (98M) Dependencias: 23 producción, 4 desarrollo Scripts npm: 23 | Imágenes: 57 WebP | Audios: 6 Ollama: 🟢 ONLINE (6 modelos) Último commit: 300f118 📝 Nuevo post: musica-esferas (3 hours ago)

Revisa también la arquitectura y la guía de operación para el contexto técnico completo.

Enlaces útiles: arquitectura del proyecto, guía de instalación y el flujo de Vault CMS para entender cómo se generan los posts.

Para profundizar en este ámbito, 5 Ritmos desarrolla gabrielle Roth y la Danza de los 5 Ritmos (5Rhythms): una práctica de movimiento meditativo y somático basada en las olas.

doc-auditoria-MarkeUp

Explora las ramas del artículo

Compartir este artículo