Omnigraph
Graph engine for context assembly. Object-storage native. Agents work with graph data the way engineers work with code: branched, typed, reviewed, merged, audited, and governed.
Natural events worldwide · official and scientific sources only
Translation pending
DataTypeScript · CSSGitHub @matiastomaslopez2018OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Mapa mundial de desastres naturales en un globo 3D. Usa solo fuentes oficiales y científicas: USGS, NASA EONET, GDACS, Smithsonian GVP, PB2002 y Natural Earth.
Está construido a partir del handoff de diseño en ../design_handoff_atlas_desastres/.
npm install
npm run ingest # primera carga: últimos 30 días + capas de referencia (~25 s)
npm run backfill # opcional: último año de histórico (~2 min)
npm run dev # http://localhost:3000 → redirige a /es o /en
La base es un archivo SQLite local (data/atlas.db, ignorado por git). Si se pide un período que todavía no está cargado, se trae de la fuente en ese momento y queda guardado. Por eso el sitio funciona aunque no se haya corrido la ingesta, solo que el primer pedido de cada período tarda más.
Variables en .env.example.
fuentes oficiales ──(jobs.ts)──▶ libSQL ──(ingest.ts)──▶ /api/events, /evento/[id]
▲ │
cron (diario o c/10 min) coverage: ventanas ya cargadas por fuente
backfill histórico ingest_runs: última corrida OK/error (footer "Estado de fuentes")
runLiveIngest): cubre los últimos 30 días. USGS es incremental (updatedafter + includedeleted, así que los sismos revisados se actualizan y los eliminados se borran). EONET y GDACS vuelven a pedir los últimos días para captar los eventos que siguen activos. Las capas GVP y placas se refrescan cada 7 y 30 días.npm run backfill -- 2010 2025 [usgs,eonet,gdacs]): sismos desde M4.5 y pedidos en bloques para no pasar los límites de las APIs (USGS 20.000, EONET 5.000). Se puede retomar, porque saltea los bloques ya cargados./api/events consulta la base, aplica el merge GDACS→evento y devuelve el estado de cada fuente según su última corrida. 1 año pasó de ~25 s a ~0,2 s.fetchJson reintenta los errores de red, 429 y 5xx.| Dónde | Cómo |
|---|---|
| Vercel | vercel.json llama a /api/cron/ingest una vez por día (06:00 UTC), que es el máximo del plan Hobby. Para cada 10 min: plan Pro (cambiar el schedule a */10 * * * *) o un scheduler externo. |
| Scheduler externo | cron-job.org (gratis) u otro: GET https://<tu-sitio>/api/cron/ingest cada 10 min con el header Authorization: Bearer <CRON_SECRET>. |
| Servidor propio | INGEST_INTERVAL_MIN=10 npm start corre la ingesta dentro del proceso (src/instrumentation.ts). |
| Manual o cron del SO | npm run ingest |
En producción serverless el archivo local no persiste. Usar Turso (STORAGE_URL=libsql://…, STORAGE_AUTH_TOKEN, los nombres que crea la integración de Vercel con prefijo STORAGE; también se aceptan DATABASE_URL/DATABASE_AUTH_TOKEN y TURSO_DATABASE_URL/TURSO_AUTH_TOKEN), que habla el mismo protocolo libSQL. Sin STORAGE_URL, en Vercel se usa /tmp/atlas.db: el sitio funciona, pero cada instancia nueva arranca vacía y vuelve a pedir los datos a las fuentes.
Turso desde Vercel: en el proyecto de Vercel, Storage → Turso, con prefijo STORAGE. La integración crea STORAGE_URL y STORAGE_AUTH_TOKEN en las variables de entorno; el código las lee tal cual.
Cargar la base desde tu máquina: bajar esas variables a .env.local (no se sube a git)
npx vercel link
npx vercel env pull .env.local
y correr npm run ingest y después npm run backfill. Las tablas se crean solas en la primera conexión. Así el sitio arranca con 30 días al detalle y el último año desde M4.5, sin esperas.
Vercel: el proyecto importa el repo Desastres-Naturales desde GitHub. Framework: Next.js. El proyecto está en la raíz, no hay que cambiar nada.
Variables de entorno (Settings → Environment Variables, entorno Production):
| Variable | Valor |
|---|---|
STORAGE_URL, STORAGE_AUTH_TOKEN | las crea la integración de Turso |
CRON_SECRET | una cadena larga al azar. Sin ella, /api/cron/ingest responde 401 en producción. |
NEXT_PUBLIC_SITE_URL | opcional, solo con dominio propio. Si falta, se usa el dominio *.vercel.app de producción. |
Deploy. Cada git push a master vuelve a publicar el sitio. Para comprobarlo, abrir /es, ver que el pie diga "OK" en las tres fuentes y abrir /sitemap.xml.
Ingesta frecuente (opcional): configurar el scheduler externo de la tabla de arriba.
| Ruta | Qué hace |
|---|---|
src/app/[lang]/ | Home del mapa (/es, /en), con el período y el evento en la URL (?range=30d, ?range=year&year=2011, ?e=us6000u1yx) |
src/app/[lang]/evento/[id]/ | Ficha permalink (/es/evento/us6000u1yx, eonet-EONET_123, gdacs-TC1001335): SSR sin JS, metadatos SEO/OG/Twitter, hreflang e imagen OG 1200×630 con el globo centrado en el evento |
src/app/[lang]/ranking | Ranking de países por período (?range=30d, ?range=year&year=2011), ordenable por alertas, eventos, mayor sismo o tipo (?orden=fire) |
src/app/[lang]/pais/[iso] | Ficha de país (/es/pais/chl): alertas, puesto, mayor sismo, desglose por tipo, globo encuadrado y lista de eventos |
src/app/sitemap.ts, src/app/robots.ts | Sitemap con inicio, ranking, países con eventos en el último año y eventos destacados (alerta naranja/roja o sismo M6+), cada uno con su par ES/EN |
src/app/api/events | Eventos de un período desde la base |
src/app/api/event | Un evento por id (lo usa el mapa con ?e=id) |
src/app/api/gvp, src/app/api/plates | Capas de referencia guardadas en la base |
src/app/api/eq-detail | Incertidumbres del sismo (origin, ShakeMap, DYFI), en vivo desde USGS |
src/app/api/cron/ingest | Dispara la ingesta en vivo |
src/lib/server/sources.ts | Clientes de cada fuente y normalización al modelo unificado (src/lib/types.ts) |
src/lib/server/jobs.ts | Ingesta: bloques, cobertura, cron, backfill y completado al vuelo |
src/lib/server/db.ts | Esquema y consultas libSQL (events, coverage, ingest_runs, kv) |
src/lib/server/ingest.ts | Lectura para la web: período, merge GDACS y evento por id |
El dominio previsto es mapadedesastres.com (todavía no está comprado). Mientras NEXT_PUBLIC_SITE_URL esté vacía, las URL absolutas (canonical, sitemap, imágenes OG) usan el dominio de producción de Vercel. Para activarlo cuando se compre:
mapadedesastres.com (y www, redirigido) y configurar el DNS que indique Vercel.NEXT_PUBLIC_SITE_URL=https://mapadedesastres.com y volver a desplegar (la variable se lee al compilar).https://mapadedesastres.com/sitemap.xml.public/data/gem.json, generado con npm run gem -- <ruta al GeoTIFF> desde Zenodo, doi:10.5281/zenodo.8409647). Licencia CC BY-NC-SA 4.0: solo uso no comercial, con atribución a la GEM Foundation y compartiendo las obras derivadas con la misma licencia. Si el sitio pasa a tener fines comerciales (publicidad, venta, servicios pagos), hay que quitar la capa o pedir una licencia comercial a GEM (https://www.globalquakemodel.org/ · [email protected]). La atribución se muestra en la leyenda de la capa y en Metodología.npx tsx scripts/gem-vuln.ts a src/lib/quake/vulnerability.ts; github.com/gem/global_vulnerability_model, doi:10.5281/zenodo.8391742). Licencia CC BY-NC-SA 4.0: solo uso no comercial, como el mapa de amenaza de GEM. La atribución va en las fuentes del simulador.public/data/tsunami/etopo1-15m.bin.gz (npm run etopo); fuentes de los modelos de falla finita del USGS (dominio público) y observaciones de la base mundial de tsunamis de la NOAA NCEI en public/data/tsunami/<sismo>.json (npm run tsunami-data). npx tsx scripts/verify-okada.ts compara Okada con los datos de prueba de GeoClaw (BSD) y npx tsx scripts/verify-tsunami.ts <sismo> compara la propagación con las llegadas y alturas observadas.npm run verify-quake compara las GMPE con las tablas de prueba de OpenQuake y los tiempos de llegada con las tablas de ak135; npm run quake-obs vuelve a bajar las ShakeMap del USGS de los sismos de ejemplo a public/data/quake-obs/.s2cloudless-2020_3857). Licencia CC BY-NC-SA 4.0: solo uso no comercial, como GEM. La atribución va en el control de MapLibre y en Metodología. Alternativa comercial ya preparada en src/components/Globe.tsx: definir (plantilla de un proveedor con licencia comercial) y , o para usar solo NASA GIBS (dominio público, menos detalle de cerca).NEXT_PUBLIC_SITE_URL en producción (base de las URLs absolutas de OG y canonical)./api/events?range=1y pesa ~6,6 MB de JSON: conviene recortar campos para la lista o paginar por tipo./comparar, /linea-de-tiempo, /metodologia y /aprender/*.src/lib/server/stats.ts | Agregación por país y ranking (sismos desde M4.5) |
src/lib/countries.ts | ISO 3166-1 (numérico → alfa-3) y nombres localizados con Intl.DisplayNames |
src/components/Globe.tsx | Globo d3-geo ortográfico en canvas: arrastre, rueda, pellizco, tap, hover y vuelo |
src/components/Atlas.tsx | Filtros, overlays, "Más relevantes", ficha, cercanos y estado de fuentes |
src/app/industry.css | Sistema de diseño Industry (copiado del handoff) |
NEXT_PUBLIC_IMAGERY_URL{z}/{x}/{y}NEXT_PUBLIC_IMAGERY_ATTRIBUTIONNEXT_PUBLIC_IMAGERY=gibssrc/lib/methodSources.ts y en la página Metodología.