Ajuntaweb 2.0
La segunda generación de Ajuntaweb: un CMS propio en el que el personal de un ayuntamiento publica sin aprender una herramienta, con un solo código desplegado de forma aislada para cada municipio y el cumplimiento normativo diseñado desde el principio.
Implementado de extremo a extremo y desplegado en preproducción. Lo siguiente: cerrar la revisión, migrar los contenidos de la versión 1.0 y sustituirla. Pensado desde el diseño para servir a más municipios.
- Un CMS de dominio para personal no técnico: el editor abre «Avisos» y escribe un aviso, sin taxonomías que inventar.
- Una arquitectura multimunicipio: un código, un despliegue aislado por municipio y módulos activables sin ciclos.
- Cumplimiento normativo diseñado desde el principio: sin banner de cookies por diseño, datos personales mínimos y con consentimiento, y una declaración de accesibilidad que debe completarse tras la revisión manual antes de abrir el sitio al público.
- Un método con agentes corregido con la experiencia: rebanadas verticales que el mantenedor entiende y ejecuta antes de seguir, con revisión cruzada.
Un ayuntamiento de quinientos habitantes no tiene departamento de informática. Quien mantiene el web es el secretario o el alcalde, sin formación técnica y entre otras veinte tareas. Cualquier gestor de contenidos genérico le pide que invente una estructura, y esa estructura no la va a inventar: va a dejar de actualizar el web.
Un gestor de contenidos de dominio, no genérico. El editor habitual nunca entra en el admin de Django ni decide taxonomías: abre «Avisos» y escribe un aviso. Se paga flexibilidad innecesaria a cambio de que el usuario no tenga que aprender nada, y se puede pagar porque el dominio es cerrado y lo fija la ley.
Un solo código y un despliegue por municipio: el código es compartido, y la base de datos, los medios y los estáticos viven en el directorio de cada municipio, con su usuario de sistema y su servicio. Los módulos se declaran a sí mismos y el núcleo no importa ninguno. El personal trabaja en un CMS propio; el admin de Django queda para el administrador.
- Un municipio es configuración, no un fork: la separación entre el código compartido y el directorio de cada municipio evita mantener una rama por cliente.
- Los módulos se declaran a sí mismos y el núcleo no importa ninguno; un chequeo propio lo comprueba al arrancar.
- Los recursos de la web se sirven desde el propio sitio, sin CDN. Los mapas son imágenes compuestas en el servidor con teselas de OpenStreetMap, sin peticiones del navegador del visitante al proveedor cartográfico.
Las evidencias33
- Desarrollo de CMS a medidaCódigo · Bajo petición
Cada tipo de contenido tiene su pantalla con su nombre: avisos, noticias, agenda, servicios, trámites, subvenciones. Páginas compuestas por bloques, editor enriquecido acotado y saneado, una imagen por campo optimizada al subir y reordenación arrastrando. El admin de Django queda para el administrador.
- Modelado de dominioCódigo · Bajo petición
- Arquitectura multi-tenantCódigo · Bajo petición
- Diseño modularCódigo · Bajo petición
- Cumplimiento normativo (compliance)Mejor ejemplo del portfolioDocumento · Bajo petición
- Desarrollo con agentes de código (AI-native)Decisión escrita · Bajo petición
- Revisión de código generado por IADecisión escrita · Bajo petición
- Despliegues reversibles (rollback)Código · Bajo petición
- Seguridad de aplicaciones webCódigo · Bajo petición
- Protección de datos y confidencialidadDecisión escrita · Bajo petición
- Accesibilidad webCódigo · Bajo petición
- Diseño de UX para usuarios no técnicosDecisión escrita · Bajo petición
- Renderizado en servidor (SSR)Código · Bajo petición
- Internacionalización (i18n)Código · Bajo petición
- Búsqueda de texto completo y semánticaCódigo · Bajo petición
- Métricas de producto y adopciónCódigo · Bajo petición
- Modelado minimalista (YAGNI)Documento · Bajo petición
- Gestión del alcanceDocumento · Bajo petición
- Configuración por entornoCódigo · Bajo petición
- Control de acceso y autorizaciónCódigo · Bajo petición
- Administración de servidores LinuxCódigo · Bajo petición
- Testing automatizadoCódigo · Bajo petición
- Tests de arquitectura y coherenciaCódigo · Bajo petición
- Documentación técnicaCódigo · Bajo petición
- Registros de decisiones de arquitectura (ADR)Documento · Bajo petición
- Context engineeringDocumento · Bajo petición
- Entrega rápida con IA sin perder calidadHistorial de commits · Bajo petición
- Desarrollo de productoDocumento · Bajo petición
- Dominio de administración localDocumento · Bajo petición
- Análisis de requisitos de negocioDocumento · Bajo petición
- Autonomía de extremo a extremoHistorial de commits · Bajo petición
- Transparencia técnicaDocumento · Bajo petición
- Comunicación escritaDocumento · Bajo petición
Principios que se ven aquí22
- PrincipioEl modelo de datos primero, la herramienta después
- CMS de dominio, no genérico: el editor abre «Avisos» y escribe un aviso. Sin taxonomías que inventarse
- PrincipioRigor donde importa, deuda consciente donde no — y saber decir en cuál está cada cosa
- Qué merece un test está escrito: todo defecto corregido, todo requisito legal o de seguridad y un camino feliz por flujo; nada más. Y se escriben cuando la funcionalidad ya funciona a mano
- PrincipioPrefiero lo que sobrevive diez años a lo que brilla seis meses
- Versiones fijadas a propósito, actualizar es un acto consciente; solo SQLite; ningún recurso servido desde CDN y pocas dependencias, sin nada exótico
- PrincipioUna decisión sin su porqué es una decisión que se va a repetir mal
- Criterios de diseño escritos antes de la primera línea de código, y decisiones numeradas durante el desarrollo, cada una superable sin borrar la anterior
- La documentación se ordena por cuánto dura: el cómo caduca y el porqué casi nunca, y cada criterio lleva el problema que lo motivó
- PrincipioEn producción, lo mínimo que resuelve el problema
- PWA descartada con argumento escrito, después de haberla implementado en otro proyecto donde sí tenía sentido
- PrincipioConstruyo sistemas, no piezas: diseño la siguiente fase y construyo solo la actual
- Una pieza que se justifica pero aún no hace falta se documenta como decisión y se aplaza; la migración desde la 1.0 no condiciona el diseño y se planifica al final
- PrincipioNo construyo nada que no haya entendido antes
- Tras recibir subsistemas enteros de golpe, una veintena de defectos aparecieron al leer y ejecutar el código, y ninguno en la suite: el método pasó a rebanadas verticales con ejecución propia obligatoria
- PrincipioLos agentes, más para contrastar que para producir; y lo que dicen se verifica
- Se evaluó una flota de agentes generadores y se descartó; se quedó el lector en frío, con su salida verificada
- PrincipioCada dato tiene un solo sitio donde se escribe; el resto lo lee
- Lo que por ley se publica en el portal oficial se enlaza, no se copia ni se extrae: duplicarlo sería una desincronización garantizada
- PrincipioLo que se puede calcular no se escribe a mano
- El menú del web se deriva de los módulos activos, y las plantillas no llevan contenido institucional escrito a mano
- PrincipioPrefiero un fallo visible a un éxito aparente
- La consulta por defecto oculta lo no publicado: olvidarse en la gestión se nota al momento, mientras que olvidarse en público enseñaría borradores
- Una configuración incompleta para el despliegue con un mensaje claro antes de tocar la base de datos
- PrincipioUna red de seguridad que no he visto fallar no es una red
- Una copia no probada no es una copia: la restauración completa, cronometrada, es condición para desplegar
- PrincipioLas reglas que importan las vigila una comprobación, no la memoria
- El despliegue comprueba el registro de módulos y la publicación de las páginas legales cuando la base está inicializada; las referencias de la documentación se comprueban por separado en la suite de tests
- PrincipioLo que tiene historia no se borra; lo que nunca fue, sí
- Lo que el canal oficial retira al vencer el plazo, la web lo conserva como histórico consultable
- PrincipioConstruyo donde vive el conocimiento del negocio; lo demás se compra o se enlaza
- No se construye lo que ya ofrece la administración: se enlaza
- PrincipioConsistente antes que ingenioso: lo nuevo hereda el molde de lo que ya funcionó
- El mismo nombre de campo en todos los modelos aunque la gramática pida otro, y una opción más limpia descartada por apartarse de la convención del framework
- PrincipioEl sistema no promete lo que no hace
- Se retiró una portabilidad «garantizada» a otro motor de base de datos porque ningún procedimiento la respaldaba; y una política de retención que nadie ejecuta bloquea la puesta en producción
- PrincipioUn «no» lleva escrita la condición que lo reabriría
- Una lista de pendientes donde cada entrada dice cuándo bloquea, y unos descartes que dicen qué haría falta para volver sobre ellos
- PrincipioLa documentación es el contexto de quien viene detrás, y cambia en el mismo paso que el código
- Tests comprueban rutas a ficheros, enlaces locales entre documentos, nombres de pruebas y comandos citados en la documentación
- PrincipioPrimero la cadena hasta producción, después el producto
- La máquina con servicios, certificados y copias funcionando antes del primer modelo
- PrincipioNada existe sin consumidor
- Ningún campo sin consumidor: si no se publica ni se usa, no existe; y una protección escrita pero nunca conectada se eliminó
- PrincipioDel dato personal, solo el que sirve a un propósito, durante un plazo y a la vista
- Las estadísticas de visitas son contadores agregados, sin IP, sin User-Agent en bruto ni identificadores individuales y sin cookies de analítica; los datos de particulares solo entran con consentimiento registrado