Resist Now
432 páginas. Una sola persona. Una plataforma de participación cívica creada con Astro que escala como una redacción sin tener que contratar una.
Visitar sitioEl problema
El sitio empezó en WordPress. Publicar un informe llevaba 45 minutos de formato, enlaces y referencias cruzadas. Las estadísticas se quedaban desactualizadas en páginas que nadie recordaba revisar. Los enlaces internos se rompían en silencio. No había forma de conectar un informe con la carta o el guion de llamada correspondiente.
16 áreas de política pública. 50 estados. Noticias todos los días. Un CMS tradicional habría necesitado un equipo de 3 a 5 personas. El presupuesto era cero.
Por qué Astro. Más de 432 páginas renderizadas de forma estática para velocidad y SEO. MDX para páginas editoriales con componentes interactivos. Cero runtime de framework en el navegador. Astro Content Collections con validación de esquemas Zod exige 24 campos por informe en tiempo de compilación. Sin React, sin Vue, sin costo de hidratación. Scripts en línea sencillos manejan los filtros, los botones de copiar y las interacciones del mapa. Compilación completa: 10 segundos.
Por qué Cloudflare Pages. El plan gratuito aguanta el tráfico. Despliegue automático desde cada push a GitHub. Caché en el borde. Ningún servidor que administrar. GitHub Actions dispara compilaciones programadas para contenido con fecha futura, auditorías trimestrales y controles de calidad.

El problema de la taxonomía. Más de 237 informes, 50 estados, 12 páginas explicativas, 7 series y 135 cartas tienen que encontrarse entre sí. Un registro único de etiquetas gobierna el vocabulario. Las etiquetas alimentan la coincidencia de cartas, el enrutamiento de informes a sus temas, el filtrado de páginas por estado y el enlazado automático. Si un informe hace referencia a una categoría que no existe, la compilación falla antes de publicarse.
Arquitectura de componentes. Más de 10 componentes reutilizables de Astro sin dependencias de framework. StateMap genera mapas coropléticos en SVG con proyecciones Albers USA de d3-geo en tiempo de compilación. MoneyTrail visualiza flujos de financiamiento con actores nombrados y montos en dólares. ThenNow muestra el cambio en el tiempo entre fechas con fuente. Cada componente tiene tablas alternativas para lectores de pantalla. Un marco de ordenamiento de contenido respaldado por investigación define cómo se secuencian los componentes en cada tipo de página.

Lo que funciona sin equipo. Un plugin de rehype genera 285 enlaces cruzados en tiempo de compilación. Un script previo marca las estadísticas que pasaron su intervalo de vigencia. 36,075 enlaces internos verificados en menos de 2 segundos en cada compilación. Más de 25 reglas de calidad de contenido aplicadas automáticamente. Un algoritmo de puntuación empareja cartas con informes por categoría y coincidencia de etiquetas. Los despliegues programados publican a diario el contenido con fecha futura. La persona a cargo escribe contenido. El sistema hace todo lo demás.

