← Torna alla home

Diario di bordo

Articoli, insight e aggiornamenti dal progetto Radar Benzina.

📌
Articolo

Perché è nato questo progetto

Il bisogno di monitorare i prezzi della benzina era reale, ma le alternative erano lente, piene di pubblicità e richiedevano un login obbligatorio. Così è nato Radar Benzina: da una semplice newsletter automatica a una piattaforma web completa.

Leggi articolo completo
Articolo

Sicurezza anti-bot: CAPTCHA, rate limiting e protezione HMAC

Come difendere le risorse da abusi automatizzati e scanner email senza esporre dati utente e mantenendo un'infrastruttura serverless senza database.

Leggi articolo completo
Articolo

Ottimizzazione dei costi: Bilanciamento chirurgico di API e task

Come Radar Benzina gestisce migliaia di visite al mese scaricando mappe gratuite, eseguendo geocoding in cache e azzerando le chiamate API costose tramite ricerca lato client.

Leggi articolo completo
Articolo

Gestione utenti: Double opt-in stateless senza database

La sfida di implementare iscrizioni e disiscrizioni sicure alla newsletter garantendo l'integrità dei dati tramite firme crittografiche HMAC-SHA256, senza l'uso di un database.

Leggi articolo completo
Articolo

Architettura Serverless: Pipeline su GitHub Actions, frontend su Vercel, zero costi

Scopri come ho costruito Radar Benzina senza database o server a pagamento, sfruttando l'efficienza chirurgica di GitHub Actions come cronjob e Vercel come Edge CDN.

Leggi articolo completo
Articolo

La sfida tecnica dietro la SEO: farsi trovare a costo zero

Dal JSON-LD alla sitemap generata dinamicamente con Python: come ho ottimizzato Radar Benzina per i motori di ricerca mantenendo architettura serverless e costi a zero.

Leggi articolo completo
Patch

v6.20.0 — Focus Mode: a11y, history e performance

Perfezionata l'esperienza di ricerca fullscreen su mobile e desktop: navigazione nativa con tasto indietro, animazioni ottimizzate per il risparmio energetico e massima accessibilità da tastiera.

Leggi tutto

La modalità Focus, cuore pulsante della ricerca su Radar Benzina, ha ricevuto un aggiornamento strutturale dedicato interamente all'usabilità e alle performance. L'intervento più atteso riguarda il supporto nativo alla history del browser: su dispositivi Android, la pressione del tasto fisico 'Indietro' ora chiude fluidamente la ricerca in sovrimpressione, riportando l'utente al punto esatto in cui aveva interrotto la navigazione in home page.

Sotto il cofano, l'interazione con l'overlay è stata ottimizzata per dispositivi meno performanti aggregando gli eventi di trascinamento, e sono state introdotte rigorose trap per il focus da tastiera (a11y) per impedire l'accesso accidentale a elementi invisibili. Infine, l'engine ora rispetta appieno le preferenze di sistema per la riduzione del movimento, disattivando animazioni superflue per gli utenti sensibili.

  • feature Tasto back del browser e di Android ora chiude la focus mode senza abbandonare la pagina
  • feature Supporto completo a prefers-reduced-motion per disabilitare transizioni superflue
  • fix Accessibilità: focus trap rinforzato per ignorare elementi resi invisibili dal CSS
  • fix Performance: layout thrash azzerato durante il trascinamento del pannello (coalescing via rAF)
  • fix Robustezza: l'invalidazione della mappa ora ascolta il completamento reale della transizione
Patch

v6.19.0 — SEO Brand Dominance e Ottimizzazione Open Graph

Aggiunto lo schema Organization, la favicon SVG e compresso l'asset Open Graph per migliorare la presenza del brand nei risultati di ricerca Google.

Leggi tutto

Per garantire che 'Radar Benzina' appaia come un'entità riconosciuta da Google con il proprio logo accanto ai risultati di ricerca, è stata effettuata una completa revisione degli asset SEO.

È stato introdotto un nuovo logo vettoriale SVG perfettamente scalabile per la favicon e lo schema Organization JSON-LD è stato integrato nell'HTML per dichiarare il brand ai motori di ricerca. Infine, l'immagine di anteprima Open Graph è stata ottimizzata e ridotta drasticamente per velocizzare la condivisione sui social.

  • feature Implementato lo schema Organization per il riconoscimento del brand in SERP
  • feature Aggiunto asset logo SVG scalabile e referenziato nel manifest
  • fix Compressione drastica dell'immagine Open Graph (da 451KB a 109KB)
Patch

v6.18.0 — Audit di Robustezza: 13 Fix Preventivi

Il sito funzionava, ma un'analisi statica approfondita ha portato alla luce fragilità latenti distribuite su tutta la codebase — dal parser dati MIMIT al frontend, fino al loop di invio email. Nessun crash visibile, ma condizioni specifiche potevano innescarli. Li ho risolti preventivamente.

