Trasparenza · Tecnologia · Cura

Un sito turistico costruito come una app moderna

Apri il cofano del sito di Visit Torino di Sangro: perché è veloce, perché rispetta la tua privacy, perché funziona anche senza segnale, e chi l'ha costruito. Senza marketese — con numeri verificati.

  • 100/100 SEO
  • 100/100 Accessibilità
  • < 1s TTFB
  • 0% Tracker pre-consenso

Quando hai aperto questa pagina, il tuo browser ha scaricato circa 100 KB di font fatti su misura, ha letto un foglio di stile inline nel <head>, e ha mostrato la prima parola in meno di un secondo. Le immagini si sono caricate solo quando ne avevi bisogno. Nessun cookie ti ha seguito.

  • ~100KB Font self-hosted
  • < 1s Prima parola visibile
  • 0 Cookie pre-consenso

Questa pagina spiega come è fatto.

Misurato, non promesso

I numeri che contano

Otto metriche verificate sul sito reale. Le ottieni anche tu in dieci secondi: apri DevTools → Lighthouse, oppure misura su PageSpeed Insights di Google.

  • 100/100 SEO Lighthouse Punteggio massimo desktop e mobile su tutte le pagine.
  • 100/100 Accessibilità Lighthouse al massimo desktop e mobile. Target WCAG 2.1 AA, axe-core CI nightly, pagina /accessibilita su schema AGID.
  • 100/100 Best Practices Zero errori console, HTTPS strict, MIME corretti, no librerie con CVE note, no document.write.
  • 91 / 75 Performance desktop/mobile Home page. Su /dietro-le-quinte e archivi si arriva a 99/81. LCP reale-utente sotto i 500ms.
  • < 70 ms Time To First Byte Misurato real-user. Cache edge Caddy (fast-path 1-3 ms su HIT) + Cloudflare CDN con stale-while-revalidate.
  • < 0.01 CLS — Cumulative Layout Shift Sostanzialmente zero "salti" durante il caricamento. Mobile 0.002, desktop 0.011 (soglia "buono" Google: 0.1).
  • 21 Sezioni GDPR attive Consensi, DSAR, RoPA, Data Breach.
  • 0 Tracker pre-consenso Nessun cookie analytics/marketing o tracker terzo prima del tuo OK.
  • HTTP/3 Protocollo moderno QUIC sul reverse proxy, connessioni più veloci e resilienti. PWA installabile su mobile con offline-first.
Sincerità tecnica · 1 di 1

Perché la Performance mobile della home si ferma a 75 (e non 100)

100 A11y / BP / SEO
91 / 99 Perf desktop home / dlq
75 / 81 Perf mobile home / dlq
250ms LCP reale-utente
1

Cosa succede in pratica

I tre dei quattro indicatori Lighthouse — Accessibilità, Best Practices, SEO — sono a 100/100 su tutte le pagine, desktop e mobile. La quarta metrica (Performance) tocca 99 sulla pagina che stai leggendo, 91 sulla home desktop, 75 sulla home mobile. Il salto sulla home mobile non è opzionale: ha una causa tecnica precisa che vale la pena spiegare.

2

La matematica del simulatore

L'LCP element (Largest Contentful Paint — il pezzo di pagina che Google considera visibile per primo) della home è il titolone "Dove il Sangro incontra l'Adriatico": un testo con dipendenza dal font display Fraunces (variante italic). Il simulatore di Lighthouse Mobile non misura il tempo reale: simula uno scenario worst-case (rete slow 4G, CPU rallentata 4×) e applica un moltiplicatore variabile.

Per un text-LCP con web font, quel moltiplicatore è ~30×. Per un image-LCP scende a ~4×. Il nostro LCP osservato real-user è 250 ms — moltiplicato 30× diventa 7.9 s simulati → 0 punti su 25 → Performance 75.

250ms × 30 = 7.9s
LCP reale × moltiplicatore text-with-font = LCP "simulato" che Lighthouse usa per il punteggio.

La conferma sta nelle altre pagine: /dietro-le-quinte e gli archivi non hanno hero stilizzato con web font come LCP element — l'LCP è un'immagine — e il simulatore applica il moltiplicatore standard, arrivando a 81 mobile / 99 desktop. Stessa codebase, stesse ottimizzazioni: cambia solo cosa Lighthouse decide di considerare "contenuto principale".

3

Perché non barare

Avremmo potuto portare la home a 95+ mobile sostituendo Fraunces nel titolone con un font di sistema (system-ui / Helvetica / Arial). Abbiamo scelto di non farlo: Fraunces è la cifra tipografica del brand turistico — è la stessa logica con cui si sceglie il carattere di un'insegna di paese.

