1<!DOCTYPE html> 2<html lang="it"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta name="robots" content="noindex"> 7 <title>Privacy Policy â MeteoPomarico</title> 8 <link rel="preconnect" href="https://fonts.googleapis.com"> 9 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 10 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> 11 <link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon.png"> 12 <style> 13 :root { 14 --bg-deep: #020617; 15 --bg-body: #030a1f; 16 --card-bg: rgba(15, 23, 42, 0.6); 17 --card-border: rgba(59, 130, 246, 0.12); 18 --text: #e2e8f0; 19 --text-sec: #94a3b8; 20 --accent: #3b82f6; 21 --accent-light: #60a5fa; 22 --accent-glow: rgba(59, 130, 246, 0.15); 23 } 24 25 * { margin: 0; padding: 0; box-sizing: border-box; } 26 27 html { scroll-behavior: smooth; } 28 29 body { 30 font-family: 'Inter', -apple-system, system-ui, sans-serif; 31 background: var(--bg-body); 32 color: var(--text); 33 line-height: 1.7; 34 min-height: 100vh; 35 overflow-x: hidden; 36 } 37 38 /* ââ Animated background orbs ââ */ 39 .bg-orbs { 40 position: fixed; inset: 0; 41 pointer-events: none; z-index: 0; 42 overflow: hidden; 43 } 44 .bg-orbs span { 45 position: absolute; 46 border-radius: 50%; 47 filter: blur(80px); 48 opacity: 0.12; 49 animation: float 20s ease-in-out infinite alternate; 50 } 51 .bg-orbs span:nth-child(1) { 52 width: 600px; height: 600px; 53 background: #3b82f6; 54 top: -10%; left: -10%; 55 animation-duration: 22s; 56 } 57 .bg-orbs span:nth-child(2) { 58 width: 400px; height: 400px; 59 background: #06b6d4; 60 bottom: -5%; right: -5%; 61 animation-duration: 18s; 62 animation-delay: -5s; 63 } 64 .bg-orbs span:nth-child(3) { 65 width: 300px; height: 300px; 66 background: #8b5cf6; 67 top: 40%; left: 60%; 68 animation-duration: 25s; 69 animation-delay: -10s; 70 } 71 @keyframes float { 72 0% { transform: translate(0, 0) scale(1); } 73 100% { transform: translate(40px, -30px) scale(1.1); } 74 } 75 76 /* ââ Header / Navbar ââ */ 77 .navbar { 78 position: sticky; top: 0; z-index: 100; 79 background: rgba(2, 6, 23, 0.8); 80 backdrop-filter: blur(20px); 81 -webkit-backdrop-filter: blur(20px); 82 border-bottom: 1px solid var(--card-border); 83 padding: 0 1.5rem; 84 } 85 .navbar-inner { 86 max-width: 900px; 87 margin: 0 auto; 88 display: flex; 89 align-items: center; 90 justify-content: space-between; 91 height: 64px; 92 } 93 .nav-brand { 94 display: flex; align-items: center; gap: 0.5rem; 95 text-decoration: none; color: var(--text); 96 font-weight: 700; font-size: 1.2rem; 97 } 98 .nav-brand span { color: var(--accent); } 99 .nav-links { display: flex; gap: 0.25rem; } 100 .nav-links a { 101 color: var(--text-sec); 102 text-decoration: none; 103 font-size: 0.85rem; 104 font-weight: 500; 105 padding: 0.5rem 0.85rem; 106 border-radius: 8px; 107 transition: all 0.2s; 108 } 109 .nav-links a:hover, 110 .nav-links a.active { 111 color: var(--text); 112 background: var(--accent-glow); 113 } 114 .nav-links a.active { color: var(--accent); } 115 116 /* Language toggle */ 117 .lang-toggle { 118 display: flex;
119 background: rgba(30, 41, 59, 0.5); 120 border-radius: 8px; 121 border: 1px solid var(--card-border); 122 overflow: hidden; 123 } 124 .lang-toggle button { 125 background: none; border: none; 126 color: var(--text-sec); 127 font-family: inherit; 128 font-size: 0.8rem; font-weight: 600; 129 padding: 0.35rem 0.7rem; 130 cursor: pointer; 131 transition: all 0.2s; 132 } 133 .lang-toggle button.active { 134 background: var(--accent); 135 color: #fff; 136 } 137 138 /* ââ Main content ââ */ 139 .page-wrap { 140 position: relative; z-index: 1; 141 max-width: 800px; 142 margin: 0 auto; 143 padding: 3rem 1.5rem 4rem; 144 } 145 146 /* Hero */ 147 .hero { 148 text-align: center; 149 margin-bottom: 3rem; 150 } 151 .hero h1 { 152 font-size: 2.5rem; 153 font-weight: 800; 154 background: linear-gradient(135deg, var(--accent-light), #a78bfa); 155 -webkit-background-clip: text; 156 -webkit-text-fill-color: transparent; 157 background-clip: text; 158 margin-bottom: 0.5rem; 159 } 160 .hero .date { 161 color: var(--text-sec); 162 font-size: 0.9rem; 163 } 164 .hero .intro { 165 color: var(--text-sec); 166 margin-top: 1rem; 167 max-width: 600px; 168 margin-left: auto; 169 margin-right: auto; 170 font-size: 0.95rem; 171 } 172 173 /* Sections */ 174 .section { 175 background: var(--card-bg); 176 backdrop-filter: blur(12px); 177 -webkit-backdrop-filter: blur(12px); 178 border: 1px solid var(--card-border); 179 border-radius: 16px; 180 padding: 2rem; 181 margin-bottom: 1.25rem; 182 transition: border-color 0.3s; 183 } 184 .section:hover { 185 border-color: rgba(59, 130, 246, 0.25); 186 } 187 .section-number { 188 display: inline-block; 189 background: var(--accent-glow); 190 color: var(--accent); 191 font-size: 0.75rem; 192 font-weight: 700; 193 padding: 0.2rem 0.6rem; 194 border-radius: 6px; 195 margin-bottom: 0.75rem; 196 } 197 .section h2 { 198 font-size: 1.2rem; 199 font-weight: 700; 200 color: var(--text); 201 margin-bottom: 0.75rem; 202 } 203 .section p { 204 color: var(--text-sec); 205 margin-bottom: 0.6rem; 206 font-size: 0.92rem; 207 } 208 .section ul { 209 padding-left: 1.25rem; 210 margin-top: 0.5rem; 211 } 212 .section li { 213 color: var(--text-sec); 214 margin-bottom: 0.4rem; 215 font-size: 0.92rem; 216 } 217 .section strong { color: var(--text); } 218 219 .highlight-box { 220 background: var(--accent-glow); 221 border-left: 3px solid var(--accent); 222 border-radius: 0 8px 8px 0; 223 padding: 0.75rem 1rem; 224 margin-top: 0.75rem; 225 font-size: 0.88rem; 226 color: var(--accent-light); 227 } 228 229 /* ââ Footer ââ */ 230 .footer { 231 position: relative; z-index: 1; 232 border-top: 1px solid var(--card-border); 233 padding: 2.5rem 1.5rem; 234 text-align: center; 235 } 236 .footer-brand { 237 font-weight: 700; font-size: 1.1rem; 238 color: var(--text); margin-bottom: 0.25rem; 239 } 240 .footer-brand span { color: var(--accent); } 241 .footer-sub { 242 color: var(--text-sec); 243 font-size: 0.8rem; 244 margin-bottom: 1rem; 245 } 246 .footer-links { 247 display: flex; 248 justify-content: center; 249 gap: 1.5rem; 250 flex-wrap: wrap; 251 margin-bottom: 1.5rem; 252 } 253 .footer-links a { 254 color: var(--text-sec); 255 text-decoration: none; 256 font-size: 0.85rem; 257 transition: color 0.2s; 258 } 259 .footer-links a:hover { color: var(--accent); } 260 .footer-copy { 261 color: var(--text-sec); 262 font-size: 0.75rem; 263 opacity: 0.7; 264 } 265 a { color: var(--accent); } 266 267 /* ââ Mobile menu ââ */ 268 .mobile-menu-btn { 269 display: none; 270 background: none; border: none; 271 color: var(--text); cursor: pointer; 272 padding: 0.5rem; 273 } 274 .mobile-menu-btn svg { width: 24px; height: 24px; } 275 .mobile-drawer { 276 display: none; 277 position: fixed; inset: 0; 278 z-index: 200; 279 background: rgba(2, 6, 23, 0.95); 280 backdrop-filter: blur(20px); 281 flex-direction: column; 282 align-items: center; 283 justify-content: center; 284 gap: 1.5rem; 285 } 286 .mobile-drawer.open { display: flex; } 287 .mobile-drawer a { 288 color: var(--text); 289 text-decoration: none; 290 font-size: 1.3rem; 291 font-weight: 600; 292 } 293 .mobile-drawer .close-btn { 294 position: absolute; top: 1rem; right: 1.5rem; 295 background: none; border: none; 296 color: var(--text); cursor: pointer; 297 font-size: 2rem; 298 } 299 300 /* Honeypot trap - hidden from humans, visible to bots */ 301 .hp-trap { 302 position: absolute; 303 left: -9999px; 304 opacity: 0; 305 height: 0; 306 width: 0; 307 overflow: hidden; 308 pointer-events: none; 309 } 310 311 @media (max-width: 640px) { 312 .nav-links, .lang-toggle-desktop { display: none; } 313 .mobile-menu-btn { display: block; } 314 .hero h1 { font-size: 1.8rem; } 315 .section { padding: 1.5rem; } 316 .page-wrap { padding: 2rem 1rem 3rem; } 317 } 318 </style> 319</head> 320<body> 321 <div class="bg-orbs">
322 <span></span><span></span><span></span> 323 </div> 324 325 <!-- Navbar --> 326 <nav class="navbar"> 327 <div class="navbar-inner"> 328 <a href="/" class="nav-brand">Meteo<span>Pomarico</span></a> 329 <div class="nav-links"> 330 <a href="/">Home</a> 331 <a href="/privacy.php" class="active">Privacy</a> 332 </div> 333 <div class="lang-toggle lang-toggle-desktop"> 334 <button class="active" onclick="setLang('it')">IT</button> 335 <button onclick="setLang('en')">EN</button> 336 </div> 337 <button class="mobile-menu-btn" onclick="toggleDrawer()"> 338 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg> 339 </button> 340 </div> 341 </nav> 342 343 <!-- Mobile drawer --> 344 <div class="mobile-drawer" id="drawer"> 345 <button class="close-btn" onclick="toggleDrawer()">×</button> 346 <a href="/" onclick="toggleDrawer()">Home</a> 347 <a href="/privacy.php" onclick="toggleDrawer()">Privacy</a> 348 <div class="lang-toggle" style="margin-top:1rem;"> 349 <button class="active" onclick="setLang('it')">IT</button> 350 <button onclick="setLang('en')">EN</button> 351 </div> 352 </div> 353 354 <!-- Content --> 355 <div class="page-wrap"> 356 <div class="hero"> 357 <h1 data-i18n="title">Privacy Policy</h1> 358 <p class="date" data-i18n="updated">Ultimo aggiornamento: 17 aprile 2026</p> 359 <p class="intro" data-i18n="intro">MeteoPomarico è un'applicazione web e mobile che fornisce dati meteo in tempo reale per Pomarico e la Basilicata. Il Servizio è sviluppato e gestito da Antonio Angelotti.</p> 360 </div> 361 362 <!-- 1 --> 363 <div class="section"> 364 <span class="section-number">01</span> 365 <h2 data-i18n="s1_title">Dati raccolti</h2> 366 <p data-i18n="s1_text">MeteoPomarico <strong>non raccoglie dati personali</strong> degli utenti. In particolare:</p> 367 <ul> 368 <li data-i18n="s1_li1">Non è richiesta alcuna registrazione o creazione di account</li> 369 <li data-i18n="s1_li2">Non vengono raccolti nome, email, numero di telefono o altri dati identificativi</li> 370 <li data-i18n="s1_li3">Non vengono utilizzati cookie di profilazione o tracciamento</li> 371 <li data-i18n="s1_li4">Non viene tracciata la posizione dell'utente</li> 372 </ul> 373 <div class="highlight-box" data-i18n="s1_highlight">I tuoi dati personali restano sul tuo dispositivo. L'unica informazione inviata al server è un identificatore anonimo (hash non riconducibile a te) usato esclusivamente per prevenire spam quando pubblichi una segnalazione anonima sulle spiagge â vedi sezione 4.</div> 374 </div> 375 376 <!-- 2 --> 377 <div class="section"> 378 <span class="section-number">02</span> 379 <h2 data-i18n="s2_title">Archiviazione locale</h2> 380 <p data-i18n="s2_text">L'app e il sito web possono salvare preferenze utente (tema, lingua, unità di misura) localmente sul dispositivo tramite LocalStorage o DataStore. Questi dati <strong>non vengono trasmessi</strong> a server esterni.</p> 381 </div> 382 383 <!-- 3 --> 384 <div class="section"> 385 <span class="section-number">03</span> 386 <h2 data-i18n="s3_title">Richieste di rete</h2> 387 <p data-i18n="s3_text">MeteoPomarico effettua richieste di rete per ottenere dati meteo, cartografici e di comunità :</p> 388 <ul> 389 <li><strong>meteopomarico.it</strong> â <span data-i18n="s3_li0">Server proprio: meteo aggregato, allerte, segnalazioni anonime sulle spiagge (vedi sezione 4). Tutto il traffico è in HTTPS.</span></li> 390 <li><strong>Open-Meteo</strong> â <span data-i18n="s3_li1">Previsioni meteo, qualità dell'aria, dati marini (open source, nessun tracciamento)</span></li> 391 <li><strong>CARTO / MapLibre</strong>
391 â <span data-i18n="s3_li2">Mappe vettoriali per la visualizzazione cartografica</span></li> 392 <li><strong>Windy.com</strong> â <span data-i18n="s3_li3">Widget radar satellitare e vento (embed iframe)</span></li> 393 <li><strong>Protezione Civile (DPC)</strong> â <span data-i18n="s3_li4">Bollettini di allerta meteo</span></li> 394 <li><strong>WeatherFlow Tempest</strong> â <span data-i18n="s3_li5">Dati in tempo reale dalla stazione meteo locale installata a Pomarico (MT)</span></li> 395 </ul> 396 <p data-i18n="s3_note">La tua posizione GPS non viene mai trasmessa a questi servizi.</p> 397 </div> 398 399 <!-- 4 â NUOVA: UGC + device hash anonimo --> 400 <div class="section"> 401 <span class="section-number">04</span> 402 <h2 data-i18n="s_ugc_title">Segnalazioni anonime sulle spiagge (UGC)</h2> 403 <p data-i18n="s_ugc_intro">Dall'app MeteoPomarico puoi pubblicare segnalazioni in tempo reale sulle spiagge (es. presenza di meduse, bandiera rossa, parcheggio pieno). Queste segnalazioni sono <strong>visibili a tutti gli utenti</strong> e contribuiscono a una bacheca comunitaria sulla scheda di ogni spiaggia.</p> 404 405 <p data-i18n="s_ugc_what_label"><strong>Cosa viene pubblicato:</strong></p> 406 <ul> 407 <li data-i18n="s_ugc_what_li1">Solo categorie predefinite (10 tipi fissi). <strong>Nessun testo libero, nessuna foto, nessun video, nessun nome utente.</strong></li> 408 <li data-i18n="s_ugc_what_li2">L'identificatore della spiaggia e il tipo di segnalazione.</li> 409 </ul> 410 411 <p data-i18n="s_ugc_id_label"><strong>Identificatore anonimo del dispositivo:</strong></p> 412 <ul> 413 <li data-i18n="s_ugc_id_li1">Alla prima apertura dell'app viene generato un UUID casuale, salvato solo localmente.</li> 414 <li data-i18n="s_ugc_id_li2">Quando pubblichi una segnalazione, viene calcolato un <strong>hash SHA-256</strong> dell'UUID e inviato al server.</li> 415 <li data-i18n="s_ugc_id_li3">L'hash è <strong>anonimo e irreversibile</strong>: non può essere ricondotto a te, al tuo dispositivo o a un account.</li> 416 <li data-i18n="s_ugc_id_li4">Scopo unico: prevenire spam (limite di 5 segnalazioni al giorno per dispositivo, una sola conferma per spiaggia/tipo ogni 4 ore).</li> 417 <li data-i18n="s_ugc_id_li5">Non vengono usati altri identificatori del dispositivo (no IMEI, no Android ID, no advertising ID, no MAC).</li> 418 </ul> 419 420 <p data-i18n="s_ugc_mod_label"><strong>Sistema di moderazione:</strong></p> 421 <ul> 422 <li data-i18n="s_ugc_mod_li1">Al primo invio di una segnalazione devi accettare i termini d'uso (visibili in un dialog dentro l'app).</li> 423 <li data-i18n="s_ugc_mod_li2">Su ogni segnalazione altrui è presente un pulsante "Segnala come falsa" per moderazione comunitaria.</li> 424 <li data-i18n="s_ugc_mod_li3">Una segnalazione che riceve almeno 3 voti di "falsa" entro 4 ore viene <strong>nascosta automaticamente</strong>.</li> 425 <li data-i18n="s_ugc_mod_li4">Tutte le segnalazioni <strong>scadono automaticamente dopo 4 ore</strong> e vengono cancellate dal database del server tramite un cron orario.</li> 426 <li data-i18n="s_ugc_mod_li5">I voti di "falsa" (abuse-flag) vengono cancellati dal server entro 24 ore.</li> 427 </ul> 428 429 <div class="highlight-box" data-i18n="s_ugc_highlight">Le segnalazioni non sono messaggi tra utenti né chat: sono dati comunitari aggregati, anonimi e a vita breve. Non c'è alcun profilo utente, alcuna interazione utente-utente diretta, alcuna informazione personale identificativa.</div> 430 </div> 431 432 <!-- 5 --> 433 <div class="section"> 434 <span class="section-number">05</span> 435 <h2 data-i18n="s4_title">Servizi di terze parti</h2> 436 <p data-i18n="s4_text">MeteoPomarico <strong>non utilizza SDK di analisi, pubblicità o crash reporting</strong>. Non sono integrati servizi come Google Analytics, Firebase Analytics, Facebook SDK o simili. Ciascun servizio esterno utilizzato per i dati ha una propria privacy policy.</p> 437 </div> 438 439 <!-- 6 --> 440 <div class="section">
441 <span class="section-number">06</span> 442 <h2 data-i18n="s5_title">Account e registrazione</h2> 443 <p data-i18n="s5_text">L'app e il sito web <strong>non richiedono la creazione di un account</strong>. Non è necessario fornire email, password o altri dati personali per utilizzare il servizio.</p> 444 </div> 445 446 <!-- 7 --> 447 <div class="section"> 448 <span class="section-number">07</span> 449 <h2 data-i18n="s6_title">Permessi richiesti (app Android)</h2> 450 <ul> 451 <li><strong>Internet</strong> â <span data-i18n="s6_li1">Per scaricare dati meteo, mappe e bollettini di allerta</span></li> 452 <li><strong data-i18n="s6_li2_label">Notifiche</strong> â <span data-i18n="s6_li2">Per inviare avvisi di allerta meteo (opzionale, disattivabile)</span></li> 453 </ul> 454 <p data-i18n="s6_note">L'app non richiede accesso a posizione, fotocamera, contatti o altri dati sensibili.</p> 455 </div> 456 457 <!-- 8 --> 458 <div class="section"> 459 <span class="section-number">08</span> 460 <h2 data-i18n="s7_title">Eliminazione dei dati</h2> 461 <p data-i18n="s7_text">Tutte le preferenze utente, le statistiche e l'identificatore anonimo del dispositivo sono memorizzate <strong>solo localmente</strong>: per cancellarle è sufficiente svuotare i dati dell'app dalle impostazioni di Android oppure disinstallare l'applicazione.</p> 462 <p data-i18n="s7_text2">Per quanto riguarda i dati lato server: le segnalazioni anonime sulle spiagge vengono cancellate automaticamente entro <strong>4 ore</strong>; i voti "Segnala come falsa" entro <strong>24 ore</strong>. Reinstallando l'app viene generato un nuovo identificatore anonimo che non ha alcun collegamento con quello precedente.</p> 463 </div> 464 465 <!-- 9 --> 466 <div class="section"> 467 <span class="section-number">09</span> 468 <h2 data-i18n="s8_title">Privacy dei minori</h2> 469 <p data-i18n="s8_text">Il Servizio non è diretto a minori di 13 anni e non raccoglie consapevolmente informazioni da minori.</p> 470 </div> 471 472 <!-- 10 --> 473 <div class="section"> 474 <span class="section-number">10</span> 475 <h2 data-i18n="s9_title">Limitazioni di responsabilità </h2> 476 <p data-i18n="s9_text_a">I dati meteo forniti da MeteoPomarico provengono da fonti terze (Open-Meteo, Protezione Civile, WeatherFlow Tempest) e vengono presentati <strong>a solo scopo informativo</strong>. Il gestore del servizio:</p> 477 <ul> 478 <li data-i18n="s9_li1">Non garantisce l'accuratezza, la completezza o la tempestività dei dati visualizzati</li> 479 <li data-i18n="s9_li2">Non è responsabile di eventuali decisioni prese sulla base delle informazioni fornite dal servizio</li> 480 <li data-i18n="s9_li3">Non è responsabile di danni diretti o indiretti derivanti dall'uso o dall'impossibilità di usare il servizio</li> 481 <li data-i18n="s9_li4">Non garantisce la continuità o la disponibilità del servizio, che può essere interrotto in qualsiasi momento senza preavviso</li> 482 </ul> 483 <div class="highlight-box" data-i18n="s9_highlight">Per situazioni di emergenza meteorologica, fare sempre riferimento ai bollettini ufficiali della Protezione Civile e alle autorità competenti.</div> 484 </div> 485 486 <!-- 11 --> 487 <div class="section"> 488 <span class="section-number">11</span> 489 <h2 data-i18n="s10_title">Contatto</h2> 490 <p data-i18n="s10_text">Per domande sulla privacy, puoi contattare:</p> 491 <p><strong>Antonio Angelotti</strong><br> 492 Email: <a href="#" class="eml" data-u="info" data-d="meteopomarico.it" role="link" aria-label="Email"></a><br> 493 Sito: <a href="https://meteopomarico.it" rel="noopener noreferrer">meteopomarico.it</a></p> 494 <!-- Honeypot: hidden fake email, only bots see this -->
495 <a href="mailto:[email protected]" class="hp-trap" tabindex="-1" aria-hidden="true">Contact</a> 496 </div> 497 </div> 498 499 <!-- Footer --> 500 <footer class="footer"> 501 <div class="footer-brand">Meteo<span>Pomarico</span></div> 502 <p class="footer-sub" data-i18n="footer_sub">Meteo in tempo reale per Pomarico e la Basilicata</p> 503 <div class="footer-links"> 504 <a href="/">Home</a> 505 <a href="/privacy.php">Privacy</a> 506 <a href="#" class="eml" data-u="info" data-d="meteopomarico.it" data-label="Supporto" role="link" aria-label="Supporto"></a> 507 </div> 508 <p class="footer-copy">© 2026 MeteoPomarico â Antonio Angelotti. Tutti i diritti riservati.</p> 509 </footer> 510 511
511<script> 512 const translations = { 513 it: { 514 title: 'Privacy Policy', 515 updated: 'Ultimo aggiornamento: 6 maggio 2026', 516 intro: "MeteoPomarico è un'applicazione web e mobile che fornisce dati meteo in tempo reale per Pomarico e la Basilicata. Il Servizio è sviluppato e gestito da Antonio Angelotti.", 517 s1_title: 'Dati raccolti', 518 s1_text: 'MeteoPomarico <strong>non raccoglie dati personali</strong> degli utenti. In particolare:', 519 s1_li1: 'Non è richiesta alcuna registrazione o creazione di account', 520 s1_li2: 'Non vengono raccolti nome, email, numero di telefono o altri dati identificativi', 521 s1_li3: 'Non vengono utilizzati cookie di profilazione o tracciamento', 522 s1_li4: "Non viene tracciata la posizione dell'utente", 523 s1_highlight: "I tuoi dati personali restano sul tuo dispositivo. L'unica informazione inviata al server è un identificatore anonimo (hash non riconducibile a te) usato esclusivamente per prevenire spam quando pubblichi una segnalazione anonima sulle spiagge â vedi sezione 4.", 524 s2_title: 'Archiviazione locale', 525 s2_text: "L'app e il sito web possono salvare preferenze utente (tema, lingua, unità di misura) localmente sul dispositivo tramite LocalStorage o DataStore. Questi dati <strong>non vengono trasmessi</strong> a server esterni.", 526 s3_title: 'Richieste di rete', 527 s3_text: 'MeteoPomarico effettua richieste di rete per ottenere dati meteo, cartografici e di comunità :', 528 s3_li0: 'Server proprio: meteo aggregato, allerte, segnalazioni anonime sulle spiagge (vedi sezione 4). Tutto il traffico è in HTTPS.', 529 s3_li1: "Previsioni meteo, qualità dell'aria, dati marini (open source, nessun tracciamento)", 530 s3_li2: 'Mappe vettoriali per la visualizzazione cartografica', 531 s3_li3: 'Widget radar satellitare e vento (embed iframe)', 532 s3_li4: 'Bollettini di allerta meteo', 533 s3_li5: 'Dati in tempo reale dalla stazione meteo locale installata a Pomarico (MT)', 534 s3_note: 'La tua posizione GPS non viene mai trasmessa a questi servizi.', 535 s_ugc_title: 'Segnalazioni anonime sulle spiagge (UGC)', 536 s_ugc_intro: "Dall'app MeteoPomarico puoi pubblicare segnalazioni in tempo reale sulle spiagge (es. presenza di meduse, bandiera rossa, parcheggio pieno). Queste segnalazioni sono <strong>visibili a tutti gli utenti</strong> e contribuiscono a una bacheca comunitaria sulla scheda di ogni spiaggia.", 537 s_ugc_what_label: '<strong>Cosa viene pubblicato:</strong>', 538 s_ugc_what_li1: 'Solo categorie predefinite (10 tipi fissi). <strong>Nessun testo libero, nessuna foto, nessun video, nessun nome utente.</strong>', 539 s_ugc_what_li2: "L'identificatore della spiaggia e il tipo di segnalazione.", 540 s_ugc_id_label: '<strong>Identificatore anonimo del dispositivo:</strong>', 541 s_ugc_id_li1: "Alla prima apertura dell'app viene generato un UUID casuale, salvato solo localmente.", 542 s_ugc_id_li2: "Quando pubblichi una segnalazione, viene calcolato un <strong>hash SHA-256</strong> dell'UUID e inviato al server.", 543 s_ugc_id_li3: "L'hash è <strong>anonimo e irreversibile</strong>: non può essere ricondotto a te, al tuo dispositivo o a un account.", 544 s_ugc_id_li4: 'Scopo unico: prevenire spam (limite di 5 segnalazioni al giorno per dispositivo, una sola conferma per spiaggia/tipo ogni 4 ore).', 545 s_ugc_id_li5: 'Non vengono usati altri identificatori del dispositivo (no IMEI, no Android ID, no advertising ID, no MAC).', 546 s_ugc_mod_label: '<strong>Sistema di moderazione:</strong>', 547 s_ugc_mod_li1: "Al primo invio di una segnalazione devi accettare i termini d'uso (visibili in un dialog dentro l'app).", 548 s_ugc_mod_li2: "Su ogni segnalazione altrui è presente un pulsante \"Segnala come falsa\" per moderazione comunitaria.", 549 s_ugc_mod_li3: "Una segnalazione che riceve almeno 3 voti di \"falsa\" entro 4 ore viene <strong>nascosta automaticamente</strong>.", 550 s_ugc_mod_li4: 'Tutte le segnalazioni <strong>scadono automaticamente dopo 4 ore</strong> e vengono cancellate dal database del server tramite un cron orario.', 551 s_ugc_mod_li5: 'I voti di "falsa" (abuse-flag) vengono cancellati dal server entro 24 ore.', 552 s_ugc_highlight: 'Le segnalazioni non sono messaggi tra utenti né chat: sono dati comunitari aggregati, anonimi e a vita breve. Non c\'è alcun profilo utente, alcuna interazione utente-utente diretta, alcuna informazione personale identificativa.', 553 s4_title: 'Servizi di terze parti', 554 s4_text: 'MeteoPomarico <strong>non utilizza SDK di analisi, pubblicità o crash reporting</strong>. Non sono integrati servizi come Google Analytics, Firebase Analytics, Facebook SDK o simili. Ciascun servizio esterno utilizzato per i dati ha una propria privacy policy.', 555 s5_title: 'Account e registrazione', 556 s5_text: "L'app e il sito web <strong>non richiedono la creazione di un account</strong>. Non è necessario fornire email, password o altri dati personali per utilizzare il servizio.", 557 s6_title: 'Permessi richiesti (app Android)', 558 s6_li1: 'Per scaricare dati meteo, mappe e bollettini di allerta', 559 s6_li2_label: 'Notifiche', 560 s6_li2: 'Per inviare avvisi di allerta meteo (opzionale, disattivabile)',
561 s6_note: "L'app non richiede accesso a posizione, fotocamera, contatti o altri dati sensibili.", 562 s7_title: 'Eliminazione dei dati', 563 s7_text: "Tutte le preferenze utente, le statistiche e l'identificatore anonimo del dispositivo sono memorizzate <strong>solo localmente</strong>: per cancellarle è sufficiente svuotare i dati dell'app dalle impostazioni di Android oppure disinstallare l'applicazione.", 564 s7_text2: 'Per quanto riguarda i dati lato server: le segnalazioni anonime sulle spiagge vengono cancellate automaticamente entro <strong>4 ore</strong>; i voti "Segnala come falsa" entro <strong>24 ore</strong>. Reinstallando l\'app viene generato un nuovo identificatore anonimo che non ha alcun collegamento con quello precedente.', 565 s8_title: 'Privacy dei minori', 566 s8_text: 'Il Servizio non è diretto a minori di 13 anni e non raccoglie consapevolmente informazioni da minori.', 567 s9_title: 'Limitazioni di responsabilità ', 568 s9_text_a: 'I dati meteo forniti da MeteoPomarico provengono da fonti terze (Open-Meteo, Protezione Civile, WeatherFlow Tempest) e vengono presentati <strong>a solo scopo informativo</strong>. Il gestore del servizio:', 569 s9_li1: "Non garantisce l'accuratezza, la completezza o la tempestività dei dati visualizzati", 570 s9_li2: 'Non è responsabile di eventuali decisioni prese sulla base delle informazioni fornite dal servizio', 571 s9_li3: "Non è responsabile di danni diretti o indiretti derivanti dall'uso o dall'impossibilità di usare il servizio", 572 s9_li4: 'Non garantisce la continuità o la disponibilità del servizio, che può essere interrotto in qualsiasi momento senza preavviso', 573 s9_highlight: 'Per situazioni di emergenza meteorologica, fare sempre riferimento ai bollettini ufficiali della Protezione Civile e alle autorità competenti.', 574 s10_title: 'Contatto', 575 s10_text: 'Per domande sulla privacy, puoi contattare:', 576 footer_sub: 'Meteo in tempo reale per Pomarico e la Basilicata' 577 }, 578 en: { 579 title: 'Privacy Policy', 580 updated: 'Last updated: May 6, 2026', 581 intro: 'MeteoPomarico is a web and mobile application that provides real-time weather data for Pomarico and the Basilicata region. The Service is developed and maintained by Antonio Angelotti.', 582 s1_title: 'Data Collected', 583 s1_text: 'MeteoPomarico <strong>does not collect personal data</strong> from its users. Specifically:', 584 s1_li1: 'No registration or account creation is required', 585 s1_li2: 'No name, email, phone number, or other identifying data is collected', 586 s1_li3: 'No profiling or tracking cookies are used', 587 s1_li4: "User location is not tracked", 588 s1_highlight: 'Your personal data stays on your device. The only piece of information sent to the server is an anonymous identifier (a hash that cannot be linked back to you), used exclusively to prevent spam when you publish an anonymous beach report â see section 4.', 589 s2_title: 'Local Storage', 590 s2_text: 'The app and website may save user preferences (theme, language, units) locally on the device via LocalStorage or DataStore. This data is <strong>never transmitted</strong> to external servers.', 591 s3_title: 'Network Requests', 592 s3_text: 'MeteoPomarico makes network requests for weather, map and community data:', 593 s3_li0: 'Own server: aggregated weather, alerts, anonymous beach reports (see section 4). All traffic over HTTPS.', 594 s3_li1: 'Weather forecasts, air quality, marine data (open source, no tracking)', 595 s3_li2: 'Vector maps for cartographic display', 596 s3_li3: 'Satellite radar and wind widget (embedded iframe)', 597 s3_li4: 'Weather alert bulletins', 598 s3_li5: 'Real-time data from the local weather station installed in Pomarico (MT)', 599 s3_note: 'Your GPS location is never transmitted to these services.', 600 s_ugc_title: 'Anonymous beach reports (UGC)', 601 s_ugc_intro: 'From the MeteoPomarico app you can publish real-time reports about beaches (e.g. presence of jellyfish, red flag, full parking lot). These reports are <strong>visible to all users</strong> and contribute to a community board on each beach detail screen.', 602 s_ugc_what_label: '<strong>What gets published:</strong>', 603 s_ugc_what_li1: 'Only predefined categories (10 fixed types). <strong>No free text, no photos, no videos, no usernames.</strong>', 604 s_ugc_what_li2: 'The beach identifier and the report type.', 605 s_ugc_id_label: '<strong>Anonymous device identifier:</strong>', 606 s_ugc_id_li1: 'On first app launch, a random UUID is generated and stored only locally.', 607 s_ugc_id_li2: 'When you publish a report, a <strong>SHA-256 hash</strong> of the UUID is computed and sent to the server.', 608 s_ugc_id_li3: 'The hash is <strong>anonymous and irreversible</strong>: it cannot be traced back to you, your device or an account.', 609 s_ugc_id_li4: 'Sole purpose: spam prevention (limit of 5 reports per day per device, one confirmation per beach/type every 4 hours).', 610 s_ugc_id_li5: 'No other device identifiers are used (no IMEI, no Android ID, no advertising ID, no MAC).', 611 s_ugc_mod_label: '<strong>Moderation system:</strong>', 612 s_ugc_mod_li1: 'On the first report submission you must accept the terms of use (shown in an in-app dialog).', 613 s_ugc_mod_li2: 'Each other-user report has a "Flag as false" button for c
613ommunity moderation.', 614 s_ugc_mod_li3: 'A report that receives at least 3 "false" votes within 4 hours is <strong>automatically hidden</strong>.', 615 s_ugc_mod_li4: 'All reports <strong>expire automatically after 4 hours</strong> and are removed from the server database by an hourly cron.', 616 s_ugc_mod_li5: '"False" votes (abuse-flags) are removed from the server within 24 hours.', 617 s_ugc_highlight: 'Reports are not user-to-user messages or chat: they are short-lived, anonymous, aggregated community data. There is no user profile, no direct user-to-user interaction, no personally identifying information.', 618 s4_title: 'Third-party Services', 619 s4_text: 'MeteoPomarico <strong>does not use analytics, advertising, or crash reporting SDKs</strong>. No services like Google Analytics, Firebase Analytics, Facebook SDK, or similar are integrated. Each external service used for data has its own privacy policy.', 620 s5_title: 'Account & Registration', 621 s5_text: 'The app and website <strong>do not require account creation</strong>. No email, password, or other personal data is needed to use the service.', 622 s6_title: 'Required Permissions (Android app)', 623 s6_li1: 'To download weather data, maps, and alert bulletins', 624 s6_li2_label: 'Notifications', 625 s6_li2: 'To send weather alert notifications (optional, can be disabled)', 626 s6_note: 'The app does not require access to location, camera, contacts, or other sensitive data.', 627 s7_title: 'Data Deletion', 628 s7_text: "All user preferences, statistics and the anonymous device identifier are stored <strong>only locally</strong>: to delete them, simply clear the app's data from Android Settings or uninstall the application.", 629 s7_text2: 'For server-side data: anonymous beach reports are automatically deleted within <strong>4 hours</strong>; "Flag as false" votes within <strong>24 hours</strong>. Reinstalling the app generates a new anonymous identifier with no link to the previous one.', 630 s8_title: "Children's Privacy", 631 s8_text: 'The Service is not directed at children under 13 and does not knowingly collect information from minors.', 632 s9_title: 'Disclaimer & Limitation of Liability', 633 s9_text_a: 'Weather data provided by MeteoPomarico comes from third-party sources (Open-Meteo, Civil Protection, WeatherFlow Tempest) and is presented <strong>for informational purposes only</strong>. The service operator:', 634 s9_li1: 'Does not guarantee the accuracy, completeness, or timeliness of the displayed data', 635 s9_li2: 'Is not responsible for any decisions made based on the information provided by the service', 636 s9_li3: 'Is not liable for any direct or indirect damages arising from the use or inability to use the service', 637 s9_li4: 'Does not guarantee the continuity or availability of the service, which may be interrupted at any time without notice', 638 s9_highlight: 'For weather emergencies, always refer to official Civil Protection bulletins and competent authorities.', 639 s10_title: 'Contact', 640 s10_text: 'For privacy-related questions, you can contact:', 641 footer_sub: 'Real-time weather for Pomarico and Basilicata' 642 } 643 }; 644 645 let currentLang = 'it'; 646 647 function setLang(lang) { 648 currentLang = lang; 649 const t = translations[lang]; 650 document.querySelectorAll('[data-i18n]').forEach(el => { 651 const key = el.getAttribute('data-i18n'); 652 if (t[key]) el.innerHTML = t[key]; 653 }); 654 document.documentElement.lang = lang; 655 // Update toggle buttons 656 document.querySelectorAll('.lang-toggle button').forEach(btn => { 657 btn.classList.toggle('active', btn.textContent.trim() === lang.toUpperCase()); 658 }); 659 } 660 661 function toggleDrawer() { 662 document.getElementById('drawer').classList.toggle('open'); 663 } 664 665 /* ââ Email obfuscation ââ */ 666 (function() { 667 document.querySelectorAll('a.eml').forEach(function(el) { 668 var u = el.getAttribute('data-u'); 669 var d = el.getAttribute('data-d'); 670 var label = el.getAttribute('data-label'); 671 var addr = u + '@' + d; 672 if (!label) { 673 el.textContent = addr; 674 } else { 675 el.textContent = label; 676 } 677 el.addEventListener('click', function(e) { 678 e.preventDefault(); 679 window.location.href = 'mai' + 'lto:' + u + '@' + d; 680 }); 681 }); 682 683 /* Honeypot: log bot interaction (optional server-side) */ 684 var trap = document.querySelector('.hp-trap'); 685 if (trap) { 686 trap.addEventListener('click', function(e) { 687 e.preventDefault(); 688 }); 689 } 690 })(); 691 692 /* ââ Disable right-click on email links ââ */ 693 document.addEventListener('contextmenu', function(e) { 694 if (e.target.classList && e.target.classList.contains('eml')) { 695 e.preventDefault(); 696 } 697 }); 698 </script>
698 699</body> 700</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.