Leggi tutto

Un audit sistematico del codice — senza aspettare i problemi — ha identificato 11 bug e 5 miglioramenti da applicare preventivamente. La categoria più interessante riguardava la resilienza silenziosa: punti in cui il sistema continuava a funzionare in condizioni normali, ma avrebbe potuto produrre dati inconsistenti o perdere informazioni in scenari di errore reali. Ad esempio, il parser CSV MIMIT inizializzava silenziosamente la variabile dell'header alla riga 0 se il campo idimpianto non veniva trovato: anziché fermarsi con un messaggio chiaro, avrebbe elaborato righe sbagliate propagando dati corrotti a valle. Il file storico delle medie poteva accumulare date duplicate in caso di run interrotti e ripresi. E due percorsi di errore nell'invio email loggavano ancora l'indirizzo del destinatario in chiaro, vanificando parzialmente un fix di privacy precedente.

Sul frontend, i listener agli eventi sui widget del run hash e delle schede carburante venivano re-aggiunti ad ogni render senza guardie di idempotenza — irrilevante oggi, ma un bug garantito appena si fosse introdotto il refresh automatico. Il caricamento del file dati principale ora ritenta automaticamente due volte con backoff progressivo prima di mostrare l'errore, migliorando la tolleranza ai momenti di latenza del CDN Vercel. Il cambiamento più rilevante riguarda però la policy di atomicità email-sito: se più del 50% degli invii fallisce in una singola esecuzione, la pipeline si interrompe prima di aggiornare il sito — garantendo che chi non ha ricevuto l'email non trovi dati più recenti online. Sotto quella soglia, un fallimento parziale viene tracciato nell'audit trail ma non blocca l'aggiornamento.

  • fix Parser CSV MIMIT: errore immediato e diagnostico chiaro se il formato header non viene riconosciuto
  • fix Policy email-sito: fallimento parziale oltre il 50% interrompe la pipeline per garantire coerenza tra email ricevuta e dati visualizzati
  • feature Frontend: 2 retry automatici con backoff sul caricamento dati prima di mostrare l'errore
  • fix Privacy completata: nessun indirizzo email esposto nei log nemmeno in caso di errore SMTP
Patch

v6.17.0 — Rilevamento Anomalie su Tutta la Sicilia

Il check sui prezzi anomali confrontava la storia solo per le stazioni nei comuni monitorati. Un errore di battitura su un qualsiasi altro impianto siciliano passava invisibile. Ora il controllo copre ogni stazione dell'isola.

Leggi tutto

Il check di consistenza temporale — confrontare il prezzo di oggi con la mediana storica della stessa stazione — è il filtro più efficace contro gli errori di data-entry al MIMIT che sfuggono ai controlli di range e agli outlier IQR. Fino a questa versione, però, lo storico veniva aggiornato solo per le stazioni nei comuni della newsletter e per le prime tre più economiche dell'isola: le altre non avevano storia, e senza storia nessun confronto era possibile.

Il modulo di storicizzazione è stato esteso a coprire ogni stazione presente nel dataset siciliano post-filtro. Il file storico_stazioni.json cresce di conseguenza, ma il check di anomalia opera ora sull'intera regione. Ogni deviazione superiore al 15% viene in più registrata in un log dedicato, utile per identificare nel tempo gli impianti con comportamento cronicamente anomalo.

  • fix Storicizzazione prezzi estesa a tutte le stazioni siciliane, non solo ai comuni monitorati
  • feature Nuovo log quarantena_temporale.jsonl per audit degli impianti con anomalie di prezzo ricorrenti
  • fix Hash di run esteso con medie nazionali e conteggio stazioni per una verifica di coerenza più completa
  • fix Controllo drift aggiunto sui timestamp MIMIT per rilevare date future o sfasamenti di fuso orario
Patch

v6.13.0 — Ottimizzazione SEO tecnica e Cross-Linking

Dopo aver completato il prodotto, il problema era renderlo 'scopribile'. Rilascio di tutta l'infrastruttura di indicizzazione automatizzata e ottimizzazione della navigazione interna.

Leggi tutto

Per permettere a Google di comprendere la mole di dati elaborata quotidianamente, sono stati implementati i dati strutturati (JSON-LD) direttamente nei template Jinja2, senza plugin o appesantimenti.

È stata inoltre sviluppata una funzione in Python che genera dinamicamente la sitemap.xml ad ogni build, azzerando i costi di crawling esterni.

  • feature Implementazione JSON-LD dinamico (Breadcrumbs, FAQ, Dataset)
  • feature Sitemap auto-generata in Python durante la build
  • fix Accessibilità migliorata sul grafico storico (fallback canvas)
  • feature Riorganizzazione totale dei link interni per SEO
Patch

v6.12.0 — Sistema di Intelligent Cross-Linking

