Survival LLM
A free AI assistant and survival library (1.5 million offline articles) that runs on your own computer, with no internet. Shows the source of every answer. Mac and Windows.
翻译准备中
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Observatorio cívico y sistema de alerta temprana ante réplicas y eventos sísmicos en la República de Panamá.
Desarrollado por Humberto Antonio (@humbertiex).
🌐 Sitio Web Oficial en Producción: ojopanama.com
Tras el histórico sismo de Magnitud 7.7 ocurrido frente a las costas del Pacífico de Panamá el 9 de octubre de 2026, nació Sismo Panamá como una iniciativa cívica de código abierto para entregar información científica verificada y alertas sonoras inmediatas a la ciudadanía sin depender de tiendas de aplicaciones de pago.
Triangulación Multifuente 24/7:
Alertas Web Push en Segundo Plano (Sin App Store):
Mapa Interactivo y Filtros Geográficos:
Panel de Análisis Científico (/analisis):
Diseñado para Emergencias y Ahorro Extremo de Recursos:
Sismos por provincia y comarca (/sismos):
pg_cron).git clone https://github.com/Humbertoo28/sismopanama.git
cd sismopanama
npm install
Copia el archivo de ejemplo y configura tus credenciales:
cp .env.example .env.local
Genera tus claves VAPID para notificaciones:
npx web-push generate-vapid-keys
Ejecuta el archivo supabase/schema.sql en el Editor SQL de tu proyecto en Supabase para crear las tablas push_subscriptions y notified_quakes con sus políticas RLS.
npm run dev
Abre http://localhost:5173 en tu navegador.
Qué pasaba. En la ventana de alertas, el botón «Activar 24/7» podía quedarse en «Conectando…» sin terminar, con «No activado», y la revisión de abajo seguía diciendo «Falta dar el permiso» aunque el permiso ya estuviera dado.
Causa. Crear la suscripción depende de pasos que el teléfono puede no contestar nunca: que el service worker esté listo y que el servicio de notificaciones de Apple o Google responda. Ninguno tenía tiempo límite, así que la espera no terminaba y no se sabía cuál fallaba. Además la revisión leía el permiso una sola vez, al abrirse.
Qué se cambió (lib/alert-system.ts, app/alert-modal.tsx, app/push-diagnostics.tsx):
Qué hacer si aparece un mensaje:
| Mensaje | Qué hacer |
|---|---|
| «El servicio de alertas de la app no arrancó…» | Cerrar la app por completo (deslizarla hacia arriba en el selector de apps), abrirla y pulsar «Activar 24/7». |
| «Tu teléfono no terminó de crear la suscripción…» | Lo mismo; si sigue igual, pulsar «Reparar» en la revisión de abajo. |
| «No se pudo pedir al servidor la clave…» o «El servidor no respondió a tiempo…» | Revisar la conexión y volver a intentarlo. |
iPhone. Instala la app desde https://www.ojopanama.com. Las direcciones ojopanama.com y sismopanama.vercel.app redirigen (308) a www, y un service worker no se puede registrar detrás de una redirección: si la app se instaló desde una de ellas, bórrala de la pantalla de inicio y vuelve a instalarla desde www. (Esta causa no está confirmada en un iPhone real; es la recomendación segura.)
Android, sobre todo Honor (MagicOS). Si el teléfono acepta las alertas pero no sale nada con la app cerrada:
jmtNN.google.com, así que quien se suscribió antes quedó sin guardar. Desde ese arreglo, al abrir la página se vuelve a registrar sola; no hace falta hacer nada más.Qué se cambió en la app (app/push-diagnostics.tsx): la revisión «¿No te llegan las alertas con la app cerrada?» ahora trae, en Android, una guía propia para Honor y Huawei (MagicOS / EMUI) con los pasos de batería de arriba, la indicación de bloquear Chrome en las apps recientes y la recomendación de usar Chrome. Antes solo mencionaba Xiaomi, Huawei y Samsung.
El servidor no es el cuello de botella: en cada sismo Google (FCM) y Apple aceptan más del 99.9 % de los envíos (13 de octubre, 13:36 UTC, sismo M 4.1: 28 172 de 28 213; las 41 rechazadas son casi todas suscripciones caducadas que se dan de baja). Que Google lo acepte no garantiza que el teléfono lo muestre: si MagicOS tiene cerrado Chrome, el aviso no aparece.
Cómo se probó. En el navegador de escritorio, simulando un service worker que nunca arranca y un servicio de notificaciones que nunca contesta: el botón se recupera a los 16 s y a los 20 s con el mensaje correspondiente, y el camino normal (todo responde) sigue suscribiendo en menos de 1 s. No se ha probado todavía en un iPhone real.
Todas las gráficas usan solo sismos que los catálogos (USGS, IGC, EMSC) ya publicaron: las animaciones y la interacción no calculan, estiman ni proyectan nada. La reproducción de la secuencia, por ejemplo, muestra los sismos reales en su orden real; lo único comprimido es el tiempo de la animación.
Qué cambió en cada gráfica
| Gráfica | Ahora |
|---|---|
Línea de tiempo (/analisis) | Los puntos entran en orden cronológico (~0.9 s), crecen al pasar el cursor, hay una cruz punteada que sigue al cursor y los sismos nuevos llevan un aro que se expande 3 veces. Acercar, alejar y desplazar la ventana de tiempo con botones, arrastrando (si está acercada) o con Ctrl/⌘ + rueda (la rueda normal sigue haciendo scroll); ventana mínima de 5 min; la transición es suave y solo se dibujan los puntos de la ventana. Reproducir secuencia: los sismos aparecen uno a uno con su lectura (magnitud, lugar, día y hora) y una onda; dura entre 5 y 18 s (505 sismos: 18 s), con Pausar / Seguir / Reiniciar / Detener, y se puede ver en pantalla completa (más abajo). El eje de magnitud no se mueve al acercar ni al reproducir. |
| Actividad (barras y acumulado) | Las barras crecen y el área acumulada se dibuja al cargar o cambiar de gráfico. Elegir un intervalo (clic, o flechas + Enter con el teclado) lo resalta, acerca la línea de tiempo a ese tramo y filtra la tabla. |
| Magnitudes y Profundidad | Las barras crecen y los números cuentan cuando la gráfica llega a la pantalla. Cada fila es un botón: al elegirla se resaltan esos sismos en la línea de tiempo (los demás se apagan) y la tabla muestra solo esos. |
| Indicadores | Los números cuentan hacia su valor y las tarjetas entran escalonadas. |
| Detalle del sismo | Botones Anterior / Siguiente para recorrer los sismos en el tiempo, dentro de lo que esté seleccionado; si queda fuera de la ventana acercada, la ventana se corre hasta él. |
| Secuencia (página principal) | En la vista «Por horas» las barras crecen desde la izquierda, una fila tras otra. (La vista «Cada sismo» ya tenía su animación.) |
Historia sísmica (/historia) | Los puntos del mapa y los números del mapa de los 12 mayores aparecen uno tras otro y reaccionan al cursor; el sismo de 2026 late; las barras de las décadas crecen al llegar a la pantalla (en navegadores sin esa función, al cargar). Solo CSS. |
Selección cruzada. Solo hay una selección a la vez (un intervalo, una banda de magnitud o una de profundidad). Aparece un aviso «Intervalo / Magnitud / Profundidad: … · N de M sismos resaltados» con Quitar selección; cambiar un filtro (periodo, magnitud, fuentes) la quita y deshace el zoom. Las bandas tienen min incluido y max excluido (lib/analytics.ts), la misma regla de las barras, así que lo resaltado coincide exactamente con el número de cada barra.
Pantalla completa de la línea de tiempo (publicada el 13 de octubre de 2026 en el commit 4b64d5d, verificada en producción: el botón existe, la gráfica pasa de 320 a 682 px de alto y Escape la cierra; la reproducción) de la secuencia pasa rápido en una tarjeta pequeña; así se ve grande). Botón «Pantalla completa» junto a los controles (en el teléfono, solo el icono). Usa la pantalla completa del navegador y, si no la concede (iPhone, navegadores integrados), la línea de tiempo se amplía sobre toda la página: es el mismo criterio que la pantalla completa del mapa (app/quake-map.tsx).
role="dialog", aria-modal).Accesibilidad y movimiento
app/analisis/motion.tsx).aria-pressed); todos los controles miden 40 px o más; la reproducción anuncia solo su inicio y su final (no cada sismo) por aria-live./analisis tenía texto gris sobre la banda azul del sitio (contraste 2.3; el mínimo es 4.5) y ya estaba así en producción; ahora usa los colores claros del pie del sitio.Cómo se probó
next build + next start, que aplica la política de seguridad de producción): elegir intervalos y bandas con el ratón y con el teclado, acercar/alejar/desplazar con botones, arrastre y Ctrl + rueda, Anterior/Siguiente, quitar la selección, y la reproducción de 39 y 505 sismos en desarrollo (505 en ~18 s a ritmo constante; la animación usa un reloj real, así que si el navegador va lento muestra varios sismos juntos en vez de alargarse) y de 229 en producción (arranque, avance y «Detener»). También: la ventana mínima de 5 min, que al elegir un sismo fuera de la ventana esta se corre hasta él, que cambiar el periodo quita zoom y selección, la cruz punteada y el crecimiento del punto con un cursor real, el aro de un sismo nuevo (se simuló la llegada de uno falso, rotulado «PRUEBA LOCAL», solo en la pestaña de prueba) y que durante la reproducción la lectura no se anuncia a los lectores de pantalla (solo «Reproducción iniciada» y su final). Sin errores nuevos en la consola ni bloqueos de la política de seguridad./analisis en escritorio (estado inicial, con selección y detalle, y durante la reproducción), en teléfono de 375 px (inicial y con selección), con el texto al 130 % (sin desborde horizontal) y en /historia (escritorio).Lo que no se ha probado: en un teléfono real, con VoiceOver o TalkBack, ni en Safari ni Firefox (solo Chromium). La pantalla completa nativa real (la que oculta la barra del navegador) no se vio funcionando en ningún navegador, ni el respaldo en un iPhone o iPad. Con 500 puntos la reproducción corrió a ~37 cuadros por segundo en desarrollo; no se midió en producción ni en teléfonos de gama baja, ni con más de ~1 000 sismos. En la prueba de producción el aviso de la selección y la reproducción se comprobaron, pero no se repitió la auditoría de axe en ese modo.
Rendimiento (medido en una compilación de producción local; la carga de red y el procesador de un teléfono real no se midieron)
| Qué | Antes | Ahora |
|---|---|---|
JavaScript inicial de /analisis (comprimido) | 326 KB en 11 archivos (Recharts dentro del archivo principal, 116 KB) | 218 KB (−33 %); Recharts va en un archivo propio de 106 KB que se pide aparte |
| Para comparar, otras páginas | / 273 KB · /historia 209 KB | sin cambios |
| Cuándo está listo el código de las gráficas | con el resto | 10–30 ms después de hidratar, mucho antes de que lleguen los datos (los datos tardaron ~470 ms con el servidor en frío) |
| Aviso de «Nuevo sismo» | quedaba debajo de la cabecera fija del sitio (la cabecera tiene z-index: 1000, el aviso 50) y su botón de cerrar no se podía tocar | aparece debajo de la cabecera; se puede cerrar; axe da 0 con el aviso visible, en escritorio y en teléfono |
dashboard.tsx empieza a bajar charts.tsx y timeline-panel.tsx con import() al abrir la página, en paralelo con la consulta de los datos, y guarda los módulos en un estado. Mientras llegan se ve un marco del mismo alto (la página no salta); si fallan, un mensaje con «Reintentar». La leyenda y las barras de magnitud y profundidad no usan Recharts y viven en app/analisis/bars.tsx, así que no esperan a la librería.next/dynamic. Se probó primero y a veces retrasaba las gráficas unos 300 ms aunque el archivo ya estuviera descargado: React espera antes de cambiar un marco de «cargando» por su contenido. Con el estado explícito las gráficas aparecen 11–44 ms después de los datos.memo evita redibujar los que no cambiaron. No se midió una mejora: elegir un punto cuesta ~54 ms antes y ahora, elegir una banda 42 → 39 ms, quitar la selección 59 → 46 ms, dentro del ruido. Ese costo es de Recharts, no de los puntos.Archivos: app/analisis/charts.tsx (gráficas), app/analisis/bars.tsx (leyenda y barras horizontales), app/analisis/timeline-panel.tsx (zoom, desplazamiento, reproducción y pantalla completa), app/analisis/motion.tsx (reducir movimiento y «visto en pantalla»), app/analisis/dashboard.tsx (selección cruzada), app/analisis/analisis.css, lib/analytics.ts (rangos de las bandas), app/analisis/format.ts (pasos de 1, 2 y 5 min en el eje), app/sequence-chart.tsx y app/globals.css, app/historia/*.
Qué pasó (13 de octubre de 2026). A las 16:25 (hora de Panamá) el EMSC publicó un «M 4.0» en el golfo, a ~11 km de Juan Díaz (la web lo rotulaba «Cerca de Juan Díaz» por la localidad más cercana). A las 16:37 el cron lo envió como alerta a 29 198 dispositivos. Lo traía un solo catálogo (el EMSC, con autor «UNA»); el IGC, que según nuestros datos no lo tenía, lo desmintió. Lo que sí se comprobó con los datos: la tabla del IGC no tiene ninguna fila a esa hora, el USGS no tiene nada en la zona y 87 s antes (21:24:21 UTC) hubo un M 4.8 a 162 km de profundidad en el norte de Colombia, así que parece una asociación falsa de las ondas de ese sismo lejano (una hipótesis, no un hecho). No se encontró un desmentido público del IGC: se basa en lo que informó quien administra el sitio.
Por qué pudo pasar. lib/push-check.ts avisaba cualquier sismo de M 3 o más de cualquier catálogo, también de uno solo. Los 12 sismos que solo trae el EMSC entre el 9 y el 13 de octubre son todos de «UNA» (de los 97 que UNA publicó en la región, 85 sí están en el IGC); los otros 11 caen en el Pacífico sur, no cerca de la capital. En las últimas 24 horas de registros de Vercel fue el único aviso nacido de un registro EMSC (los registros solo llegan a 24 h, no se pudo mirar antes).
Qué cambió.
/analisis (los datos son los de los catálogos), pero con el rótulo «Sin confirmar · solo EMSC»; en la ficha dice que puede ser una detección errónea y, si es menor de M 5, que no se avisa por alerta hasta que alguien lo confirme.RETRACTED_EVENTS en lib/catalogs.ts (emsc:2074346, con su motivo): como todo en la web sale de esa consulta, ya no aparece en el mapa, la lista, la ficha, /analisis, los conteos de réplicas ni los reportes «¿Lo sentiste?», ni se avisa. Es un retiro editorial de un sismo que la institución local desmintió; no se agrega ninguno sin una razón comprobable. Los otros 11 de solo EMSC se quedan (con su rótulo).isUnconfirmed, awaitsConfirmation y UNCONFIRMED_ALERT_MAG en lib/earthquakes.ts; selectQuakesToPush / runQuakeCheck en lib/push-check.ts (el cron y /api/earthquakes pasan si el IGC respondió); la retención de la alerta de la página en app/page.tsx (un sismo retenido tampoco se anota como «visto»: si no, cuando el IGC lo confirmara contaría como ya conocido y nunca sonaría).Cómo se probó.
/api/earthquakes sustituida solo en esa pestaña; no se llamó a ningún endpoint de push): un sismo nuevo solo-EMSC no muestra la alerta de la página; al llegar el mismo sismo confirmado por el IGC (con el id del EMSC como alias) la alerta aparece una sola vez; con el IGC simulado como caído, el solo-EMSC sí alerta. La lista muestra 12 rótulos, la ficha y el globo del mapa su insignia, /analisis «· sin confirmar» en la tabla. axe: sin violaciones nuevas (dos que ya existían en la portada: .now-stats y .now-side).Estado: publicado y verificado en producción (13 de octubre de 2026). Commit 9ac2768 en main, despliegue de Vercel listo en www.ojopanama.com. Comprobado en vivo después de publicar: la API (/api/earthquakes) ya no devuelve emsc:2074346 (519 eventos); la portada no tiene ninguna fila de M 4.0 cerca de Juan Díaz y muestra 11 rótulos «Sin confirmar · solo EMSC» (antes 12). Antes, el mismo día, se había publicado el commit 4b64d5d (pantalla completa de la línea de tiempo, optimización de /analisis y arreglo del aviso «Nuevo sismo»; ver «📊 Gráficas interactivas y animadas»).
Aclaración pública en la portada (RETIRADA el 14 de octubre de 2026). Se publicó un aviso azul arriba de «Sismos en Panamá» (app/clarification-notice.tsx y .css, montado en app/page.tsx) con este texto. Por pedido de quien administra el sitio («ya quita lo del 13 de octubre de la página») se quitó el aviso de la portada y se borraron esos dos archivos y su línea en app/page.tsx; el aviso sigue en el historial de git (commit 9ac2768 y anteriores). Lo demás de esta sección no cambia: la regla de los sismos «sin confirmar», la retirada del sismo de Juan Díaz del mapa y de las cifras, y la notificación que ya se envió. El texto que tuvo:
Aclaración sobre el sismo de Juan Díaz (13 de octubre). A las 4:37 p. m. enviamos una alerta por un sismo de M 4.0 cerca de Juan Díaz. Ese registro lo publicó el EMSC (Centro Sismológico Euromediterráneo), un centro sismológico internacional y una de las fuentes oficiales que contrastamos junto con el IGC-UP y el USGS. Esta vez el EMSC se equivocó: el IGC-UP indicó que no fue un sismo real y el USGS tampoco lo registró. Ya lo quitamos del mapa y de las cifras. Para que no se repita, desde ahora un sismo que solo publica un catálogo no genera alertas hasta que otro lo confirme (salvo los de M 5 o más). Lamentamos la confusión.
Cuánto duró. Estaba previsto hasta el 21 de octubre de 2026 (00:00, hora de Panamá), o hasta que la persona pulsara «Entendido» (localStorage, clave clar-juan-diaz-2026-10-13); se quitó antes, el 14 de octubre.
Qué dice y qué no. «El IGC-UP indicó que no fue un sismo real» lo informó quien administra el sitio; no se encontró un comunicado público del IGC-UP que se pueda enlazar (si lo hay, conviene agregarle el enlace). Lo que sí se comprobó con los datos: el IGC-UP y el USGS no lo registran. «Fuente oficial» sigue el mismo criterio del resto de la web (que presenta los datos del IGC-UP, el USGS y el EMSC como datos oficiales); el EMSC es una asociación científica internacional sin fines de lucro, no una agencia de gobierno, y el registro concreto lo aportó una agencia contribuyente («UNA»).
Notificación push de aclaración (enviada). Con la orden explícita de quien administra el sitio («manda la notificación a todos… sin sirenas») se envió una sola vez, el 13 de octubre de 2026 a las 8:57 p. m. (hora de Panamá), esta notificación:
Aclaración · sismo de Juan Díaz — La alerta de las 4:37 p. m. (M 4.0 cerca de Juan Díaz) fue un error del EMSC, una de las fuentes oficiales que usamos: el IGC-UP indicó que no fue un sismo real. Ya la retiramos. Toca para ver la aclaración.
Resultado (registro de Vercel): 29 779 destinatarios, 29 729 aceptados por Google, Apple, Mozilla y Windows, 50 rechazados (45 suscripciones caducadas, dadas de baja como siempre), 0 sin enviar por tiempo. Al tocarla abre la portada, donde está el aviso azul.
public/sw.js) avisa a la página de un sismo real, y eso exige una magnitud en el mensaje. Esta no lleva magnitud y su id empieza por anuncio-, que el service worker excluye siempre. En el teléfono suena y vibra como cualquier notificación normal (una notificación web no puede reproducir la sirena propia).Cómo retirar otro sismo desmentido. Agregar su id (por ejemplo emsc:2074346, igc:1791926496 o el del USGS) al conjunto RETRACTED_EVENTS de lib/catalogs.ts, con un comentario que diga qué institución lo desmintió y qué datos lo respaldan; hoy el filtro se aplica a los registros del EMSC (fetchEmsc), que es de donde vino este. Después de publicar, la API tarda hasta ~2 minutos en renovar su caché (30 s en el borde más 90 s de reserva). Los dispositivos que ya tienen la página abierta lo dejan de ver al actualizar. No se puede deshacer un aviso ya enviado. Si hiciera falta una aclaración a los suscriptores, hay que decidirla y enviarla aparte; esta vez no se envió ninguna.
Lo que no se hizo ni se sabe.
RETRACTED_EVENTS solo filtra registros del EMSC; si algún día hubiera que retirar uno del IGC o del USGS, habría que aplicar el mismo filtro en sus consultas..now-stats (lista de definiciones) y .now-side (región complementaria) tienen cada uno una violación de axe que ya existía.Pedido de quien administra el sitio: «MANDA UNA NOTIFICACION A TODOS DICIENDO QUE NSO SIGAN EN NUESTRA PAGINA DE INSTAGRAM OJOPANAMA507».
Qué se envió (una sola vez, 27 de octubre de 2026 a las 8:53 a. m., hora de Panamá, 13:53 UTC):
Ojo Panamá en Instagram — Síguenos en nuestra página de Instagram: @ojopanama507
A quién y resultado: Enviado a todas las suscripciones activas en la base de datos (con umbral min_magnitude <= 10). Registrado bajo la reserva broadcast:anuncio-instagram-ojopanama507-2026-10-27 en notified_quakes. Sin sirena ni voz sintética (id con prefijo anuncio- sin magnitud).
Pedido de quien administra el sitio: «manda una alerta a todos, no importa qué magnitud hayan seleccionado, que diga que nos sigan en Instagram ojopanama507».
Qué se envió (una sola vez, 14 de octubre de 2026 a las 3:51 p. m., hora de Panamá, 20:51 UTC):
Ojo Panamá en Instagram — Síguenos en Instagram: @ojopanama507
A quién y resultado (registro de Vercel del cron): 34 316 suscripciones (todas, sin importar la magnitud mínima que eligió cada persona), 34 113 aceptadas por los servicios de Google, Apple y los demás, 0 sin enviar. «Aceptada» quiere decir que el servicio de push la recibió; no se puede saber cuántas personas la vieron o la tocaron.
Cómo se hizo. Con el mismo método del aviso de aclaración de Juan Díaz: un archivo temporal (lib/announcement-push.ts, en el commit 48c500b) llamado por el cron de cada minuto, solo en producción, que reserva una fila en notified_quakes antes de enviar (así no se repite aunque se crucen dos ejecuciones) y envía con el umbral min_magnitude <= 10 (el tope del ajuste de cada persona es 10, así que entran todas). Sin sirena ni voz: el aviso no lleva magnitud y su id empieza por anuncio-, que public/sw.js excluye de la sirena de la página; sí suena y vibra como cualquier notificación del sistema y queda en pantalla hasta que se descarte (así se muestran todos los avisos de este sitio). Probado antes de subirlo con una base y un envío simulados (18 comprobaciones: fuera de producción no envía, una sola vez, carrera de dos ejecuciones, caída del servicio de push con reintento, sin suscriptores). El archivo y su llamada en el cron se retiraron después de enviarse; la fila de reserva sigue en la base.
Lo que no se puede hacer: al tocar la notificación solo se abre una página de este mismo sitio (public/sw.js descarta cualquier otra dirección, para que un push falsificado no pueda abrir un sitio ajeno), así que no abre Instagram directamente: abre la portada. El texto lleva el nombre de la cuenta. Si se quiere que de la portada se llegue a Instagram con un toque, hay que poner el enlace https://www.instagram.com/ojopanama507 en la página (hoy solo está en los datos estructurados para buscadores).
Situación. Desde el 14 de octubre a las 6:04 p. m. (hora de Panamá) la tabla del IGC-UP (sismosgeociencias.up.ac.pa, la que lee la web) devuelve una página de 255 bytes que dice «Estamos en mantenimiento». La web sigue funcionando con el USGS y el EMSC, muestra «IGC-UP no responde en este momento: puede haber retraso en los datos» y, por diseño, mientras el IGC no responde no se retienen las alertas de sismos de menos de M 5 que solo trae el EMSC (sin el IGC no hay con qué confirmarlos; ver «Sismos sin confirmar»). Se probaron otras direcciones del IGC y no hay otra vía de datos.
Sismo agregado a mano. El 15 de octubre, a las 8:37 a. m., quien administra el sitio mostró un mensaje del canal oficial de Telegram del IGC-UP: «Estado: PRELIMINAR · Fecha 2026-10-15 · Hora 8:31:37 AM hora local · Magnitud 4.9 · Profundidad 10 km · Localizado en Panamá a 29km al sureste de Las Tablas». A esa hora ni el EMSC, ni el USGS, ni el GFZ GEOFON lo tenían, y la tabla del IGC no respondía. Se agregó a lib/catalogs.ts (MANUAL_IGC_EVENTS y withManualIgc) con exactamente esos datos, como sismo del IGC, estado «automático» (preliminar) y el mismo formato del lugar que usa la tabla («Panamá a 29km al sureste de Las Tablas»).
notified_quakes) no se repite si luego llega el registro revisado. Cuando el IGC vuelva a responder se borra esta lista.Ocho sismos más, agregados SIN avisar (15 de octubre de 2026, 9 a. m.). Con ocho capturas del mismo canal, y la orden «añade estos sin mandar notificaciones», se agregaron (hora local; todos «Panamá a N km al de »):
| Hora local | M | Prof. | Estado | Lugar |
|---|---|---|---|---|
| 14 oct, 10:58:21 p. m. | 3.7 | 10 km | preliminar | 33 km al este de Coiba |
| 14 oct, 11:03:04 p. m. | 4.5 | 10 km | preliminar | 18 km al noroeste de Tonosí |
| 15 oct, 12:15:44 a. m. | 3.7 | 10 km | preliminar | 15 km al noreste de Tonosí |
| 15 oct, 12:38:15 a. m. | 3.4 | 10 km | preliminar | 31 km al sur de Soná |
| 15 oct, 1:24:40 a. m. | 3.7 | 10 km | preliminar | 34 km al noroeste de Tonosí |
| 15 oct, 6:03:17 a. m. | 3.8 | 20 km | revisado | 33 km al suroeste de Soná |
| 15 oct, 6:59:03 a. m. | 3.6 | 13 km | revisado | 33 km al noreste de Coiba |
| 15 oct, 7:48:28 a. m. | 3.5 | 12 km | revisado | 29 km al sur de Soná |
noAlert (lib/earthquakes.ts): selectQuakesToPush (lib/push-check.ts) lo salta, la página no lo trata como sismo nuevo (no suena, no sale el aviso en pantalla: app/page.tsx) y merge (lib/catalogs.ts) conserva la marca si EMSC o USGS publican el mismo sismo. Probado con los catálogos reales: los 8 quedan en la lista final con la marca y el cron no eligió ninguno; se comprobó en los registros de Vercel que, después de subirlo, no salió ninguna alerta. Aparecen solo en el mapa y en la lista.MANUAL_IGC en lib/catalogs.ts) que calcula la posición, y se comprobó que cada una queda a la distancia y en el rumbo indicados (±1 km, ±2°). El rumbo del IGC es de ocho direcciones: la posición real puede estar hasta ~13 km al lado.noAlert, así que el cron lo avisó como cualquier sismo del IGC (una sola vez, con el «hace N min» en el texto; el M 4.9 ya avisado no se repite y los 8 silenciosos tampoco). Probado antes de subirlo: el nuevo sí se elige para alerta, el M 4.9 y los silenciosos no.Pedido. «Que aquí solo se vea la principal hasta que yo toque Ver réplicas», y después: «que salgan las réplicas igual en el mapa satelital y los demás, menos el 3D». Es decir: solo la vista 3D del Mapa de actividad arranca con el sismo principal; el plano, el satélite, Esri y el callejero siguen mostrando todo el evento (el principal M 7.7 y sus ~646 réplicas), como siempre (app/page.tsx, app/quake-map.tsx, app/quake-3d.tsx).
showAftershocks) y la escena 3D lo recibe por la propiedad aftershockReveal; el mapa plano no lo usa. El principal se identifica en la lista del catálogo (MAINSHOCK_ID) sin esperar a /api/earthquakes/mainshock, que puede tardar más. El interruptor «Réplicas Sí/No» de «Ajustes y capas» del 3D no se usa en la portada (el botón nuevo lo reemplaza).tsc, eslint (mismos avisos que antes) y next build sin errores. No se probó en un teléfono real.Reporte (14 de octubre de 2026). «Cuando alguien toca Mayor magnitud, se cae la página.» Ese botón ordena la lista «Sismos registrados» (app/page.tsx).
Lo que se encontró.
content-visibility, «Reducir animaciones») casi no ayudaba: el costo estaba en dibujar tantas filas, no en animarlas.Qué cambió. Solo se dibujan las primeras 60 filas; al final de la lista hay un botón «Mostrar más sismos · quedan N» que agrega 120 cada vez. El orden se calcula sobre todos los sismos (las 60 de «Mayor magnitud» son las 60 mayores de verdad) y al cambiar de orden la lista vuelve a 60. Los conteos de arriba («538 réplicas + 1 sismo principal…»), el mapa y los filtros no cambian: solo cambia cuántas filas se dibujan. Constante ROW_PAGE en app/page.tsx.
Resultado (compilación de producción local en ventana de teléfono, misma computadora y mismo panel que la medición de «antes», que se hizo en la web publicada): cambio de orden 43 ms de promedio (máximo 60 ms) frente a ~380–435 ms antes; elementos en la página 7 546 → 2 837. La carga inicial de la portada también dibuja menos.
Cómo se probó. Orden correcto con las 540 filas (las 60 primeras de «Mayor magnitud» van de 7.7 a 6.0 sin subir, y la lista completa también), «Mostrar más» (60 → 180 → … → 540, el botón desaparece al llegar al final y el contador baja bien), volver a «Recientes» (vuelve a 60), elegir una fila (se abre la ficha y queda marcada) y sin errores en la consola. No se ejecutó axe en esta compilación.
Lo que no se sabe ni se probó. Un teléfono real (ni Safari ni Firefox); si esto era de verdad el origen de la caída. Si vuelve a pasar: modelo de teléfono, navegador y qué se ve (pantalla blanca, mensaje de error, se reinicia o se queda congelada) para buscar otra causa. El texto «quedan N» y los botones leen bien con lectores de pantalla, pero la lista sigue siendo una región aria-live y puede anunciar las filas nuevas al pulsar «Mostrar más».
/historia): explorador interactivo, solo con datos realesPedido (14 de octubre de 2026): «el lado de historia mejóralo, que todo lo que pongas sea verídico y cosas interactivas».
Regla de la página. Todo sale del catálogo ComCat del USGS (sismos de M 6 o más en Panamá desde 1900: 94, de ellos 6 de M 7 o más y los 4 de la secuencia de 2026). Lo que se muestra son esos registros, conteos, fechas y distancias calculadas con las posiciones que publica el USGS. No hay estimaciones, pronósticos, textos generados ni cifras de otras fuentes sin citar. No hay historia contada de memoria: lo que no viene del catálogo del USGS solo entra como «dato curioso» con su fuente, leído en vivo de la base oficial de NOAA y comprobado contra su texto actual (ver más abajo).
Qué se puede hacer ahora (app/historia/explorer.tsx, explorer.css, frame.ts):
+ y −, arrastrar para moverlo, y ciudades de referencia (la capital y las capitales de provincia, de GeoNames).#sismo=<id>: el enlace abre la página ya posicionada en ese sismo).app/historia/top-map.tsx, top-map.css, selection.ts): ver abajo.history-map.tsx) y la tabla de 12 filas, que el explorador reemplaza.Mapa interactivo de los 12 más grandes (pedido del 14 de octubre de 2026). Cada número del mapa (y del acercamiento al suroeste) es un botón: tocarlo, o pulsar Enter o espacio con el teclado, abre debajo del mapa la ficha de ese sismo con los mismos datos del catálogo del USGS que el resto de la página: magnitud y su tipo, fecha y hora universal, lugar traducido, puesto por magnitud (de 94), profundidad y provincia o comarca (o «Mar frente a …»). Tocar el mismo número otra vez la cierra.
#sismo=<id>, el mismo enlace compartible) y lleva la vista hasta él.explorer.tsx a app/historia/sat-tiles.tsx (SatTiles recibe el recuadro de latitudes y longitudes que cubre y la parte que se ve), y la usan el explorador y el mapa de los 12. Se comprobó que el explorador no cambió: 30 mosaicos (zoom 7 y 8), las 13 provincias y, al acercar al tope, mosaicos de zoom 11.#sismo=us6000u18k, y en ventana de teléfono la ficha queda a la vista tras tocar y no hay desborde horizontal. axe (incluida la regla de tamaño de objetivo de WCAG 2.2): en teléfono y escritorio, en claro y oscuro, con la ficha abierta y cerrada, y también en teléfono con la vista satelital. Satélite: 57 de 57 mosaicos cargan (30 en el mapa general y 27 en el acercamiento), en desarrollo y en la compilación de producción con su política de seguridad (sin bloqueos de la política). Sin errores propios en la consola.Los 12 más grandes en 3D, con su onda expansiva y filtros por provincia y ciudad (pedido del 14 de octubre de 2026: «que se pueda ver en 3D y se vea cómo fue su onda expansiva de cada uno de los 12 y se pueda filtrar por provincia y ciudad»). app/historia/top-map.tsx, app/quake-3d.tsx, app/api/historia/sacudida/[id]/route.ts, lib/usgs-detail.ts (fetchWaveData).
/api/historia/sacudida/<id>, que consulta al USGS el ShakeMap de ese sismo (la rejilla de intensidad estimada, escala Mercalli modificada; entre 3 y 10 KB, 38 KB la del de 2026) y, si existe, su modelo de falla. La escena colorea el país con esa intensidad a medida que llega la onda S (con un tinte azul tenue para la P) y la pantalla tiembla como efecto visual, igual que en el sismo de 2026 de la portada. Lo que publica el USGS es el color de cada lugar; lo que se calcula aquí es el momento en que llega la onda, con el modelo de velocidades ak135 (IASPEI). De los 12, 10 tienen ShakeMap. Los de 1904 (puesto 4) y 1916 (puesto 12) no lo tienen: se muestra «Sin onda para este sismo: el USGS no publica un mapa de sacudida», no se dibuja nada y no se inventa./api/historia/sacudida/<id> solo acepta los 12 identificadores de la lista (los saca del catálogo, con la misma dirección y caducidad que la página; cualquier otro da 404 sin consultar al USGS), así que nadie puede usarla para consultar cualquier sismo ni para inventar direcciones y saltarse la caché. La respuesta se guarda un día en la red de Vercel (lo publicado de un sismo antiguo casi no cambia). Nota: el USGS a veces tarda en responder (el catálogo, 8 s; algunos detalles, de 5 a 11 s): varias peticiones a la vez comparten la misma consulta del catálogo y la ficha dice «Cargando la sacudida que estima el USGS… (a veces tarda unos segundos)»; cada sismo se pide una sola vez por visita.Filtro por provincia y ciudad también en los 94 sismos (pedido del 14 de octubre de 2026: «que el filtro sea también en los 94 sismos»). El explorador (app/historia/explorer.tsx) tiene los mismos selectores Provincia y Ciudad que el mapa de los 12 más grandes, ahora en un solo código compartido: app/historia/place-filter.tsx (el filtro y sus selectores), place-filter.css y place-index.ts (los datos que llegan al navegador). Mismas reglas del filtro del mapa en vivo (lib/province-of.ts, lib/place-of.ts).
464ad06, 14 de octubre de 2026): comprobado en www.ojopanama.com/historia: las opciones suman 94 (27 ciudades); Chiriquí deja 37 sismos en el mapa, Chiriquí · Limones 15 (y el 3D muestra esos 15), y «Quitar filtros» devuelve los 94.Vistas satelital y 3D (pedido del 14 de octubre de 2026: «puedes crear ese mapa en 3D y en vista satélite»). Un selector Vista: Plano · Satélite · 3D sobre el mapa de la historia. Los filtros (magnitud, décadas), el deslizador de años, la reproducción y el sismo elegido valen en las tres vistas.
SatTiles en app/historia/explorer.tsx): imagen Esri World Imagery, los mismos mosaicos del mapa en vivo y del 3D, debajo de los círculos. Hay siempre una capa de fondo (9 mosaicos) y, al acercar, otra con más detalle (hasta 30 mosaicos, zoom 8 a 11, según el ancho en pantalla). Cada mosaico se coloca entre sus dos longitudes y dos latitudes en el mapa plano (a esta escala la deformación de Mercator dentro de un mosaico es de una fracción de píxel). El contorno del país (simplificado) solo se dibuja al ver todo; al acercar se quita porque la propia imagen muestra la costa y el contorno se vería desalineado. Atribución visible: «Imagen © Esri, Maxar, Earthstar Geographics». Se acerca hasta ×8 y se arrastra igual que el plano.app/quake-3d.tsx): superficie con imagen satelital de Esri y relieve de AWS Terrain Tiles (SRTM y otras fuentes públicas), cada sismo a su profundidad, giro con arrastre, zoom, «Perspectiva / Arriba / Lado», ajustes de escala vertical y pantalla completa (Escape la cierra). Los sismos del historial se le pasan con la misma forma que los del catálogo en vivo, con la profundidad que publica el USGS. Se baja solo al elegir «3D» (no pesa en la carga de la página). Se añadieron dos capas con datos estáticos ya usados en el sitio: «Placas tectónicas» (PB2002, P. Bird 2003; aproximadas) y «Fallas activas» (centro del país; CCAF-DB/GEM). Elegir un sismo en el 3D lo elige en toda la página.aftershockToggle={false} y ese interruptor no aparece ahí (en la portada sigue igual). Se comprobó: 94 sismos, sin interruptor y sin la palabra «réplica» en el 3D de la historia.Provincias y comarcas en el mapa (pedido del 14 de octubre de 2026: «que se vean todas las provincias»). Un botón «Provincias» (encendido por defecto, en el grupo «Capas del mapa»; no aparece en 3D) dibuja el límite y el nombre de las 13 divisiones: Bocas del Toro, Chiriquí, Coclé, Colón, Darién, Herrera, Los Santos, Panamá, Panamá Oeste y Veraguas, y las comarcas Emberá-Wounaan, Guna Yala y Ngäbe-Buglé (en cursiva y con línea de trazos). Sobre la imagen satelital quedan como líneas blancas; en el mapa plano, como áreas azules. Los límites son los de geoBoundaries (gbOpen, nivel ADM1, de OpenStreetMap, licencia ODbL), simplificados a unos 900 m, y la atribución «Límites: geoBoundaries © OpenStreetMap (ODbL)» se ve bajo el mapa (en el teléfono, en una franja debajo para no tapar el mapa). Los nombres de ciudades se muestran al acercar. La ficha de cada sismo dice en qué provincia o comarca cae (o «Mar frente a …»). Cuatro rótulos se fijaron a mano para que no se pisaran (Panamá, Guna Yala, Emberá-Wounaan —en dos líneas— y Darién): se comprobó que los 13 caen dentro de su territorio y, en ventana de teléfono, que ninguno queda fuera del marco.
«Datos curiosos» por sismo, cada uno con su fuente (pedido del 14 de octubre de 2026: «datos curiosos por sismo, pero que sean full verídicos y siempre confirma la fuente»). Al elegir un sismo, la ficha muestra una lista; cada dato trae «Fuente:» con un enlace y de qué tipo es:
¿Qué es NOAA y por qué se usa aquí? NOAA es la Administración Nacional Oceánica y Atmosférica de Estados Unidos, una agencia del gobierno de ese país. De ella se usa el NCEI (Centros Nacionales de Información Ambiental, antes NGDC), que mantiene dos bases de datos públicas:
El USGS da la física del sismo (dónde, cuándo y qué tan grande); NOAA agrega lo que pasó después (heridos, daños, olas). Por eso nunca se mezclan sin avisar: cada dato dice de qué base sale y enlaza a su registro. Y los dos catálogos a veces no coinciden (en 1934 NOAA anota Ms 7.7 y el USGS Mw 7.5, que son escalas distintas): se muestran las dos cifras tal cual, sin promediar ni corregir.
En producción (14 de octubre de 2026). ad549fa (explorador) y 2a9904c (capital) ya estaban; b4fc70a subió satélite, 3D, provincias y datos curiosos; 877e90e quitó el interruptor «Réplicas» del 3D de la historia. Se comprobó en www.ojopanama.com/historia (despliegues de Vercel en READY): 13 provincias dibujadas, 30 mosaicos, 12 datos curiosos en el sismo de 1934 (5 de NOAA), la nota «consultadas el 14 de octubre de 2026» y, en el 3D, 94 sismos sin interruptor de réplicas.
Cómo se calcula cada cifra (para que se pueda comprobar):
kmBetween del resto del sitio) entre las posiciones publicadas. Es una distancia calculada, no medida; las posiciones de los sismos antiguos son reconstrucciones del USGS y tienen más incertidumbre (la página lo dice).Cómo se probó.
lib/history.ts: décadas, filtros, años cumplidos en los bordes de aniversario, puestos, mismo día, distancias, intervalos de M 7, enlaces del USGS) contra los datos reales: pasan. Tres de las cifras que muestra la ficha se recalcularon aparte con otro programa: 194 km entre el sismo de 1934 y el de 2026, 5 sismos a 100 km del de 2026 y 44 a 100 km del de 1934.#sismo=… en una pestaña nueva; en ventana de teléfono (375 px) sin desborde horizontal y con círculos agrandados para verse y tocarse. Sin errores en la consola. La página completa tiene unos 900 elementos (la portada pasaba de 7 000).img-src ya permitía los mosaicos de Esri): las 13 divisiones dibujan su límite y su nombre en satélite y en plano (claro y oscuro); los 30 mosaicos cargan; el sismo de 1934 (M 7.5) muestra 12 datos curiosos y el de 2026 (M 7.7), 13, todos con enlace de fuente (0 enlaces que no sean https); un sismo sin NOAA (M 6.83 de 1934) muestra 6, calculados y de USGS. Se comprobó contra NOAA con un programa aparte: 14 uniones, 11 frases textuales encontradas, 0 faltantes. En ventana de teléfono (375 px) se corrigieron tres defectos que aparecieron al probar: «Panamá» y «Guna Yala» se pisaban, «Emberá-Wounaan» se cortaba en el borde del mapa y la atribución tapaba la parte baja del mapa. axe: 0 violaciones en teléfono con el mapa satelital y en escritorio con el mapa plano, en tema claro y en oscuro (con los desplegables abiertos). tsc y eslint sin errores.Lo que no se probó o no hace. En la leyenda del 3D, el punto del sismo de 2026 (M 7.7) se llama «Principal»: es el mayor y el principal de la secuencia de 2026, pero en una historia de 122 años puede leerse raro (se puede cambiar a «El mayor»). La redacción de las frases de NOAA del sismo de 2026 puede cambiar con el tiempo (si cambia, la frase se oculta sola). No se probó un teléfono real ni el navegador de Instagram con las provincias y los datos curiosos nuevos (el trabajo extra es un SVG de 13 trazados y texto). Un teléfono real, el navegador integrado de Instagram en iPhone (ahí ya hubo una caída por memoria: el satélite pide hasta 30 imágenes y el 3D usa un lienzo grande, por eso el 3D solo se carga al elegirlo, pero no se probó en un iPhone), Safari y Firefox, VoiceOver y TalkBack. El 3D se maneja con ratón, dedos o teclado como el del resto del sitio; el mapa satelital plano no tiene zoom con dos dedos. No hay zoom con dos dedos (se acerca con los botones, y el mapa se mueve arrastrando). El orden de lectura con lector de pantalla del mapa es por la tabla y las flechas, no círculo por círculo. La página se actualiza cada media hora (la caché del USGS).
Corregido de paso: «Distancia a Ciudad de Panamá» en la ficha de cada sismo. La ficha de la portada (lib/quake-facts.ts) medía la distancia a la capital, y el tiempo de llegada de la sacudida, desde el centro del distrito de Panamá de GeoNames (9.244° N, 79.427° O), que queda a unos 30 km al norte del centro de la ciudad (8.9936° N, 79.5197° O). Ahora usa el punto de la propia ciudad (PANAMA_CITY en lib/places.ts, GeoNames id 3703443, verificado con una segunda fuente que cita GeoNames), el mismo que usa el mapa de historia. Efecto: para el sismo principal de 2026 (7.59° N, 80.77° O) la ficha pasa de 236 km a 208 km (comprobado con un cálculo aparte) y los tiempos de llegada a la capital se ajustan en proporción. El punto del distrito se sigue usando solo para ubicar el distrito (filtro por ciudad, localidad más cercana).
Pedido (28 de octubre de 2026): «arreglalo todo, que cuando la gente lo busque en google salga de primero» y, después, «Crea las páginas por provincia con datos reales de los catálogos». Con una condición que se repitió: «no inventes nada».
Lo que esto hace y lo que no. Quita obstáculos para que Google lea y entienda el sitio. No garantiza un puesto: el orden de los resultados depende también de los enlaces que otros sitios le hagan y del tiempo, y desde el código no se puede medir. Las posiciones se ven en Google Search Console o buscando a mano en Google.
Regla de los textos. Todo título, descripción y frase debe poder cotejarse con el código o con los catálogos. Los títulos y las descripciones solo prometen lo que la página trae (por eso, en una provincia sin sismos grandes desde 1900, no se anuncian). Los datos estructurados no llevan valoraciones, reseñas ni preguntas frecuentes.
Qué hay y dónde está:
lib/site.ts, app/layout.tsx): el título de la portada tiene 55 caracteres y la descripción 139. Dice «avisos» y no «alertas tempranas»: el sitio avisa cuando las agencias publican el sismo, no antes. No hay etiqueta keywords. app/layout.tsx solo añade a mano apple-mobile-web-app-capable y la precarga de las dos fuentes (con preload de react-dom; como <link> en el <head> salían dos veces); el manifiesto, los íconos y el color del tema salen de metadata y viewport. La dirección del sitio es NEXT_PUBLIC_SITE_URL (por omisión, https://www.ojopanama.com).app/structured-data.tsx): WebSite, Organization y WebApplication en un @graph; BreadcrumbList en todas las páginas internas menos /privacidad, ItemList en /sismos y AboutPage en /acerca. Sin FAQPage: sus preguntas no estaban visibles en la página.app/page.tsx, app/home.tsx, app/latest-quake-ssr.tsx, lib/load-quakes.ts): page.tsx es un componente de servidor que se regenera como mucho cada minuto (revalidate = 60, igual que /resumen) y pasa a home.tsx (el componente de cliente de siempre) el último sismo ya dibujado, que ocupa su tarjeta mientras el navegador consulta los datos en vivo, en lugar del esqueleto vacío. Si esa consulta falla, la página sale sin él y el navegador lo pide después./acerca (app/acerca/page.tsx): quién lo creó, de dónde salen los datos, cada cuánto se actualizan, lo que no hace y cómo contactar (por Instagram, @ojopanama507). Cada frase describe lo que hace el código o lo que dicen las otras páginas del sitio.app/sitemap.ts, app/robots.ts): el sitemap incluye la portada, /analisis, /noticias, /historia, /reportes, /resumen, /acerca, /privacidad, /sismos y las provincias con contenido. La fecha de cada provincia es la de su último sismo; la de las demás es la de la generación del sitemap. robots solo bloquea /api/cron/ y : las APIs de datos quedan abiertas para que Google pueda dibujar la página./sismos y /sismos/[provincia])Qué son. Un índice (/sismos) y una página por cada una de las 13 divisiones de lib/provinces.ts (10 provincias y 3 comarcas): bocas-del-toro, chiriqui, cocle, colon, darien, embera-wounaan, guna-yala, herrera, los-santos, ngabe-bugle, panama, panama-oeste y veraguas. Se regeneran como mucho cada minuto y cualquier otra dirección da 404 (dynamicParams = false). Los archivos son app/sismos/page.tsx, app/sismos/[provincia]/page.tsx, app/sismos/format.ts, app/sismos/sismos.css y lib/province-pages.ts.
De dónde sale cada dato (nada estimado ni escrito a mano):
/api/earthquakes, que ya combina el IGC, el USGS y el EMSC sin duplicados./historia, anteriores a la secuencia actual (los de la secuencia salen en la lista en vivo). Se muestran los 10 mayores y el total.lib/province-of.ts). Si cae dentro del límite, a esa provincia o comarca. Si ocurre en el mar, a la de la localidad que cita el catálogo (por ejemplo, «al sur de Tonosí» es Los Santos) y, si no cita ninguna, a la de la costa más cercana (hasta 90 km). Los que quedan más lejos de toda costa no se cuentan en ninguna provincia, y los de «Incluir alrededores» (fuera de Panamá) tampoco.Qué muestra cada página: el último sismo de la provincia (magnitud, lugar, hora, profundidad, fuente y si el dato es preliminar o revisado); las cifras (sismos registrados, últimas 24 horas, última hora, de M 4 o más, de M 5 o más y el más fuerte); las localidades con más sismos (la que cita el catálogo para cada sismo y, si no cita ninguna, la más cercana dentro de la provincia); los 20 más recientes; y los sismos grandes desde 1900. Si la provincia no tiene sismos en la secuencia, lo dice y no rellena. Las cifras de 24 horas y de 1 hora se miden desde la hora de los datos que la propia página indica, no desde que alguien la abre.
Títulos y descripciones. Llevan las cifras reales de esa provincia (cambian con cada sismo). Si no hay sismos en la secuencia, el título no promete un «último temblor» y pasa a «Sismos grandes en … desde 1900» (o «Sismos en … desde 1900» si el nombre es largo); la descripción solo menciona los sismos grandes si la página los trae. Los títulos se acortan en los nombres largos para no pasar de unos 65 caracteres con el «| Ojo Panamá».
Qué se ofrece a Google y qué no. Una provincia con menos de 3 datos (sismos de la secuencia más sismos grandes desde 1900) sigue existiendo y enlazada desde /sismos, pero lleva noindex y no va en el sitemap (MIN_ITEMS en lib/province-pages.ts): sería casi solo texto fijo. Al 28 de octubre de 2026 eran Panamá, Panamá Oeste y Emberá-Wounaan. Si no se pueden consultar los sismos en vivo, no se retira nada por ese fallo pasajero.
Enlaces. Desde el pie de la portada, desde su lista de enlaces «Más información» y desde el panel «Más» del celular; cada provincia enlaza al índice y a las demás.
Cómo se probó (compilación de producción con next build y next start -p 3055, y después en www.ojopanama.com):
/sismos y las 10 provincias indexables./resumen (28 de octubre): Veraguas 484, Los Santos 350, Herrera 123, Chiriquí 11 y Ngäbe-Buglé 7, los mismos que da «Dónde ha temblado más»./historia: Bocas del Toro 3, Chiriquí 37, Colón 2, Darién 4, Guna Yala 7 y Ngäbe-Buglé 1 coinciden. Las únicas diferencias son los sismos de la secuencia actual, que /historia cuenta y estas páginas no por diseño: Veraguas 18 (en /historia, 20), Los Santos 3 (4) y Herrera ninguno (1, el sismo principal).app/home.tsx ya tenía 3 errores de lint (react-hooks/set-state-in-effect, purity y refs) antes de este trabajo y siguen igual.Trampas.
generateMetadata, robots reemplaza al del sitio completo (también openGraph y twitter): solo se pone para ocultar una página, y cada página repite sus openGraph/twitter con pageSocial().<a href="/sismos"> falla el lint @next/next/no-html-link-for-pages: se usa Link de next/link (con prefetch={false} en los enlaces repetidos).Date.now() dentro de un componente de página falla react-hooks/purity: va en una función auxiliar o en lib/.Lo que falta o no se midió.
https://www.ojopanama.com/sitemap.xml lo tiene que hacer quien administra la cuenta de Google. Sin eso no hay forma de ver posiciones ni qué búsquedas traen visitas./resumen, /sismos, las 13 provincias y el sitemap. Conviene mirarlo con tráfico real.fcm.googleapis.com, push.apple.com, mozilla, windows).X-Frame-Options: DENY, X-Content-Type-Options: nosniff, y Permissions-Policy restrictiva.Este proyecto es de código abierto bajo la licencia MIT.
Desarrollado con dedicación para Panamá por Humberto Antonio.
notified_quakeslib/clarification-push.ts92dc970Cómo se probó (servidor local): aparece arriba de la portada, el botón «Entendido» lo cierra y no vuelve a salir al recargar, al pasar la fecha de caducidad (simulada) desaparece, se ve bien en tema claro y oscuro, y axe no da violaciones nuevas (las dos de siempre: .now-stats y .now-side). Es una <section> con título, no un <aside>, para no repetir el aviso de «región complementaria anidada».
app/status-now.tsx, lib/quake-summary.ts); si es el principal, «Sismo principal»; sin principal, «Último sismo registrado». La voz del panel de accesibilidad sigue diciendo «último sismo».@igcpanamaup mientras arregla su página y pidió sacar la información de ahí. Se leyó la línea de tiempo completa con el navegador de quien administra (ya con sesión en X; sin sesión X solo deja ver los 4 reportes más recientes) desde el primer reporte posterior a la caída de la tabla (8:18 p. m. del 14 de oct.) hasta las 9:10 a. m.: 26 publicaciones, y se comparó con lo ya agregado. Faltaban 10 sismos de la noche del 14 (8:18, 8:32, 8:40, 9:21, 9:35, 9:38, 9:53, 10:02, 10:05 y 10:19 p. m.; M 3.5, 3.9, 3.4, 4.5, 3.9, 3.5, 3.9, 4.2, 3.5 y 4.1; casi todos a 6–31 km de Tonosí, uno a 25 km al sur de Chitré y dos a 60–80 km mar adentro) y se agregaron sin avisar (tienen más de 11 horas). La lista llega a 21 sismos; de los demás, los de las 10:58 p. m. en adelante ya estaban.
MANUAL_IGC = [], commit 604b8ad). Con la tabla de vuelta, el sismo de las 11:48 a. m. (M 3.6, 36 km al este de Coiba) entró por la vía normal y se avisó una sola vez.lib/province-of.ts, lib/place-of.ts): la provincia o comarca es la del epicentro publicado (si cae en el mar, la de la ciudad que cita el título del USGS o la costa más cercana) y la ciudad es la que cita el título si está en la lista de GeoNames (CC BY 4.0) o, si no, la localidad más cercana de su provincia. Las opciones salen de los propios 12, con cuántos hay en cada una: hoy Chiriquí 5, Darién 2, Bocas del Toro, Herrera, Los Santos y Veraguas 1 cada una, y «Mar adentro» 1; y 10 ciudades. La ciudad depende de la provincia elegida, hay «Quitar filtros», y los números, el acercamiento al suroeste (se recalcula con los que quedan), las flechas del teclado, «Puesto anterior / siguiente» y la escena 3D usan solo los que se ven. Hay una nota desplegable que explica cómo se asignan.app/quake-3d.tsx), todos con valores por defecto que dejan la portada igual: pointSource (onda desde un punto cuando no hay modelo de falla), autoPlay, mainLabel (la leyenda dice «El elegido» y no «Principal») y el reinicio de la animación al cambiar de sismo.tsc y eslint sin errores en lo tocado.452e110, 14 de octubre de 2026). Se comprobó en www.ojopanama.com: la ruta responde 200 con las rejillas (5 KB la de 1934, 38 KB la de 2026) y 404 con un identificador falso; en /historia, los filtros (Chiriquí 5, Darién 2…), el de 2026 con «Ver la ruptura y la onda», el de 1934 con «Ver cómo se propagó la sacudida» y el de 1904 con «Sin onda». La portada no cambió: su 3D sigue con 580 sismos, el interruptor «Réplicas», la leyenda «Principal», «Ver cómo se rompió» / «Ver la ruptura y la onda» (113 s) y la frase de los 3 s de diferencia para el sismo con modelo de falla. La primera petición de cada sismo tardó de 6 a 8 s (el USGS responde lento a ratos); ahora queda guardada un día./api/push/og:image (antes, /reportes, /resumen y /privacidad no la tenían).