Questo Sito
Un sito data-driven dove foto, tracce GPS e dati geografici diventano pagine web. Monorepo pnpm con Astro 5, React 19, Turso e una dashboard di gestione contenuti su Netlify Functions.
Live
alessiogoria.com non è un template. È un sistema dove i dati delle mie esperienze — foto, tracce GPS, coordinate, metadati — diventano pagine web automaticamente. Questa è la storia di come è stato costruito.
L'evoluzione
Versione 1: sito statico con HTML scritto a mano. Versione 2: React SPA con routing client-side. Versione 3: Astro 4 SSG con admin SPA monolitica. Versione 5 (attuale, dal 2026): monorepo pnpm 9 con Astro 5 + React 19, dashboard rifattorizzata in moduli isolati, database Turso unificato sito+mobile, e una pipeline di hardening completa (HSTS, CSP, rate limiting, Sentry). Risultato: Lighthouse 97/95/100/100, zero downtime al cutover, SEO solido.
Architettura data-driven
I contenuti vivono in Turso (libsql cloud): 39 viaggi, 152 waypoint geolocalizzati, foto con coordinate EXIF, tutto con metadati bilingui IT/EN. Uno script di build legge il database, genera JSON ottimizzati in content-data/, e Astro produce HTML statico per ogni pagina a build time. Il sito in produzione resta puramente statico: il database serve la dashboard, non i visitatori.
Dashboard di gestione
Per gestire i contenuti ho rifattorizzato la dashboard in moduli isolati (trips, waypoints, esperienze, utenti, adesioni): React 19 con autenticazione JWT + Argon2id, form generati da schema Zod condiviso, upload immagini su Netlify Blobs, coda revisioni per editor, gestione utenti con ruoli e permessi per sezione. Il backend usa Netlify Functions v2 con Turso (libsql serverless) e rate limiting su login/contact/request-account.
Sicurezza e osservabilità
Header HSTS + CSP + X-Frame-Options configurati a livello Netlify. Rate limiting su tutti gli endpoint sensibili (login, contact form, richieste account). Monitoring runtime con Sentry free tier su sito e app mobile. Pre-commit hook con secretlint per bloccare chiavi accidentali. Pipeline CI GitHub Actions con typecheck, lint, e schema drift check sui pacchetti condivisi.
Bilingue nativo
Ogni pagina esiste in italiano e inglese con URL dedicati (/viaggi/giappone-2025 e /en/viaggi/giappone-2025). Le traduzioni dell'interfaccia sono centralizzate nel modulo i18n del sito. I contenuti hanno campi _it e _en in ogni record del database. Il language toggle mantiene la posizione nella pagina. I tag hreflang garantiscono l'indicizzazione corretta.