Ottimizziamo per chi visita il sito davvero — 250 ms di LCP è "istantaneo" sulla scala della percezione umana — non per gonfiare un punteggio simulato. Quando Google avrà raccolto abbastanza traffico reale (28 giorni di CrUX field data), nella sezione "Field Data" di PageSpeed Insights apparirà la valutazione effettiva, e sarà nella fascia "buono" su tutte e tre le Core Web Vitals.

Sei scelte tecniche, sei vantaggi reali

Cosa rende questo sito diverso

Ogni punto è spiegato due volte: una versione semplice per chi vuole capire perché conta, e una versione tecnica per chi vuole sapere come funziona sotto.

Performance

Veloce davvero, anche in 4G

In parole semplici

Il sito si apre subito. Anche con connessione lenta in spiaggia o in una valle senza copertura piena. Non perdi un visitatore perché "caricava troppo".

Sotto il cofano

Caddy 2 con fast-path su cache hit (1-3 ms), CDN edge Cloudflare con stale-while-revalidate, immagini AVIF/WebP responsive via Optimole, font self-hosted Inter + Fraunces subsettati (–70% sul peso originale, italic preloaded), critical CSS inline nel <head>, chat-widget e cookie banner caricati al primo segnale di interazione utente, defer dei CSS below-fold, HTTP/3 + QUIC. Numeri misurati 18/05/2026 (mediana 6 run PSI): home Lighthouse desktop 91 / mobile 75, /dietro-le-quinte 99/81, LCP real-user 250-500 ms, CLS sotto 0.011 ovunque. Sul perché mobile non arriva a 100 vedi la nota tecnica subito sotto i numeri.

Scopri di più
Privacy

Conforme al GDPR, davvero — non solo il banner

In parole semplici

Nessun tracker di terze parti o identificatore persistente ti segue prima che tu dia il consenso. I cookie non tecnici si attivano solo se accetti, e il sito ricorda la tua scelta. Anche le richieste di accesso ai dati personali (art. 15-22) sono gestite da un modulo dedicato.

Sotto il cofano

Tracker analytics interno completamente consent-gated: niente sessionStorage / localStorage / chiamate al server finché non concedi il consenso "Statistiche" (gate sia lato JavaScript sia server-side via header X-VTDS-Consent). Plugin di compliance custom con 21 sezioni: Records of Consent (con IP/UA/User hash + URL pagina), Document Versioning, Script Blocker pre-consenso, Cookie Scanner automatico, RoPA art. 30, DSAR art. 15-22, Data Breach art. 33-34, TCF v2.2, bridge opzionali Complianz/Cookiebot/Iubenda. Google Consent Mode v2 implementato. Privacy & Cookie Policy elencano nel dettaglio ogni dimensione raccolta (lingua browser, regione CF, OS/browser family, segmenti comportamentali aggregati).

Scopri di più
Sicurezza

Hardenizzato come un servizio bancario, leggibile come un sito turistico

In parole semplici

Il sito accetta connessioni solo cifrate (HTTPS), è dietro la rete Cloudflare che blocca DDoS e bot prima ancora che raggiungano il server, e applica le mitigazioni OWASP per le 10 vulnerabilità più diffuse. L'accesso amministrativo richiede password forte + autenticazione a due fattori, gli URL di login sono nascosti, e i tentativi falliti vengono ban-nati automaticamente. Ogni deploy salva uno snapshot del database prima di partire e — se qualcosa va storto — il sistema torna da solo alla versione precedente in pochi secondi. Niente notti in piedi a riparare.

Sotto il cofano

TLS 1.3 + HSTS preload 2 anni + 0-RTT su Cloudflare; HTTP/3 con QUIC. Content-Security-Policy in modalità enforcement (whitelist esplicita per ogni origine, report-uri attivo). Header completi via Caddy: X-Content-Type-Options nosniff, X-Frame-Options SAMEORIGIN, Referrer-Policy strict-origin-when-cross-origin, Permissions-Policy bloccata su geolocation/camera/microphone, Cross-Origin-Opener/Resource-Policy isolate. WordPress hardened: DISALLOW_FILE_EDIT + DISALLOW_FILE_MODS (zero install/update plugin da UI), XML-RPC off, anti user enumeration REST + ?author=, Application Passwords disabilitati (eliminato vettore esfiltrazione token), Clear-Site-Data header al logout, generic login error, WPS Hide Login, Two Factor TOTP/email/U2F, Limit Login Attempts. PHP disable_functions su exec/shell_exec/system/popen/pcntl_exec (post-exploit shell rotta). fail2ban + ufw a livello VM. CSP report endpoint con rate limit + referer check (anti-flood). Rate limit applicativo su /track (120/min) e /search (60/min). File integrity check giornaliero. DB snapshot pre-deploy gz retention 7gg + smoke test post-deploy su /health (6×5s) + rollback automatico al commit precedente. Sensitive paths bloccati a Caddy: .git, .env, wp-config.php, xmlrpc.php, readme.html. /.well-known/security.txt pubblicato (RFC 9116).

