itziarZG f61cde82f9
ci / build-and-test (push) Canceled after 0s
build: refresh pnpm lockfile and pin build approvals
Coolify builds were failing with ERR_PNPM_OUTDATED_LOCKFILE because
the devDependencies added in recent commits (eslint, playwright,
@astrojs/check, tsx, sharp, etc.) had been installed with npm locally
and the pnpm-lock.yaml in the repo was stale.

- Regenerate pnpm-lock.yaml from current package.json.
- Promote sharp to a direct devDependency (scripts/build-og-image.ts
  imports it; pnpm cannot resolve transitive packages outside the
  importer graph).
- Pin esbuild and sharp as allowed build scripts in pnpm-workspace.yaml
  so pnpm 11's default deny policy does not skip their native postinstall
  on a clean install. Both are required: esbuild for the Vite/Astro
  binary, sharp for the OG image rasterizer.
- Add a pnpm engine pin (>=9) so installs that target the new schema
  fail fast instead of silently downgrading.

Verified locally: pnpm install (clean), pnpm run prebuild (regenerates
OG images, astro check, eslint), pnpm run build and pnpm run test:e2e
all pass (20/20).
2026-07-26 22:20:38 +02:00
2026-07-25 13:17:03 +02:00

Ibiza Environmental Watch — frontend

Frontend estático (Astro) para el proyecto de vigilancia ambiental de Eivissa i Formentera. Consume boib_entradas y noticias_prensa (es_ambiental = true) directamente de Postgres, en build-time, y publica HTML estático servido por Caddy. No hay servidor Node en producción.

Contexto completo del proyecto (infraestructura, esquema, decisiones ya tomadas) en el documento de traspaso que se usó para construir esto.

Arrancar en local

npm install
npm run dev

Sin DATABASE_URL definida, el sitio usa datos de ejemplo (src/lib/fixtures.ts) con la misma forma que las tablas reales — sirve para maquetar sin acceso al servidor privado de Hetzner.

Build de producción

DATABASE_URL="postgres://usuario:pass@host-privado:5432/dbname" npm run build

El resultado (dist/) es estático: se sirve con Caddy, sin necesidad de Node corriendo.

Variables de entorno

Variable Uso
DATABASE_URL Conexión a Postgres, solo se usa durante npm run build

Como el build corre en la misma red privada de Hetzner (vía Coolify), la conexión no necesita salir a internet.

Estructura

  • src/lib/db.ts — única consulta a Postgres, una vez por build.
  • src/lib/types.ts — forma unificada de un "aviso" (BOIB o prensa).
  • src/components/EntryCard.astro — tarjeta de un aviso (siempre estática).
  • src/components/Filters.astro — filtro por municipio/tema/fuente, JS vanilla que filtra el DOM ya renderizado (sin re-fetch).
  • src/components/MapView.tsx — mapa Leaflet, componente Preact que solo se hidrata en escritorio (client:media="(min-width: 900px)"). En móvil ni Leaflet ni Preact se descargan.
  • src/pages/huella.astro — página de huella (pendiente de rellenar con medición real tras el primer despliegue).

Pendiente para conectar el rebuild automático

Añadir un nodo HTTP Request al final del workflow de n8n de clasificación (tras cada lote) que llame al webhook de deploy de Coolify para esta app, para que el sitio se regenere solo sin intervención manual. La URL del webhook la genera Coolify al crear la aplicación (Settings → Webhooks).

Pendiente de datos

  • Unificar 'Ibiza''Eivissa' en noticias_prensa.municipio ya está resuelto en la query (case when municipio = 'Ibiza' then 'Eivissa' ...), pero conviene aplicar también el UPDATE en la tabla para no depender de ese parche en cada query.
  • Sumar Diario de Ibiza como fuente cuando estén confirmadas las URLs RSS.
  • Las coordenadas de municipioCoords (en fixtures.ts, reutilizadas por el mapa) son aproximadas por municipio — no hay geocodificación por entrada individual, ni falta: el mapa agrupa, no geolocaliza cada aviso.
S
Description
No description provided
Readme
864 KiB
Languages
Astro 49.2%
TypeScript 44.6%
CSS 3.3%
JavaScript 2.9%