Lo que construimos
Flujo de publicación
Problema: publicar un informe en WordPress llevaba 45 minutos. Solución: los informes son archivos Markdown con frontmatter estructurado. Astro Content Collections valida 24 campos en tiempo de compilación. Los informes con fecha futura se publican solos mediante despliegues programados de GitHub Actions a las 6 de la mañana, hora del centro. Los sitemaps se regeneran en cada despliegue. El tiempo de publicación bajó de 45 minutos a menos de 15. La persona a cargo dedica su tiempo a escribir, no a dar formato.
Sistema de datos con gobernanza
Problema: las estadísticas se desactualizan y nadie lo nota hasta que un lector escribe. Solución: 1,188 estadísticas guardadas en TypeScript con URL de la fuente, intervalo de vigencia, nivel de fuente (1-3) y fecha de última verificación. Cada estadística tiene un identificador. Las páginas hacen referencia al identificador, no al número. Actualizas una estadística y cada página que la usa se recompila con el valor nuevo. El script previo marca las estadísticas que pasaron su umbral de vigencia. Antes de este sistema, el mismo número aparecía escrito a mano en 5 páginas distintas con 3 valores distintos.
Sistema de coincidencia de cartas
Problema: las páginas de acción eran un callejón sin salida. La gente llegaba, leía una petición vaga y se iba. Solución: 135 cartas guardadas como datos en TypeScript con guiones de llamada, datos clave y enlaces de envío de Resistbot y Democracy.io. Un algoritmo de puntuación empareja cartas con informes por categoría y coincidencia de etiquetas. Alguien termina de leer un informe sobre recortes a Medicaid y de inmediato ve una carta sobre recortes a Medicaid, con guion de llamada y un botón de envío de un solo toque. Cobertura: 82% de los informes tienen una carta emparejada. Antes: 0% tenía una carta relevante lista para copiar y pegar.
Arquitectura de contenido
Cinco tipos de página atienden intenciones distintas. 16 temas centrales (más de 2,000 palabras, MDX con componentes interactivos) ganan tráfico de búsqueda en temas amplios. Más de 237 informes cubren noticias específicas con evidencia y acción. 50 páginas por estado dan contexto local. 12 páginas explicativas cubren conceptos base (manipulación de distritos, filibusterismo, revisión judicial). 7 series editoriales agrupan informes relacionados en arcos narrativos con visualización de datos. Astro Content Collections con esquemas Zod valida 24 campos de frontmatter por informe en tiempo de compilación.
Componentes de visualización de datos
10 componentes reutilizables de Astro sin dependencias de framework. Sin React. Sin JavaScript en tiempo de ejecución más allá de scripts en línea sencillos para las interacciones de hover y clic. StateMap genera mapas coropléticos en SVG con proyecciones de d3-geo en tiempo de compilación. MoneyTrail visualiza flujos de financiamiento con actores nombrados y montos en dólares. ThenNow muestra el cambio en el tiempo entre fechas concretas. BarChart usa Chart.js. ComparisonTable, ProofPoint, WhyItMatters y FunnelChart son HTML y CSS puros. Cada componente tiene tablas alternativas para lectores de pantalla.
Controles de calidad
36,075 enlaces internos revisados en menos de 2 segundos en cada compilación. Un script de calidad de contenido valida más de 25 reglas: largo de encabezados, densidad de párrafos, texto de enlaces, número de palabras por carta, formato de fuentes. Un sistema de trinquete lleva la cuenta de advertencias. El contenido nuevo no puede subir las advertencias por encima de la línea base. El contenido antiguo queda exento. 7 flujos de GitHub Actions ejecutan despliegues programados, controles de calidad, feeds de eventos y auditorías trimestrales. Compilación completa: 432 páginas en 10 segundos.
Enlazado automático
Problema: 237 informes y 12 páginas explicativas necesitaban enlaces cruzados. Enlazar a mano no escala. Solución: un plugin de rehype se ejecuta en tiempo de compilación, revisa toda la prosa y enlaza automáticamente la primera mención de cada tema explicativo. 285 enlaces generados en cada compilación. Agregar una página explicativa nueva crea enlaces en todo el sitio en el siguiente despliegue. El plugin omite encabezados, enlaces existentes, bloques de código y props de componentes. Las frases que busca vienen del registro de páginas explicativas, no de una lista escrita a mano.
Marco de ordenamiento de contenido
Cada página sigue un arco de 6 fases respaldado por ciencias del comportamiento: Gancho (efecto de la víctima identificable), Escala (teoría de la carga cognitiva), Sistema (estructura de periodismo en acordeón), Impacto (amenaza acompañada de eficacia, según el EPPM de Witte), Dirección (investigación en periodismo de soluciones) y Cierre (efecto de recencia para colocar el llamado a la acción). El marco se adapta según el tipo de página. Las páginas explicativas abren con definiciones porque quien llegó buscó 'qué es X'. Las páginas de serie abren con una historia humana porque quien llegó viene explorando. Un solo conjunto de reglas gobierna todos los tipos de página desde una única fuente.
Los números
Los detalles
Servicios
Desarrollado con