Un ETL reproducible convierte descargas de GBIF, Kew y geoBoundaries en unos pocos JSON pequeños; un sitio estático los lee en el build y el navegador solo trae archivos. Cinco vistas: contenedores, flujos, datos, despliegue y decisiones. Haz clic en cualquier caja; reproduce un flujo para ver el recorrido.
Cada caja es una pieza que corre por separado: una fuente externa, el ETL, una carpeta de datos, el build del sitio o el navegador de quien visita. Las líneas son llamadas reales: protocolo y qué viaja.
El sitio no tiene servidor de aplicación ni llama a ninguna API al ser visitado. El ETL deja los números hechos y el build los lee de archivos. Una visita cuesta lo que cuesta servir archivos, y una cifra del sitio se puede rastrear hasta la descarga que la produjo.
Los registros de GBIF mezclan sinónimos y errores de tipeo. El ETL los cruza contra el backbone de nombres aceptados antes de contar, por eso los totales son menores que los de fuentes que cuentan nombres crudos. Lo que no resuelve se reporta, no se descarta en silencio.
La descarga reproducible de GBIF devuelve un download key y un DOI citable. El manifiesto los guarda junto al sha256 del archivo, así que cualquier figura apunta a un extracto exacto y no a una consulta viva que cambie sin avisar.
manifest.json. Ignorado por git; se regenera con el ETL.Botanica/
etl/ pasos del pipeline y CLI atlas
data/
raw/ descargas + manifest.json (git: no)
atlas.duckdb base de trabajo (git: no)
exports/
mart_*.json 8 JSON con los marts (git: si)
*.parquet (git: no)
web/
public/data/ species-*, facets-*, protologue-*
src/lib/data.ts lee data/exports en el build
dist/ salida del build (git: no)
El atlas es un directorio de archivos. El build corre en el PC del autor, su salida se copia al repo del Landing y el auto-deploy de ese repo lo publica. Mover el atlas a otro destino cambia la base y la URL del sitio, no el pipeline de datos.
La salida lleva dos copias de cada JSON: con hash para la caché larga y sin hash como respaldo para pestañas abiertas antes de un deploy.
Qué gana: un despliegue independiente y sin copia manual. Qué no cambia: las cifras, que salen del ETL.
| Decisión | Por qué | Descartado |
|---|---|---|
| Estático primero: el sitio lee marts JSON en el build | Sin servidor ni APIs en vivo, el costo por visita es el de servir archivos y el sitio no puede caerse por una dependencia | Alojar en Vercel o Cloudflare, o consultar los datos en tiempo de ejecución |
| Contar solo nombres aceptados | Los sinónimos y errores de tipeo inflan la diversidad; resolverlos antes de contar da cifras defendibles | Contar los nombres crudos de GBIF |
| Esquema estrella en DuckDB | Separa el grano de registro (esfuerzo de colecta) del de distribución (presencia) y deja un mart por vista | Que el sitio lea tablas crudas o de hechos |
| Dos geometrías desacopladas | La simplificada recorta cientos de metros de costa y mandaría puntos legítimos a sin asignar; la detallada hace el join y la simple solo dibuja | Usar un solo GeoJSON para el join y para el render |
| Descarga de GBIF con DOI y manifiesto sellado | Cada cifra apunta a un extracto exacto y citable; el manifiesto guarda key, DOI y sha256 | El search paginado como fuente final: no tiene DOI ni es reproducible |
| Export ordenado por todas las columnas | Sin ORDER BY el orden de filas queda a criterio del motor y cada corrida ensucia el repo con diffs que no significan nada. Inferida; que la corrida repetida salga idéntica sigue por confirmar | Dejar el orden por defecto de DuckDB |
| Mapa familia a orden derivado de datos | Sale del árbol de Tree of Life y del backbone de GBIF; los conflictos se resuelven por soporte y se reportan. El orden es la unidad de color del clado | Una tabla escrita a mano |
| JSON con hash en el nombre y caché immutable | Un export nuevo es una URL nueva y el CDN puede servirlo de caché un año; el nombre sin hash queda como respaldo | Servir los JSON sin cabecera de caché, como antes |
| Primeras filas de especies dentro del HTML | La primera fila esperaba un JSON de 1,6 MB; con 26 filas en el build aparece antes de bajar nada | Un Web Worker para parsear: no quita la descarga del camino |
| Three.js solo como chunk perezoso del árbol | La página principal no carga ECharts ni Three.js; el 3D es opcional y cae al sunburst en dispositivos modestos o con movimiento reducido | Cargar el motor 3D en el bundle inicial |