Tool gratuito che assegna un punteggio 1–99 all'acqua del rubinetto a partire dai valori del referto di analisi. Nessun login, anonimo, motore di scoring deterministico (stesso input → stesso punteggio).
- Node ≥ 20, npm
cp .env.example .env.locale compilare:NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYGOCCIA_IP_SALT(stringa random lunga, per hashing IP anti-abuso)NEXT_PUBLIC_SITE_URL=https://goccia.org
npm installnpm run dev
npm run dev— svilupponpm run build— build produzionenpm run type-check— TypeScript strictnpm test— vitest sul motore di scoring
- Applicare la migration
supabase/migrations/0001_goccia_submissions.sql(tabellagoccia_submissions+ viewgoccia_benchmark).
- Nuovo progetto Vercel collegato a questo repo
- Aggiungere le env elencate sopra (Production + Preview)
- Dominio:
goccia.org(apex) +www.goccia.orgcon redirect 308 sull'apex - DNS: record A/CNAME verso Vercel, SSL automatico
Il motore in packages/aquascore/ è una copia di quello presente nel repo principale di 123Acqua (src/lib/aquascore). Se cambi pesi, soglie o aggiungi parametri da una parte, riporta le stesse modifiche anche dall'altra — oppure pubblica il package su un registry privato condiviso ed eliminala da entrambi i repo.
Obiettivo: pubblicare, comune per comune, i valori reali delle analisi dell'acqua
estratti dai referti pubblici dei gestori, con tabella + punteggio 1–99 e link alla
fonte. Publishing data-gated: una pagina comune con i dati viene generata solo
quando esiste un referto reale (src/data/comuni-analyses.json), così non si creano
pagine vuote/duplicate (niente doorway pages penalizzate).
Flusso:
-
Estrazione —
scripts/scrape_comune.pytrasforma un referto (PDF/CSV/testo) in un record strutturato e lo scrive insrc/data/comuni-analyses.json:python3 scripts/scrape_comune.py \ --slug latina --comune "Latina" --provincia LT --regione Lazio \ --gestore "Acqualatina S.p.A." --data 2026-03-12 \ --source-url "https://.../referto.pdf" \ --source-label "Acqualatina — referto Q1 2026" \ --pdf referto.pdf # oppure --csv referto.csv / --text referto.txtL'estrazione PDF usa
pdfplumberse installato (pip install pdfplumber); in alternativa accetta un CSVparametro;valore;unitào testo già estratto, così la pipeline gira anche senza dipendenze pesanti. I parametri non riconosciuti vengono scartati, non indovinati. Test del core (mappatura nomi + parsing valori):python3 scripts/test_scrape.py. -
Scoring —
src/lib/comune-analyses.tsricalcola il punteggio con lo stesso motoreaquascoredello strumento pubblico (deterministico) ed espone le aggregazioni "comuni più a rischio" e "rischio per inquinante". -
Pubblicazione — la pagina
/acqua-di-{comune}mostra la tabella + punteggio quando esiste un report;/comuni-a-rischioaggrega la classifica e le contaminazioni documentate;sitemap.tsinclude automaticamente i comuni con dati.
Per le fonti che pubblicano molti comuni (open data, portali "qualità per comune"),
scripts/adapters.py contiene adapter che scaricano e mappano i dati da soli,
riusando il core di scrape_comune.py. Ogni adapter valida la fonte: gli slug non
pubblicati (404/403) vengono saltati.
python3 scripts/run_adapters.py --list # elenca gli adapter
python3 scripts/run_adapters.py --all # esegue tutti e aggiorna il JSON
python3 scripts/run_adapters.py --adapter publiacqua --dry-run
Adapter attuali: milano-opendata (CKAN Comune di Milano) e publiacqua
(schede "Qualità dell'acqua" per comune, Toscana centrale). Aggiungere un gestore =
aggiungere una funzione all'REGISTRY con URL della fonte e mappatura colonne.
Regola inderogabile: nessun valore inventato. Ogni record cita la fonte pubblica
(sourcePdfUrl) e la data di campionamento.
packages/aquascore/ motore puro 1–99 (zero deps)
src/app/ Next.js App Router
src/lib/supabase/ client server + browser
supabase/migrations/ schema
Le guide città vivono in src/app/citta/[citta]/ ma l'URL pubblico è
/acqua-di-{slug} (rewrite in next.config.mjs; /citta/{slug} fa redirect
308 all'URL canonico). In Next un segmento è dinamico solo se è interamente
[param]: una cartella acqua-di-[citta] verrebbe trattata come percorso
letterale.
src/lib/official-sources.ts— dove ogni gestore pubblica le analisi ufficiali (link individuati su fonti pubbliche, campoconfidence). Alimenta/analisi-ufficialie il box nelle pagine città.src/lib/water-history.ts— storico personale delle analisi inlocalStorage(nessun dato lascia il browser). Alimenta/storicoe il salvataggio automatico dalla pagina risultato.
- Non scrivere "accreditato", "Accredia" o "ISO 17025" riferiti al laboratorio. Wording ammesso: "laboratorio qualificato", "metodi validati conformi a norme tecniche", "processi tecnici documentati".
- Solo italiano nell'UI.
- Punteggio sempre 1–99 (mai 0–100): nessuna acqua è perfetta, nessuna è ingestibile per definizione.
- Strumento informativo: non sostituisce il rapporto di prova né costituisce parere medico o legale.