¿Qué está pasando a mi alrededor ahora mismo?
🔥 Incendios · 🚧 Tráfico · 🌡️ Meteorología · 🌫️ Calidad del aire · 🚆 Trenes · 🏚️ Terremotos · ⚡ Energía · 🏖️ Playas
Un agregador OSINT geográfico en tiempo real que une 15 fuentes de datos públicos y oficiales en un solo mapa interactivo con niveles de severidad, mediciones continuas y alertas personalizables. Funciona como una PWA instalable y offline.
💡 ¿Qué es esto en la práctica? En vez de revisar cinco apps distintas para saber si hay un incendio cerca, un retraso de tren, una alerta meteorológica o un corte de tráfico, NearMe lo agrupa todo en un flujo único de eventos geolocalizados.
| 🗺️ Mapa en tiempo real | Leaflet + MarkerCluster, iconos por tipo de evento y severidad |
| 🔥 Incendios por satélite | NASA FIRMS (MODIS + VIIRS) con mapa de calor y gradiente por potencia (FRP) |
| 🚧 Tráfico | DGT DATEX II: cortes, obras, accidentes y retenciones en la red estatal |
| 🚆 Trenes | Retrasos RENFE geolocalizados vía GTFS-RT (cercanías + AV/LD) |
| 🌡️ Meteorología | AEMET: 10.600 estaciones con informes continuos + alertas |
| 🌫️ Calidad del aire | MITECO ICA + OpenAQ (6 parámetros) |
| 🏚️ Sismología | IGN (red nacional 24/7) + USGS (global M2.5+) |
| ⚡ Energía | Demanda eléctrica REE + precio PVPC (ESIOS) en tiempo real |
| 🏖️ Playas | Estado de playas del País Vasco (bandera, oleaje, medusas) |
| ☀️ Índice UV | Open-Meteo para 52 capitales + Ceuta/Melilla |
| 🔔 Alertas personalizadas | Por tipo, radio y nivel con notificaciones del navegador |
| 📍 POI cercanos | Hospitales, farmacias, gasolineras y más (Overpass/OSM) |
| 📤 Compartir | Texto dinámico + Web Share API con enlaces a 𝕏, WhatsApp, Telegram, Bluesky y Mastodon |
| 🟢 Estado del sistema | Semáforo por fuente, freshness badges y health indicator |
| 📱 PWA | Instalable, offline, auto-refresh cada 5 minutos |
| 🔒 Privacidad | Sin analytics, sin tracking, sin cookies, sin IPs |
[15 colectores async] → [Pipeline (asyncio.gather)] → [PostgreSQL + PostGIS] → [FastAPI] → [Frontend Leaflet]
Cada ciclo de 15 minutos procesa ~6.000+ eventos:
| Fuente | Qué aporta | Autenticación | Actualización |
|---|---|---|---|
| NASA FIRMS | 🔥 Incendios satélite (MODIS+VIIRS) | Sin clave | 15 min |
| DGT | 🚧 Incidencias tráfico (DATEX II) | Sin clave | 5 min |
| AEMET | 🌡️ Meteo continuo + alertas (10.600 est.) | API Key | 15 min |
| RENFE | 🚆 Retrasos tren (GTFS-RT) | Sin clave | 15 min |
| MITECO | 🌫️ Calidad del aire ICA (620 est.) | Sin clave | 30 min |
| OpenAQ | 🌫️ Calidad del aire (6 parámetros, v3) | API Key | 30 min |
| USGS | 🏚️ Terremotos M2.5+ globales | Sin clave | 15 min |
| Protección Civil | ⚠️ Avisos meteorológicos (CAP/AEMET) | API Key | 30 min |
| REE | ⚡ Demanda eléctrica tiempo real | Sin clave | 15 min |
| IntelHub | 📰 Noticias + incendios RSS (24 fuentes, 9 países) | Sin clave | 10 min |
| Playas Euskadi | 🏖️ Bandera, oleaje, temperatura, medusas | Sin clave | 60 min |
| Embalses | 🌊 Nivel de embalses (MITECO SAIH) | Sin clave | 30 min |
| IGN | 🏚️ Sismología española (red 24/7) | Sin clave | 15 min |
| Open-Meteo | ☀️ Índice UV máximo (52 capitales) | Sin clave | 60 min |
| REE + ESIOS | ⚡ Demanda y precio PVPC | Sin clave | 15 min |
(source, source_id)expires_atresolve_events() lo marca como resolvedend_time de la fuente (p. ej. DGT overallEndTime)| Nivel | Color | Ejemplo |
|---|---|---|
info | 🔵 Azul | Datos normales (clima, calidad del aire) |
warning | 🟡 Amarillo | Precauciones (ICA ≥ 3, temperatura ≥ 35 °C) |
alert | 🟠 Naranja | Peligro (FRP ≥ 100 MW, terremoto ≥ M5) |
critical | 🔴 Rojo | Emergencia (severidad DGT highest) |
Cada evento lleva un badge según su updated_at: 🟢 <30 min · 🟠 30 min–2 h · 🔴 >2 h. El sidebar muestra un semáforo por fuente (🟢🟡🔴) actualizado cada 60 s desde /api/status.
Además del mapa en vivo, NearMe genera analítica agregada nocturna:
zone_metrics — tabla diaria por CCAA: volumen de eventos, niveles de severidad,
diversidad de fuentes, persistencia media e índice de convergencia (coincidencias
espaciales <50 km y temporales <6 h entre fuentes distintas). Colector:
scripts/compute_zone_metrics.py (cron 23:40, transacción por día).*/15 * * * * + monitoreo persistente en collector_runsnearme-api) · rsyncnearme-osint/
├── run.py # Orquestador del pipeline (colectores async)
├── src/
│ ├── api/server.py # FastAPI (frontend + API + auth)
│ ├── db.py # PostgreSQL/PostGIS con connection pooling
│ ├── config.py # Constantes centralizadas (umbrales, URLs, TTLs)
│ ├── logging.py # Logging JSON estructurado
│ ├── metrics.py # PipelineMetrics (latencia y éxito por colector)
│ ├── models.py # Event dataclass + EVENT_TYPES
│ └── collectors/
│ ├── aemet/ # Meteorología (observaciones + alertas)
│ ├── dgt/ # Tráfico DATEX II + USGS + NASA FIRMS
│ ├── renfe/ # Retrasos tren (GTFS-RT + CSV estaciones)
│ ├── ree/ # Demanda eléctrica
│ ├── miteco/ # Calidad del aire (ICA)
│ ├── openaq/ # Calidad del aire (fallback, 6 parámetros)
│ ├── proteccion_civil/ # Avisos meteorológicos (CAP)
│ ├── intelhub_bridge.py # Noticias/incendios RSS (IntelHub)
│ ├── playas/ # Estado de playas Euskadi
│ ├── embalses/ # Nivel de embalses (SAIH + MITECO)
│ ├── ign/ # Sismología española (red 24/7)
│ ├── uv/ # Índice UV (Open-Meteo)
│ ├── energy/ # Demanda REE + precio PVPC (ESIOS)
│ └── copernicus/ # Incendios GWIS (endpoints 404 — deshabilitado)
├── frontend/ # Leaflet + MarkerCluster + vanilla JS (PWA)
├── analytics/ # Reporte GoAccess (basic auth)
├── deploy.sh # rsync + PM2 restart
├── setup-server.sh # Provisionamiento del servidor
├── requirements.txt
├── .env.example # Template de credenciales (gitignored)
└── WAYAHEAD.md # Bitácora de desarrollo y sprints
| Endpoint | Descripción |
|---|---|
GET /api/nearby | Eventos activos (radio, tipos, niveles) |
GET /api/status | Estado por colector (último run, latencia, stats 24 h) |
GET /api/status/runs?n=50 | Últimas ejecuciones del pipeline |
GET /api/metrics | Resumen agregado del pipeline |
GET /api/poi | Puntos de interés cercanos (proxy Overpass/OSM, con caché) |
GET /api/stats | Visitas (total, hoy, ayer) |
GET /health | Estado de BD, pipeline y último run |
Panel de operaciones: /admin (protegido con ADMIN_PASSWORD).
git clone git@github.com:mcasrom/nearme-osint.git
cd nearme-osint
# 1. Credenciales (AEMET_API_KEY, OPENAQ_API_KEY, DB_*, JWT_SECRET, ADMIN_PASSWORD)
cp .env.example .env
# 2. PostgreSQL con PostGIS
# (ver setup-server.sh para el aprovisionamiento completo)
# 3. Instalar dependencias
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# 4. Ejecutar el pipeline (recolección → PostGIS)
python run.py
# 5. Arrancar la API
uvicorn src.api.server:app --host 0.0.0.0 --port 8100
¿Te interesa el OSINT de código abierto o los datos abiertos de España? Todas las contribuciones son bienvenidas:
BaseCollector con async collect() → list[Event], regístralo en run.py y añade su config en src/config.pyWAYAHEAD.md para el contexto de desarrollo y sprintsSin analytics, sin tracking, sin cookies, sin publicidad. Solo se guardan datos mínimos (usuario, email opcional y hash bcrypt) exclusivamente para el sistema de alertas y las ubicaciones favoritas. Sin IPs, sin geolocalización del usuario. Detalles en la app.
Hecho por un desarrollador independiente en España. Si te resulta útil:
Contacto: nearme@viajeinteligencia.com
MIT — libre de usar, auditar y modificar. Las fuentes de datos conservan sus propias licencias.
/embed.html — mapa en vivo embebible (solo mapa + crédito fijo)./incrustar — página howto para el usuario final (zona → código → colocación → ajustes).<iframe src="https://nearme.viajeinteligencia.com/embed.html?lat=..&lon=..&radius=30" width="100%" height="500"></iframe>En el footer: enlaces directos a Radar (emergencias), Noticias, Datos por país y Ecosistema. Los enlaces siguen los journeys reales de los usuarios.
148 commits
HTML
74.4%
Python
24.2%
¿Qué está pasando a mi alrededor ahora mismo?
🔥 Incendios · 🚧 Tráfico · 🌡️ Meteorología · 🌫️ Calidad del aire · 🚆 Trenes · 🏚️ Terremotos · ⚡ Energía · 🏖️ Playas
Un agregador OSINT geográfico en tiempo real que une 15 fuentes de datos públicos y oficiales en un solo mapa interactivo con niveles de severidad, mediciones continuas y alertas personalizables. Funciona como una PWA instalable y offline.
💡 ¿Qué es esto en la práctica? En vez de revisar cinco apps distintas para saber si hay un incendio cerca, un retraso de tren, una alerta meteorológica o un corte de tráfico, NearMe lo agrupa todo en un flujo único de eventos geolocalizados.
| 🗺️ Mapa en tiempo real | Leaflet + MarkerCluster, iconos por tipo de evento y severidad |
| 🔥 Incendios por satélite | NASA FIRMS (MODIS + VIIRS) con mapa de calor y gradiente por potencia (FRP) |
| 🚧 Tráfico | DGT DATEX II: cortes, obras, accidentes y retenciones en la red estatal |
| 🚆 Trenes | Retrasos RENFE geolocalizados vía GTFS-RT (cercanías + AV/LD) |
| 🌡️ Meteorología | AEMET: 10.600 estaciones con informes continuos + alertas |
| 🌫️ Calidad del aire | MITECO ICA + OpenAQ (6 parámetros) |
| 🏚️ Sismología | IGN (red nacional 24/7) + USGS (global M2.5+) |
| ⚡ Energía | Demanda eléctrica REE + precio PVPC (ESIOS) en tiempo real |
| 🏖️ Playas | Estado de playas del País Vasco (bandera, oleaje, medusas) |
| ☀️ Índice UV | Open-Meteo para 52 capitales + Ceuta/Melilla |
| 🔔 Alertas personalizadas | Por tipo, radio y nivel con notificaciones del navegador |
| 📍 POI cercanos | Hospitales, farmacias, gasolineras y más (Overpass/OSM) |
| 📤 Compartir | Texto dinámico + Web Share API con enlaces a 𝕏, WhatsApp, Telegram, Bluesky y Mastodon |
| 🟢 Estado del sistema | Semáforo por fuente, freshness badges y health indicator |
| 📱 PWA | Instalable, offline, auto-refresh cada 5 minutos |
| 🔒 Privacidad | Sin analytics, sin tracking, sin cookies, sin IPs |
[15 colectores async] → [Pipeline (asyncio.gather)] → [PostgreSQL + PostGIS] → [FastAPI] → [Frontend Leaflet]
Cada ciclo de 15 minutos procesa ~6.000+ eventos:
| Fuente | Qué aporta | Autenticación | Actualización |
|---|---|---|---|
| NASA FIRMS | 🔥 Incendios satélite (MODIS+VIIRS) | Sin clave | 15 min |
| DGT | 🚧 Incidencias tráfico (DATEX II) | Sin clave | 5 min |
| AEMET | 🌡️ Meteo continuo + alertas (10.600 est.) | API Key | 15 min |
| RENFE | 🚆 Retrasos tren (GTFS-RT) | Sin clave | 15 min |
| MITECO | 🌫️ Calidad del aire ICA (620 est.) | Sin clave | 30 min |
| OpenAQ | 🌫️ Calidad del aire (6 parámetros, v3) | API Key | 30 min |
| USGS | 🏚️ Terremotos M2.5+ globales | Sin clave | 15 min |
| Protección Civil | ⚠️ Avisos meteorológicos (CAP/AEMET) | API Key | 30 min |
| REE | ⚡ Demanda eléctrica tiempo real | Sin clave | 15 min |
| IntelHub | 📰 Noticias + incendios RSS (24 fuentes, 9 países) | Sin clave | 10 min |
| Playas Euskadi | 🏖️ Bandera, oleaje, temperatura, medusas | Sin clave | 60 min |
| Embalses | 🌊 Nivel de embalses (MITECO SAIH) | Sin clave | 30 min |
| IGN | 🏚️ Sismología española (red 24/7) | Sin clave | 15 min |
| Open-Meteo | ☀️ Índice UV máximo (52 capitales) | Sin clave | 60 min |
| REE + ESIOS | ⚡ Demanda y precio PVPC | Sin clave | 15 min |
(source, source_id)expires_atresolve_events() lo marca como resolvedend_time de la fuente (p. ej. DGT overallEndTime)| Nivel | Color | Ejemplo |
|---|---|---|
info | 🔵 Azul | Datos normales (clima, calidad del aire) |
warning | 🟡 Amarillo | Precauciones (ICA ≥ 3, temperatura ≥ 35 °C) |
alert | 🟠 Naranja | Peligro (FRP ≥ 100 MW, terremoto ≥ M5) |
critical | 🔴 Rojo | Emergencia (severidad DGT highest) |
Cada evento lleva un badge según su updated_at: 🟢 <30 min · 🟠 30 min–2 h · 🔴 >2 h. El sidebar muestra un semáforo por fuente (🟢🟡🔴) actualizado cada 60 s desde /api/status.
Además del mapa en vivo, NearMe genera analítica agregada nocturna:
zone_metrics — tabla diaria por CCAA: volumen de eventos, niveles de severidad,
diversidad de fuentes, persistencia media e índice de convergencia (coincidencias
espaciales <50 km y temporales <6 h entre fuentes distintas). Colector:
scripts/compute_zone_metrics.py (cron 23:40, transacción por día).*/15 * * * * + monitoreo persistente en collector_runsnearme-api) · rsyncnearme-osint/
├── run.py # Orquestador del pipeline (colectores async)
├── src/
│ ├── api/server.py # FastAPI (frontend + API + auth)
│ ├── db.py # PostgreSQL/PostGIS con connection pooling
│ ├── config.py # Constantes centralizadas (umbrales, URLs, TTLs)
│ ├── logging.py # Logging JSON estructurado
│ ├── metrics.py # PipelineMetrics (latencia y éxito por colector)
│ ├── models.py # Event dataclass + EVENT_TYPES
│ └── collectors/
│ ├── aemet/ # Meteorología (observaciones + alertas)
│ ├── dgt/ # Tráfico DATEX II + USGS + NASA FIRMS
│ ├── renfe/ # Retrasos tren (GTFS-RT + CSV estaciones)
│ ├── ree/ # Demanda eléctrica
│ ├── miteco/ # Calidad del aire (ICA)
│ ├── openaq/ # Calidad del aire (fallback, 6 parámetros)
│ ├── proteccion_civil/ # Avisos meteorológicos (CAP)
│ ├── intelhub_bridge.py # Noticias/incendios RSS (IntelHub)
│ ├── playas/ # Estado de playas Euskadi
│ ├── embalses/ # Nivel de embalses (SAIH + MITECO)
│ ├── ign/ # Sismología española (red 24/7)
│ ├── uv/ # Índice UV (Open-Meteo)
│ ├── energy/ # Demanda REE + precio PVPC (ESIOS)
│ └── copernicus/ # Incendios GWIS (endpoints 404 — deshabilitado)
├── frontend/ # Leaflet + MarkerCluster + vanilla JS (PWA)
├── analytics/ # Reporte GoAccess (basic auth)
├── deploy.sh # rsync + PM2 restart
├── setup-server.sh # Provisionamiento del servidor
├── requirements.txt
├── .env.example # Template de credenciales (gitignored)
└── WAYAHEAD.md # Bitácora de desarrollo y sprints
| Endpoint | Descripción |
|---|---|
GET /api/nearby | Eventos activos (radio, tipos, niveles) |
GET /api/status | Estado por colector (último run, latencia, stats 24 h) |
GET /api/status/runs?n=50 | Últimas ejecuciones del pipeline |
GET /api/metrics | Resumen agregado del pipeline |
GET /api/poi | Puntos de interés cercanos (proxy Overpass/OSM, con caché) |
GET /api/stats | Visitas (total, hoy, ayer) |
GET /health | Estado de BD, pipeline y último run |
Panel de operaciones: /admin (protegido con ADMIN_PASSWORD).
git clone git@github.com:mcasrom/nearme-osint.git
cd nearme-osint
# 1. Credenciales (AEMET_API_KEY, OPENAQ_API_KEY, DB_*, JWT_SECRET, ADMIN_PASSWORD)
cp .env.example .env
# 2. PostgreSQL con PostGIS
# (ver setup-server.sh para el aprovisionamiento completo)
# 3. Instalar dependencias
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# 4. Ejecutar el pipeline (recolección → PostGIS)
python run.py
# 5. Arrancar la API
uvicorn src.api.server:app --host 0.0.0.0 --port 8100
¿Te interesa el OSINT de código abierto o los datos abiertos de España? Todas las contribuciones son bienvenidas:
BaseCollector con async collect() → list[Event], regístralo en run.py y añade su config en src/config.pyWAYAHEAD.md para el contexto de desarrollo y sprintsSin analytics, sin tracking, sin cookies, sin publicidad. Solo se guardan datos mínimos (usuario, email opcional y hash bcrypt) exclusivamente para el sistema de alertas y las ubicaciones favoritas. Sin IPs, sin geolocalización del usuario. Detalles en la app.
Hecho por un desarrollador independiente en España. Si te resulta útil:
Contacto: nearme@viajeinteligencia.com
MIT — libre de usar, auditar y modificar. Las fuentes de datos conservan sus propias licencias.
/embed.html — mapa en vivo embebible (solo mapa + crédito fijo)./incrustar — página howto para el usuario final (zona → código → colocación → ajustes).<iframe src="https://nearme.viajeinteligencia.com/embed.html?lat=..&lon=..&radius=30" width="100%" height="500"></iframe>En el footer: enlaces directos a Radar (emergencias), Noticias, Datos por país y Ecosistema. Los enlaces siguen los journeys reales de los usuarios.
148 commits
HTML
74.4%
Python
24.2%