Infraestructura abierta y local-first para coordinar emergencias, hacer visible lo que ocurre en el territorio y demostrar cómo llega la ayuda.
pulso.my · Dirección y prioridades · Backlog · Cómo contribuir · Arquitectura
PULSO convierte señales dispersas del territorio en información útil, trazable y publicable durante una emergencia. Conecta comunidades, brigadas, profesionales, organizaciones, donantes y autoridades sin exigir conectividad permanente ni conocimientos técnicos.
La primera implementación está enfocada en Colombia, pero el protocolo puede adaptarse a terremotos, inundaciones, incendios, huracanes y otras emergencias en cualquier país.
El sistema responde seis preguntas esenciales:
- ¿Qué territorios fueron visitados y cuáles siguen sin verificar?
- ¿Qué daños fueron reportados, corroborados o validados?
- ¿Qué necesitan las comunidades y con qué prioridad?
- ¿Qué insumos y donaciones fueron recibidos, asignados o entregados?
- ¿Qué equipos están trabajando y qué evidencia respalda su actividad?
- ¿El informe público conserva la misma integridad con la que fue publicado?
Desde el cuarto día, PULSO no crea un censo digital paralelo: enlaza señales comunitarias, visitas de campo y referencias oficiales en un expediente común. Una persona puede ser atendida sin documento; una referencia no se convierte automáticamente en beneficiario y una posible duplicidad siempre pasa por revisión humana.
La portada de pulso.my está diseñada como un informe territorial abierto, no como una landing promocional. Presenta sobre un mapa:
- cobertura y zonas todavía sin verificar;
- daños y viviendas pendientes de inspección;
- necesidades, brechas e insumos en tránsito;
- donaciones registradas, conciliadas, asignadas y entregadas;
- equipos programados, desplegados y activos;
- fecha de corte, fuente y nivel de confianza de cada agregado.
La navegación sigue la jerarquía:
Colombia → departamento → municipio/distrito → ciudad/localidad → zona operativa
Las cifras que se publican salen de fuentes reales con procedencia: SGC, DANE, USGS, SECOP II, el repositorio oficial de Cali y reportes ciudadanos. Cuando un dato todavía no existe, la interfaz lo dice y explica por qué — nunca se rellena con un número de demostración. Ver 26-source-ingestion.md.
flowchart LR
A["Reporte en territorio"] --> B["Captura offline"]
B --> C["Sincronización y deduplicación"]
C --> D["Corroboración y validación"]
D --> E["Agregación segura"]
E --> F["Informe público"]
F --> G["Prueba de integridad en Solana"]
PostgreSQL/PostGIS es la fuente de verdad operacional. Solana no almacena personas, fotografías, ubicaciones de hogares ni detalles de beneficiarios: conserva únicamente compromisos criptográficos que permiten demostrar que un corte publicado no fue modificado.
| Producto | Responsabilidad |
|---|---|
| Pulso Campo | Aplicación móvil offline para brigadas, visitas, evaluaciones y evidencia. |
| Pulso Operaciones | Consola privada para coordinar equipos, priorizar zonas y revisar información. |
| Pulso Mapa | Informe público de cobertura, daños, necesidades, donaciones y equipos. |
| Pasaporte de Recuperación | Expediente versionado de cada caso, vivienda, animal o activo. |
| Pulso Verifica | Identidad, credenciales profesionales, evidencia y validación. |
| Protocolo PULSO | Contratos abiertos de datos, sincronización, auditoría e integridad. |
Los cuatro objetivos están ordenados: no son áreas paralelas, son fases de una misma cadena. Ante
dos tareas gana la de prioridad más alta, siempre. El razonamiento está en
32-direccion.md.
| Objetivo | Estado | |
|---|---|---|
| P0 | Salvar vidas — dónde hay gente atrapada y quién puede llegar | Reporte ciudadano en pie; falta la cola de coordinación |
| P1 | Saber quién quedó afectado — quiénes son y qué necesitan | Solo modelo de datos; sin API |
| P2 | Conectar la ayuda con quien la necesita | Necesidades y acopios visibles; sin emparejar |
| P3 | Trazar la plata pública — en qué se gasta y si llegó | Funcionando sobre SECOP II |
La prioridad más avanzada es la más baja de las cuatro. Está dicho a propósito: una persona bajo escombros tiene horas, un contrato mal adjudicado tiene años y tribunales, y construir en orden inverso a la urgencia es el error más fácil de cometer aquí.
| Área | Estado |
|---|---|
| Informe público y mapa | En producción con datos reales y procedencia por fuente |
| Reporte ciudadano | Rescate, PMU y necesidad; publica sin cuenta y con límite de tasa |
| Auditoría de recursos públicos | SECOP II ingerido, revisión humana y lectura previa con Claude |
| API pública de solo lectura | Implementada y cacheable |
| Mapa territorial | DANE MGN 2023: 33 departamentos y 1.121 municipios |
| Captura de campo offline | Visitas, evaluaciones, evidencia y cola IndexedDB |
| Identidad operacional | Invitaciones, sesiones, passkeys y perfiles de confianza |
| Equipos y asignaciones | Creación, membresías, aceptación e idempotencia |
| Donaciones e inventario | Modelado en migración; sin API |
| Personas y hogares afectados | Modelado en migración; sin API — es el hueco más grande |
| Fuentes conectadas | SGC, DANE, USGS, SECOP II, Cali oficial y cuatro plataformas ciudadanas |
| PostgreSQL/PostGIS | 24 migraciones aplicadas en producción |
| Solana | Programa Anchor probado en local; Devnet pendiente |
| Program ID | PuLsRBUdu4JxfP9tPU4WyNvWx7Vu2dS7NfCipm8YBmh |
PULSO no suma materiales incompatibles ni confunde promesas con entregas. Cada insumo utiliza una unidad canónica y conserva especificación, lote, inspección y movimiento.
promesa → recepción → inspección → aceptación → almacenamiento
→ asignación → despacho → entrega → confirmación
La brecha territorial se calcula así:
necesidad validada − entrega utilizable − tránsito confirmado = brecha abierta
Consulta el modelo operativo de donaciones y el informe público territorial.
El P0 usa un monolito modular con workers para mantener despliegues rápidos y transacciones simples.
| Capa | Tecnología |
|---|---|
| Web, mapa y campo | Next.js, React y TypeScript |
| Captura offline | IndexedDB y mutaciones idempotentes |
| API | Fastify y contratos Zod |
| Datos territoriales | PostgreSQL + PostGIS |
| Procesamiento asíncrono | Redis + workers |
| Evidencia | Almacenamiento compatible con S3 |
| Identidad | Passkeys/WebAuthn, roles y credenciales verificables |
| Integridad pública | Raíces Merkle ancladas por pulso_anchor en Solana |
Principio de disponibilidad: una falla de internet, Solana, RPC o relayer nunca bloquea el registro ni la atención de una emergencia.
- La vista pública utiliza agregados territoriales.
- Las ubicaciones precisas de hogares se generalizan o se ocultan.
- No se publican nombres, teléfonos, documentos ni historiales sensibles.
- Reportar, validar, asignar y confirmar entrega son responsabilidades separadas.
- Las correcciones agregan una nueva versión; no sobrescriben silenciosamente el historial.
- Blockchain prueba integridad posterior, no verdad de origen.
- Node.js 22 o superior.
- pnpm 10.
- Anchor 0.31 y Solana CLI para el programa blockchain.
- PostgreSQL/PostGIS y Redis para persistencia e integración completa.
pnpm install
cp .env.example .env
pnpm dev| Servicio | Dirección |
|---|---|
| Informe público | http://localhost:3000 |
| Pulso Campo | http://localhost:3000/field |
| Pulso Operaciones | http://localhost:3000/operations |
| API | http://localhost:3001 |
| Salud | GET http://localhost:3001/health |
| Corte público | GET http://localhost:3001/v1/public/incidents/colombia-2026/report |
| Fuente oficial Cali | GET http://localhost:3001/v1/public/sources/cali-official-earthquake-repository/snapshot |
| Eventos SGC | GET http://localhost:3001/v1/public/sources/sgc-realtime-earthquakes/snapshot |
| Geometrías DANE | GET http://localhost:3001/v1/public/incidents/colombia-2026/territories?level=department |
La API utiliza memoria para demostración. PostgreSQL se activa explícitamente después de aplicar las migraciones:
PERSISTENCE_DRIVER=postgres pnpm --filter @pulso/api devValidación completa:
pnpm check
pnpm test:solana:integrationapps/
web/ Informe público, Pulso Campo y Pulso Operaciones
api/ API operacional y API pública
worker/ Procesamiento asíncrono
blockchain/solana/ Programa de integridad pulso_anchor
packages/
domain/ Reglas y contratos de dominio
schemas/ Validación compartida
infrastructure/ PostgreSQL, PostGIS y despliegue
docs/ Producto, operación, seguridad y decisiones
research/ Investigación territorial con fuentes
Lee estos tres, en este orden. Son quince minutos y después puedes tomar un ticket sin preguntarle nada a nadie.
- Dirección y prioridades — qué se construye primero y por qué
- Backlog — los tickets, con criterios de aceptación y tamaño
- Cómo contribuir — las cuatro invariantes, ramas, revisión
- Visión y principios
- MVP de emergencia
- Investigación y despliegue en Colombia
- Plan de construcción
- Donaciones de materiales
- Experiencia de campo sin fricción
- Informe público territorial
- Día 4: personas afectadas, coordinación y ayuda trazable
- Fuentes e ingesta de datos públicos
- Fuentes conectadas y su estado
- Reportar personas atrapadas
- Lectura previa de contratos con Claude
- Arquitectura técnica
- Modelo de datos
- Sincronización offline
- Fraude y privacidad
- Seguridad de producción
- Identidad operacional
- Programa de auditoría en Solana
- Decisiones de arquitectura
- Offline-first: el trabajo de campo no depende de una conexión continua.
- Evidencia antes que afirmaciones: toda decisión importante debe justificarse.
- Historial antes que sobrescritura: corregir crea una nueva versión.
- Privacidad por diseño: transparencia no significa exposición personal.
- Cero fricción: comunidades y brigadas no necesitan wallet ni SOL.
- Estándares abiertos: los datos deben ser interoperables y exportables.
El proyecto está abierto y hay trabajo repartible ahora mismo. El camino más corto: dirección → backlog → cómo contribuir.
La coordinación ocurre en Discord; un hilo por ticket, con los mismos roles y etiquetas que en
GitHub. Ver 34-discord.md.
- Dominio oficial: pulso.my
- Implementación inicial: PULSO Colombia
- Prioridad actual: P0 — personas bajo escombros
El código está bajo Apache-2.0. La licencia de los datos publicados todavía no está decidida: hasta que exista, no asumas nada sobre reutilizarlos.