Scopri di più
Accessibilità

Aperto a tutti, non solo "sulla carta"

In parole semplici

Il sito si naviga con la sola tastiera, parla bene con gli screen reader (VoiceOver, NVDA, JAWS), rispetta chi ha bisogno di testo ingrandito, e mette in pausa le animazioni se l'utente lo chiede al sistema operativo. Ogni immagine ha una descrizione testuale alternativa, ogni link spiega dove porta, ogni grafico ha anche una tabella leggibile. La pagina dedicata segue lo schema AGID richiesto dalle pubbliche amministrazioni italiane.

Sotto il cofano

Target WCAG 2.1 AA (Direttiva UE 2016/2102, recepita in Italia dalla Legge Stanca aggiornata). Contrast ratio verificato ≥ 4.5:1 su tutta la palette adriatico/ocra/terra/lecceta. Skip-link al main content come primo elemento focusable. Focus-visible rinforzato (outline terra #a04030) — distingue navigazione mouse da tastiera. prefers-reduced-motion safety-net globale che annulla anche le animazioni di plugin terzi e blocchi Gutenberg. Alt fallback dinamico sulle immagini esterne (formato "<nome POI> — foto N"). Lightbox gallery con role=dialog + aria-modal + focus trap + Esc/Arrow keys. Calendar eventi con aria-expanded/aria-controls/aria-labelledby coerenti, navigazione mese con aria-live=polite. Dashboard Insight server-side: heatmap traffico con <caption> sr-only + scope=col/row + aria-label parlato ("Lunedì ore 14:00 — 42 sessioni"); grafici SVG con tabella SR-only collegata via aria-describedby (no canvas inaccessibile, nessun Chart.js); barre stacked con role=group + aria-label per gruppo e singola barra; emoji decorative nei heading wrappati in <span aria-hidden="true"> per non essere lette ad alta voce. Frecce di trend ↑↓→ con aria-label parlato ("in crescita: 18% rispetto al periodo precedente"). Form upload con <label for> esplicito + aria-describedby. CI nightly su axe-core + pa11y (WCAG2AA standard, 8 pagine pubbliche). Pagina /accessibilita allineata allo schema AGID, da validare tramite flusso istituzionale quando richiesto.

Scopri di più
Mappa

Una mappa interattiva a costo zero

In parole semplici

La mappa che vedi non costa nulla in licenze: usa OpenStreetMap, è italianissima nei dettagli (sentieri, trabocchi, vicoli), e non c'è il rischio di sorprese in bolletta quando il sito diventa popolare.

Sotto il cofano

Leaflet 1.9.4 + MarkerCluster 1.5.3 + Carto basemap + OpenStreetMap. Sei preset estetici (light/voyager/positron/satellite/outdoor), 18 campi popup card per ogni POI, geocoding Nominatim cachato con retry degradativo, polyline tratteggiata + marker numerati per gli itinerari, cluster colorato terra. Schema.org TouristAttraction auto-generato.

Scopri di più
Intelligenza artificiale

L'AI lavora con noi, non al posto nostro

In parole semplici

L'AI è usata con misura: "Tonino" parte dai contenuti pubblici e risponde localmente quando può, le audioguide leggono le storie con voce naturale, le traduzioni IT→EN→DE restano assistite e una dashboard interna suggerisce alla redazione quali contenuti mancano o vanno tradotti. L'AI assiste, non sostituisce: ogni risposta cita le fonti, e l'editor del Comune ha sempre l'ultima parola.

Sotto il cofano

Stack local-first: Tonino usa prima regole PHP, cache, POI/eventi/contatti WordPress e crawler settimanale del sito istituzionale; Groq Llama 3.1 8B è solo opt-in per domande libere, con budget giornaliero server-side e nessun fallback 70B/OpenAI. Web Speech API + OpenAI TTS opzionale solo per MP3 audioguide. DeepL Free via WP-CLI `vtds translate-missing` per i batch EN/DE. OG image SVG dinamica /wp-json/visit-tds/v1/og-image (CDN-cached 30gg). Insights Engine: dashboard wp-admin con gap analysis, query zero-result e suggerimenti AI.

Scopri di più
Progressive Web App

Installalo. Anche senza segnale, il paese c'è

In parole semplici

Sui telefoni recenti puoi "scaricare" il sito come una vera app, e funziona offline. Utile quando sei in spiaggia, nella riserva o tra i vicoli del centro storico, dove la rete è capricciosa.

Sotto il cofano

Service Worker offline-first, manifest con shortcuts (mappa/itinerari/eventi), pagina /offline minimale, shortcode `[vtds_offline_download]` per precachare la app shell e 50 POI selezionati. Web Share API + Web Speech API (TTS "ascolta la storia") + .ics calendar export per gli eventi.

Scopri di più
Cloud & DevOps

Cloud serio: Google Cloud + edge globale Cloudflare

In parole semplici

Il sito gira su Google Cloud Platform — la stessa infrastruttura che fa girare YouTube e Gmail. Davanti c'è Cloudflare con CDN in 300+ città del mondo: un visitatore dall'Olanda, dal Giappone o dalla California riceve l'HTML dal nodo più vicino, non dall'Italia. E se qualcosa si rompe in produzione, il sistema se ne accorge da solo e torna automaticamente alla versione precedente, in pochi secondi. Niente notti in piedi a riparare.

Sotto il cofano

Google Compute Engine (zona europe-west1-b) con Docker Compose multi-container: Caddy 2 (reverse proxy + ACME automatico) + WordPress PHP-FPM + MariaDB 11 + Redis 7 (object cache). Cloudflare CDN edge: HTTP/3 + QUIC, 0-RTT TLS 1.3, Brotli, Polish/Mirage Pro per immagini. CI/CD: GitHub Actions su push main → DB snapshot pre-deploy (gz, retention 7gg) → zero-downtime con `caddy reload` → smoke test su /health → rollback automatico al commit precedente se 6×5s falliscono. WP-Cron orchestrato via systemd timer (no thundering herd), Lighthouse CI + axe-core/pa11y nightly, file integrity check giornaliero, IndexNow per Bing/Yandex, monitoring esterno UptimeRobot/BetterStack.

Scopri di più

Vuoi sapere davvero cosa c'è dietro le quinte?

Ogni voce ha molto altro da raccontare — architettura, scelte di stack, trade-off, numeri sul campo. Se stai pensando a un sito simile per il tuo Comune, regione o azienda, parliamone.

Stack tecnologico

Costruito con strumenti solidi e aperti

Nessun lock-in vendor. Tutto basato su standard aperti, codice ispezionabile, formati portabili. Se un domani cambi fornitore, puoi prenderti i contenuti e ripartire altrove.

  • WordPress CMS familiare per la redazione del Comune
  • PHP 8.2 + MariaDB 11 Backend moderno, type-safe, longevo
  • Caddy 2 Reverse proxy + HTTPS + HTTP/3 automatici
  • Redis 7 Object cache in-memory per ridurre query DB
  • Leaflet + OpenStreetMap Mappe open source, zero costi licenze
  • Cloudflare CDN globale + protezione DDoS + edge cache
  • Optimole Immagini AVIF/WebP responsive servite da CDN
  • Polylang Multilingua predisposto IT / EN / DE
  • Justbit Suite Plugin custom: compliance, mappe, security
  • Docker + GitHub Actions Sviluppo locale = produzione. Deploy automatici.
Per chi pubblica

Editor friendly: come scrivere un articolo

La redazione del Comune e della Pro Loco aggiorna contenuti con il block editor di WordPress: lo stesso strumento che usa un redattore in tutto il mondo. Nessun page builder pesante, nessun corso di formazione di tre giorni. Aggiungere un POI o un evento è come pubblicare un articolo.

  • Nessun lock-in: contenuti in WordPress, esportabili in qualsiasi momento (XML, REST API).
  • REST API pronta: app mobili, totem, integrazioni esterne possono leggere i POI senza chiederci nulla.
  • SEO automatica: meta tag, Schema.org, sitemap e OG image dinamica generati a partire dal contenuto.
  • Traduzioni assistite: comando WP-CLI con DeepL per riempire le versioni EN/DE in pochi minuti.
Sviluppato da

Make it digital. Make it happen.
Studio digitale di Roma. Dalla strategia al codice, dal brand all'AI: accompagniamo Comuni, regioni e operatori privati verso una consapevolezza più digitale, intercettando nuovi scenari e raggiungendo insieme gli obiettivi.

  • Web & app development
  • UX research & UI design
  • AI generativa & marketing automation
  • Performance & SEO optimization
  • Compliance GDPR & Cookie Law
  • Brand identity & content strategy

Ultima revisione di questa pagina: 16 Maggio 2026