Un restyling profondo dell'architettura di navigazione per abbattere le barriere tra le diverse anime del sito, rendendolo esplorabile come una vera e propria app.

Leggi tutto

Fino ad ora, le sezioni Ricerca, Classifica e Blog vivevano in compartimenti stagni. È stato implementato un sistema di ancore intelligenti gestito in JavaScript che traccia l'intento dell'utente.

Se arrivi al sito tramite un link diretto a una FAQ o a un grafico, il layout si anima, espande le sezioni necessarie ed evidenzia visivamente l'elemento cercato con transizioni fluide.

  • feature Navigazione 'pill' dinamica per interconnettere Homepage e FAQ
  • feature Deep-linking JavaScript per il caricamento contestuale dei widget
  • fix Risolto il problema dell'overflow orizzontale su device mobile
Patch

v6.10.0 — Motore Statistico e Anomalie

I gestori a volte sbagliano a digitare i prezzi al MIMIT (es. 0,18€ invece di 1,80€). È stata implementata una pipeline a 14 step per intercettare gli errori senza nascondere i dati.

Leggi tutto

Invece della classica 'media aritmetica' che veniva sballata dal minimo errore di data-entry, ora il motore calcola la Mediana Robusta e l'Intervallo Interquartile (IQR).

I dati fuori scala non vengono cancellati, ma marcati visivamente con il badge 'INCERTO' a fini di trasparenza, permettendo all'utente di fare le proprie valutazioni.

  • feature Aggiunta della sezione 'Come Calcoliamo i Prezzi' con timeline interattiva
  • feature Algoritmo IQR per l'identificazione degli outlier
  • fix Risolto crash delle tabelle in presenza di dati MIMIT incompleti
Patch

v6.8.0 — Gestione Iscrizioni e Sicurezza Anti-Bot

Riscritto da zero il sistema di acquisizione iscritti alla newsletter per proteggermi dagli attacchi automatizzati e garantire la massima privacy (stateless double opt-in).

Leggi tutto

Gestire le email degli utenti comporta enormi responsabilità. Piuttosto che utilizzare un database esposto per memorizzare le iscrizioni in attesa di conferma, ho implementato un sistema di Double Opt-in firmato crittograficamente con HMAC.

Questa infrastruttura blocca lo spam alla radice, integrando rate-limiting e verifiche CAPTCHA senza intaccare l'esperienza d'uso legittima e senza gravare sui costi server.

  • feature Implementazione crittografia HMAC per conferme via email
  • feature Nuovo livello di rate-limiting e difesa anti-spam
  • fix Eliminato il rischio di data-leak grazie all'architettura senza database
Patch

v6.5.0 — Ricerca Spaziale e GPS

Spulciare elenchi statici era diventato un collo di bottiglia. Ho riscritto la logica client-side per gestire migliaia di coordinate in tempo reale su mappa.

Leggi tutto

Il 'Radar Locale' ora utilizza le API di geolocalizzazione del browser per calcolare le distanze con la formula dell'Haversine, senza alcuna chiamata server-side.

L'intero database di stazioni siciliane viene caricato in un payload compresso, rendendo la ricerca istantanea.

  • feature Attivazione GPS e rilevamento prossimità
  • feature Motore di ricerca testuale per Comune e Bandiera
  • fix Ottimizzazione rendering DOM per liste lunghe
Patch

v6.3.0 — Motore Grafico Trend 90 Giorni

Per comprendere davvero le variazioni del mercato serviva un impatto visivo netto. Rilascio della dashboard 'Andamento' con storicizzazione e confronto dati.

Leggi tutto

È stato ingegnerizzato un sistema basato su Canvas e Chart.js capace di plottare istantaneamente 90 giorni di mediane, paragonando in real-time l'andamento del prezzo siciliano con la media nazionale italiana.

L'interfaccia include crosshair mobili e un tool-tip dinamico che permette all'utente di esaminare i differenziali di costo per ogni singolo giorno del trimestre passato.

  • feature Rendering grafico ad alte prestazioni (Canvas)
  • feature Aggregazione storica a 14, 30, 60 e 90 giorni
  • fix Calibrato il responsive design dei grafici per dispositivi molto piccoli
Patch

v6.0.0 — Lancio della piattaforma web

Radar Benzina non è più solo una newsletter. L'intera infrastruttura è stata migrata per servire i dati MIMIT su una vera e propria web-app serverless.

Leggi tutto

Dopo mesi di invii email, il progetto fa il salto di qualità. La nuova architettura è costruita al 100% su GitHub Actions per l'estrazione dati e Vercel per l'hosting statico.

Zero database, zero costi server, velocità massima garantita dalla pre-generazione HTML (SSG) tramite Jinja2.

  • feature Rilascio dashboard principale e classifica stazioni
  • feature Automazione build Python + Jinja2 (sotto i 10 secondi)
  • feature Integrazione API MIMIT