LupA11y, inicioAuditar una URL

Auditoría de accesibilidadque pulsa Tab.

Recorre tu web con el teclado, mide el foco píxel a píxel y te da cada arreglo en código.

Una página pública. Tarda unos diez segundos y no envía nada en tu nombre.

15hallazgos
Fases
5 de 5Todas completas
Foco visible
1 de 2011 débiles, 8 invisibles
Por severidad
15Crítica 3, alta 8, media 3, baja 1
Muestra: auditoría real de /demo (se abre en otra pestaña), una tienda inventada y rota a propósito.Ver el informe

El informe, hallazgo a hallazgo.

Cada hallazgo dice de qué fase sale, qué criterio WCAG incumple, en qué elemento está y cómo se arregla.

Teclado: trampa de teclado. Visión: hecha.

axe-coreZoom y espaciadoTecladoVisiónOrden del tabulador

  1. Garantiza que los botones tienen texto discernible

    1. .cart
      Diagnóstico completo de axe

      Corregir cualquiera de las siguientes incidencias: El elemento no tiene texto interno visible para lectores de pantalla El atributo aria-label no existe o está vacío El atributo aria-labelledby no existe, hace referencia a elementos inexistentes o hace referencia a elementos vacíos El elemento no tiene atributo title o el atributo title está vacío El elemento de formulario no tiene un <label> implícito ('envuelto') El elemento de formulario no tiene un <label> explícito Element's default semantics were not overridden with role="none" or role="presentation"

      Recorte del elemento afectado tal y como se ve en la página

      Se añade el atributo aria-label para darle un nombre accesible al botón.

      index.html, propuesto por el modelo
      eliminado: <button class="cart" type="button">añadido: <button class="cart" type="button" aria-label="Carrito"></button>
    Documentación de la regla (se abre en otra pestaña)
Muestra: auditoría real de /demo197,7 sChromium 153.0axe-core 4.13.0gemini-3.7-flash + gemini-3.6-flash

Primero se mide. Después, el modelo.

Tres lentes sobre la misma página. El tamaño de cada una es lo que tardó en la auditoría de muestra.

Carga de la página: 1,1 s. Reflujo a 320 px y espaciado de texto: 0,9 s. Total: 108,1 s, con la visión en paralelo al teclado. Aparte, 89,6 s esperando la cuota gratuita de Gemini.

Un agente que pulsa Tab

Recorre la página con pulsaciones reales y compara cada elemento con foco y sin foco, píxel a píxel. Si no cambia nada, el foco es invisible. Si el foco no puede salir de un grupo, es una trampa.

WCAG 2.1.1, 2.1.2, 2.4.7, 2.4.11 y 2.4.13.

El enlace «Cafés» del menú de la demo, sin foco.
Sin foco
El enlace «Cafés» del menú de la demo, con foco, tras pulsar tab.
Con foco, tras pulsar Tab

0 px²de indicador

Resultado en la demo: 0 píxeles de indicador en los cuatro enlaces del menú (el primero necesitaba 236 px²), y una trampa de teclado entre 2 elementos de la franja promocional.

El Acta Europea de Accesibilidad ya se aplica.

Si vendes en línea en la UE, tu web debe cumplir WCAG 2.1 AA. Una auditoría automática no lo certifica, pero te dice por dónde empezar.

  1. 2019

    La UE aprueba el Acta Europea de Accesibilidad

    Directiva (UE) 2019/882: requisitos comunes de accesibilidad para productos y servicios.

  2. 2023

    España la transpone

    Con la Ley 11/2023, de 8 de mayo.

  3. 28 de junio de 2025

    Se aplicaEn vigor

    Desde ese día, los servicios que se lanzan o se renuevan tienen que cumplirla.

  4. 28 de junio de 2030

    Termina el margen

    Lo que ya se usaba para prestar el servicio antes de junio de 2025 puede seguir usándose hasta entonces.

A quién afecta
Comercio electrónico, banca para consumidores, transporte de viajeros, comunicaciones electrónicas y libros electrónicos, entre otros.
Con qué se mide
Con la norma EN 301 549, que remite a WCAG 2.1 AA. LupA11y audita WCAG 2.2 AA, que la incluye.
Qué se arriesga
Multas de 301 € a 1.000.000 € según la gravedad (RDL 1/2013). Leves hasta 30.000 € y graves hasta 90.000 €.
Quién queda fuera
Las microempresas que prestan servicios: menos de 10 personas y hasta 2 M€ de facturación o balance.

¿Le afecta a tu empresa?

¿Qué servicio prestas?
¿Qué tamaño tiene?
Te afectaTu servicio digital debe cumplir la EN 301 549 (WCAG 2.1 AA) desde el 28/06/2025. Lo que ya usabas antes para prestarlo tiene margen hasta el 28/06/2030.

Ley 11/2023 en el BOE (se abre en otra pestaña)Directiva (UE) 2019/882 (se abre en otra pestaña)Información orientativa, no asesoramiento legal.

Tu CI y tu editor, el mismo motor.

La web, la GitHub Action y el servidor MCP llaman al mismo paquete y devuelven el mismo contrato Zod.

El motorpackages/corecontrato Zod
  • WebEsta página y su API de streaming.
  • GitHub ActionUn check en cada pull request.
  • Servidor MCPClaude Code, Cursor y otros clientes.
  • CLILa terminal y cualquier otra CI.
El mismo motor sale en cuatro formatos: web, GitHub Action, servidor MCP y CLI.

Cada pull request se audita antes de fusionarse. Si aparece algo de severidad alta, el check falla y el resumen queda en la pestaña del job.

Dónde corre
En el propio job, contra la app levantada en localhost: una URL, varias o las de un sitemap.
Qué deja
El resumen con los diffs en $GITHUB_STEP_SUMMARY, anotaciones, un comentario en el PR y SARIF para la pestaña de seguridad.
Cuándo falla
Por encima del umbral que elijas. Con una línea base, solo por lo que es nuevo o empeora.
Sin Gemini
Sigue funcionando: la visión se marca como omitida.
.github/workflows/accesibilidad.yml (YAML)
name: Accesibilidad
on: [pull_request]

jobs:
  lupa11y:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - run: npm ci && npm run build
      - run: npm start &
      - run: npx wait-on http://localhost:3000
      - uses: Adriiiii24/LupA11y@v0
        with:
          url: http://localhost:3000
          fail-on: high
          sarif-path: lupa11y.sarif
          comment-pr: true
          gemini-api-key: ${{ secrets.GEMINI_API_KEY }}
      - uses: github/codeql-action/upload-sarif@v4
        if: always()
        with:
          sarif_file: lupa11y.sarif

Evidencia, no promesas.

Ninguna herramienta automática certifica WCAG. LupA11y te da el mapa y los arreglos; el orden de lectura y los contenidos complejos los revisa una persona.

Auditar una URL