MV ← tutti i progetti
motore: three.js — versione 2d

Progetto · giornale personale

Il Radar

sintesi — rev. 3

Un sistema che ogni mattina sceglie le notizie che ti riguardano e le impagina già pronte da stampare, come la prima pagina di un quotidiano: due fogli A4, a schermo o su carta.

In uso — gira ogni mattina feriale alle 7:30 sul mio PC

Il problema

Ogni mattina escono troppe notizie per leggerle tutte. Serve riceverne poche, giuste, in un formato che finisce.

Ogni mattina escono centinaia di articoli su ciò che seguo: leggi sull'AI, attacchi informatici, repository nuovi su GitHub, lavori di ricerca. Un feed non aiuta, perché non finisce mai: è fatto per tenerti dentro, non per farti smettere. Una newsletter fa metà del lavoro, ma la selezione l'ha fatta qualcun altro, per un pubblico medio.

Un giornale ha una proprietà che un feed non ha: finisce. Ha due fogli, una prima pagina, un ordine di importanza. Il problema è ridurre seicento elementi a una pagina che si legge in dieci minuti, in modo che chi la legge si fidi anche di ciò che manca.

La soluzione non è un altro feed né un riassunto generato: è un sistema che fa da redazione. Raccoglie, toglie i doppioni, sceglie con regole scritte e leggibili e compone la pagina. Il lavoro è di architettura e di impaginazione: le regole decidono cosa entra, e un modello che gira in locale interviene solo per tradurre ciò che è in inglese.

vincoli di progetto
  • Deve finire. Due fogli A4 e un numero fisso di voci. Il limite è la funzione, non un difetto.
  • Deve uscire bene su carta. La stessa pagina si legge a schermo e si stampa su due fogli, senza intestazioni del browser e senza ritocchi a mano.
  • Deve dire perché. Ogni voce porta le parole che l'hanno fatta entrare: una selezione che non si spiega non si può correggere.
  • Non deve fermarsi. Una fonte irraggiungibile o una traduzione che non risponde non possono bloccare il giro del mattino.
  • Niente esce dal computer. La traduzione gira in locale: nessun testo delle notizie va a un servizio di intelligenza artificiale esterno.
  • Niente da installare. Solo la libreria standard di Python: nessun pacchetto che un aggiornamento possa rompere.

Come è fatto

Un archivio al centro, un passaggio alla volta, e una pagina che finisce su due fogli.

fig. 1 — la pagina: il foglio A4 e, sotto, ciò che si vede solo a schermo
IL RADAR 1 2 3 4 5 6 7 testata apertura barra dei titoli rubriche dal codice sport · weekend a Roma rimasti fuori nome, data e tempo del giorno la notizia più forte, per esteso In breve, Sport, Italia, Estero, ricerca le altre notizie, in due colonne repository per tema, con una spiegazione i fatti importanti; nel weekend l'agenda solo a schermo, con i giudizi ▲ ▼ un foglio A4, al massimo due
fig. 2 — il giro che la produce, con i numeri del 25/09/2026
raccolta doppioni selezione traduzione impaginazione edizione server locale carta RSS · GitHub · arXiv una storia sola parole chiave pesate inglese → italiano prima pagina un file al giorno schermo, telefono 2 fogli A4 696 nuove 51 riunite 35 scelte 30 da tradurre pronte da stampare la traduzione riguarda solo ciò che è già stato scelto
fig. 3 — gli stessi passaggi, con ciò che scrivono nell'archivio
raccolta doppioni selezione traduzione impaginazione server locale RSS · GitHub · arXiv impronta di 5 lettere punti dal profilo inglese → italiano prima pagina A4 schermo e telefono fonti.py elenco delle testate profilo.toml parole, pesi, soglie edizioni/AAAA-MM-GG.html data/radar.db · SQLite + elemento, id unico + copertura, copia nascosta + punti, parole, ruolo + titolo_it, riassunto + giudizio ▲ ▼ ▲ utile · ▼ non mi interessa

Tre disegni della stessa cosa: la pagina come esce dalla stampante, il giro che la produce e ciò che ogni passaggio scrive nell'archivio. I riquadri tratteggiati della vista tecnica sono file veri. Nel giro del 25/09/2026, 696 voci nuove sono diventate 35 in pagina: la traduzione ne ha viste trenta, perché le altre cinque erano già in italiano.

Il giro è una sequenza di passaggi che scrivono ciascuno in una colonna dell'archivio, e il passaggio dopo legge quella colonna. Niente passa da memoria a memoria: se il giro si interrompe, l'archivio dice a che punto era.

  1. 1 · raccolta

    Fonti diverse, un archivio solo

    Le notizie arrivano da feed RSS di testate di tecnologia, sicurezza e politica digitale, in inglese e in italiano, e da ricerche mirate su Google News; i repository da GitHub, per tema, tra i più seguiti e aggiornati nell'ultimo mese; i lavori di ricerca dal feed di arXiv, solo titoli. Nel mio profilo ci sono anche lo sport, l'attualità italiana ed estera e l'agenda del weekend a Roma: quali sezioni esistano lo decide il profilo di chi legge. Ogni elemento ha un identificativo ed entra una volta sola. Una fonte irraggiungibile viene saltata e scritta nel log: non ferma il giro.

  2. 2 · doppioni

    La stessa storia, in due lingue

    Dieci testate danno la stessa notizia con titoli diversi, a volte in due lingue. Per riconoscerla non ho usato un modello, ma un'impronta grossolana: di ogni titolo si tengono le prime cinque lettere delle parole di almeno quattro lettere, tolte quelle vuote. Così «governo» e «government», «attacco» e «attack» diventano la stessa cosa tra italiano e inglese. Due titoli sono la stessa storia se condividono almeno tre impronte e almeno il 60% di quelle del più corto.

    La copia non sparisce: resta nell'archivio, nascosta, così un secondo giro non la riconta, e ogni testata in più fa salire il punteggio della storia — con un bonus solo per le prime tre, poi conta soltanto il numero.

    fig. 4 — l'impronta, su un esempio costruito
    due titoli impronte, 5 lettere esito Il governo vieta nuovi data center Government bans new data centers gover vieta nuovi data cente gover bans data cente stessa storia su 2 testate 3 impronte in comune su 4 (il 75%): soglia ≥ 3 e ≥ 60% della più corta
  3. 3 · selezione

    Un punteggio che si può leggere

    Ogni elemento prende punti dalle parole chiave del profilo, ognuna con il suo peso — anche negativo, per spingere giù il rumore. Le notizie sono divise in tre rubriche (governi e regole, cybersicurezza, AI e sviluppo) ed entrano solo se toccano tecnologia o sicurezza: una legge che non parla di digitale resta fuori. Poi si scende dalla più forte, saltando ciò che è troppo vicino a una già scelta: senza questo passaggio, sette moratorie di contee americane occupano metà pagina. I repository si scelgono per tema, tra quelli che guadagnano più stelle negli ultimi sette giorni, al massimo due per tema. Sport e attualità hanno regole loro, descritte più sotto.

    Sulla pagina ogni voce dice «Perché è qui» con le parole che l'hanno fatta entrare. In fondo, una sezione elenca ciò che ha preso punti ma non è entrato: chi legge vede cosa manca, non solo cosa c'è.

  4. 4 · traduzione

    Solo l'inglese passa dal modello

    Le fonti italiane escono come sono. Ciò che è in inglese, una volta scelto, viene tradotto e riassunto in italiano da un modello linguistico che gira sul computer (MiniCPM 4.1, otto miliardi di parametri, tramite Ollama): un titolo e due frasi, non di più. Lo stesso modello spiega i repository partendo dal loro README. È un passaggio sostituibile, perché la selezione non dipende da lui. Se la risposta è fuori formato o il modello non risponde, la voce esce comunque, con il testo originale.

  5. 5 · carta

    Una pagina che si stampa

    L'edizione è un file HTML per giorno, e a fine giro anche il PDF identico alla stampa. È impaginata come la prima pagina di un quotidiano in bianco e nero: a sinistra l'apertura e un flusso a due colonne con le rubriche, i repository, lo sport e, nel weekend, l'agenda di Roma; a destra la barra dei titoli; in testata il tempo del giorno. A schermo, in fondo, ci sono «rimasti fuori» e i pulsanti ▲ utile e ▼ non mi interessa, che non si stampano: salvano il giudizio nell'archivio e servono a tarare pesi e soglie. Il server ricompone la pagina a ogni richiesta, quindi il giudizio si vede subito.

proprietà dell'insieme

Ogni passaggio lascia il proprio risultato nell'archivio. Un giro interrotto a metà riparte da dove era: chi ha già un riassunto non viene ritradotto, e chi era già stato visto non viene raccolto due volte. È ciò che permette di rieseguire il giro senza paura, ed è la stessa idea che regge ResGestae: lo stato vive fuori dal programma, dove si può leggere.

Le scelte, e perché

Quasi tutte partono dalla pagina finale e vanno all'indietro.

  1. forma

    Il giornale finisce

    Dodici notizie per esteso e dieci in breve, otto repository, due fatti sportivi per esteso e cinque in breve, cinque titoli di attualità per zona e cinque lavori di ricerca: sono numeri scritti nel profilo, e sono il progetto. Un contenitore finito costringe a scegliere e obbliga la selezione a essere onesta: ciò che resta fuori è elencato in fondo, con i punti presi, non nascosto.

  2. selezione

    Le regole scelgono, il modello no

    Nei primi test gli chiedevo di giudicare: «questa notizia è pertinente, sì o no?», «in che campo rientra?». Sbagliava troppo, e in modo poco spiegabile. Ho scritto il giudizio in regole: parole chiave con un peso, in un file leggibile. Il vantaggio non è solo l'affidabilità: ogni voce dice «Perché è qui», e una selezione che si spiega si può correggere. Al modello resta la traduzione, dove un errore si vede a colpo d'occhio.

  3. privacy

    La traduzione gira sul computer, e solo quando serve

    Ollama sta in una cartella del progetto, senza installazione di sistema, e viene acceso solo per la durata delle traduzioni e spento dopo; se gira già, lo usa e non lo tocca. Nessun testo esce verso servizi di intelligenza artificiale esterni: è il vincolo che ha deciso questo pezzo. Ho provato prima un modello da un miliardo di parametri: veloce, ma scriveva un italiano povero. Il compromesso è uno da otto.

  4. dipendenze

    Solo la libreria standard

    Archivio, configurazione, richieste, server e lettura dei feed usano solo moduli standard di Python: nessun pacchetto da installare, nessun aggiornamento che rompa il giro del mattino, nessun ambiente virtuale da riparare. Il prezzo è che la pagina si compone a stringhe, senza un motore di template; per una pagina sola è un prezzo che pago volentieri.

Su misura: il mio profilo, e il tuo

I filtri che vedi in questa pagina sono i miei. Il sistema è lo stesso per chiunque: cambia il profilo.

Il Radar non decide da solo cosa è importante: lo decide un profilo, cioè un file di configurazione e un elenco di fonti. Il mio riflette ciò che seguo — tecnologia e sicurezza, repository per tema, sport, attualità, weekend a Roma — ed è una scelta personale, non un limite del sistema. Il motore che raccoglie, toglie i doppioni, sceglie e impagina non cambia.

Per un'altra persona o per un'azienda il lavoro è costruire il profilo giusto: quali testate leggere, quali parole contano e quanto, quali sezioni servono, quante voci per pagina, quale città per il tempo.

fig. 5 — cosa cambia da un profilo all'altro
il mio profilo tecnologia, sicurezza, AI repository per tema sport, attualità, weekend a Roma il tempo di Roma il tuo profilo il tuo settore le testate che leggi le sezioni che ti servono la tua città cambiano un file e l'elenco delle fonti il motore — non cambia raccolta doppioni selezione impaginazione la pagina due fogli A4, su misura
fig. 6 — il mio profilo, sezione per sezione
sezione da dove arriva cosa la fa entrare notizie testate di tecnologia e sicurezza, EN e IT; Google News mirato parole chiave pesate, in tre rubriche; solo se toccano digitale o sicurezza repository GitHub, per tema: agenti, LLM locali, 3D e WebGL, sicurezza, automazione stelle guadagnate negli ultimi 7 giorni; al massimo due per tema sport OA Sport, FIDAL, Runner's World, ANSA; gare a Roma da Google News importanza dal titolo, niente calcio; per esteso solo i fatti importanti attualità ANSA, ISTAT e altre testate (Italia ed estero) solo fatti avvenuti: niente ipotesi, domande o sole dichiarazioni weekend testate romane e laziali; sabato e domenica solo Roma e dintorni: guide, musica, sagre, mostre ricerca arXiv: cs.AI, cs.LG, cs.CR (solo titoli) parole chiave pesate, soglia minima; cinque titoli al massimo
  1. cosa si cambia

    Un file e un elenco di fonti

    Le parole chiave con i pesi, le soglie, quante voci per sezione, la città del tempo, le testate e le ricerche su Google News. Non toccano il motore e si provano in pochi minuti: si rigenera il giro e si guarda la pagina, anche nell'anteprima di stampa.

  2. cosa richiede codice

    Le rubriche, e le sezioni nuove

    Cambiare nome e numero delle rubriche delle notizie richiede due righe di codice. Una sezione nuova, con la sua fonte e le sue regole, è più lavoro ma ha già uno schema: è così che sono arrivati lo sport e l'attualità.

  3. come si tara

    Il sistema mostra cosa manca

    In fondo alla pagina, «rimasti fuori» elenca ciò che ha preso punti ma non è entrato, e i pulsanti ▲ ▼ registrano cosa sarebbe servito: sono lo strumento per ritoccare pesi e soglie dopo i primi giorni.

Scrivimi per una consulenza

Cosa non ha funzionato

La parte utile. Sono errori veri, con la diagnosi.

  1. imprevisto 1

    La carta non è lo schermo, e ogni browser stampa a modo suo

    L'obiettivo era che stampasse bene, e ha richiesto tre tappe. Prima le intestazioni del browser: titolo, data e indirizzo comparivano su ogni foglio. Il margine del foglio va a zero, così il browser non ha dove metterle, e i dieci millimetri li dà la pagina stessa. Poi il numero di fogli: da tre a due, con colonne che fluiscono invece di fasce di altezza fissa che restavano mezze vuote. Poi la prima pagina sbilanciata, corretta con uno script che misurava le colonne nel formato dell'A4 e spostava le notizie perché finissero insieme.

    Diagnosi: tutto questo funzionava in Edge e in Chrome, non in Firefox, che è il mio browser predefinito. Firefox non spezza una griglia o un blocco a colonne tra due pagine: lo sposta intero sulla successiva, e la prima usciva con la sola testata. Non era un difetto da correggere caso per caso: la paginazione è del browser, e ogni browser la fa a modo suo. La correzione è stata togliergliela. Uno script costruisce due fogli di misura fissa, 210 per 296 millimetri, misura ogni articolo e lo dispone a mano nelle colonne, in ordine e senza spezzarlo. Se non ci stanno tutti, l'articolo meno importante diventa un titolo nella barra — prima lo sport, poi le notizie — e i riassunti non si accorciano mai. Con fogli a misura fissa non c'è niente da spezzare, e il risultato è identico ovunque.

  2. imprevisto 2

    Una chiamata che non risponde ferma tutto

    Il 25/09/2026, nel giro programmato delle 7:30: sei riassunti, da tre a quindici secondi ciascuno, poi una chiamata al modello non ha mai risposto. Dopo dieci minuti il timeout ha fermato l'intero giro, e le notizie sono rimaste senza riassunto.

    Diagnosi: probabilmente un ciclo senza fine — senza un tetto alla lunghezza della risposta, un modello locale ogni tanto scrive per sempre. Il problema non era una risposta sbagliata ma l'assenza di una risposta, e una catena senza scadenze si ferma sul suo anello più lento. La correzione sono tre limiti: un tetto di duecentocinquanta token alla risposta, tre minuti al massimo per chiamata, e un errore che tocca solo la voce in questione, che resta in inglese mentre il giro continua.

    Lo stesso giorno, un secondo sintomo della stessa famiglia: una voce con «l'immediato l'immediato l'immediato…» per mezza colonna. Un modello piccolo, se non lo si frena, ripete: ora c'è una penalità per le ripetizioni.

  3. imprevisto 3

    Il JSON chiesto a parole non regge

    Volevo risposte strutturate: titolo e riassunto in JSON. Chiesto a parole, il modello lo sbagliava circa una volta su due — una parentesi, una virgoletta, un commento in più. Ho provato l'output vincolato di Ollama: con questo modello risponde con un errore («Failed to initialize samplers»).

    Diagnosi: stavo chiedendo a un modello piccolo di rispettare una sintassi, che è esattamente ciò che sbaglia. La correzione è stata abbassare la pretesa: due righe di testo, TITOLO e RIASSUNTO, lette con un'espressione regolare. Il testo a righe lo scrive sempre; se manca una riga, la voce esce con il testo originale.

  4. imprevisto 4

    Il modello ricade nel cinese

    In mezzo a una frase italiana compariva qualche ideogramma: «la trasparenza dei 数据中心». Il modello è addestrato molto sul cinese e ogni tanto ci ricade.

    Diagnosi: non è un errore che si prevenga con un'istruzione migliore, ed è invisibile finché non lo si legge. La correzione è un controllo in codice: un'espressione regolare sui caratteri cinesi e coreani; se scatta, una seconda richiesta con l'istruzione esplicita di scrivere solo in alfabeto latino; se scatta ancora, si rinuncia e si tiene l'originale in inglese.

  5. imprevisto 5

    Dal telefono non si apriva

    In casa volevo leggerlo dal telefono, ma il server ascoltava solo sul computer stesso. Per aprirlo alla rete di casa l'ho fatto ascoltare su tutte le interfacce, il che vuol dire esporlo: a tenerlo chiuso dall'esterno è il firewall, con la porta aperta solo per le reti «private» e la rete locale, configurato da uno script del progetto e non a mano.

    Diagnosi: aprire un servizio alla rete è una decisione di sicurezza, non di comodità, e va scritta dove qualcuno la ritroverà. Con una VPN attiva, per di più, serve l'opzione che lascia visibili i dispositivi della rete locale.

Esito, e cosa manca

Il Radar gira dal 24/09/2026: ogni mattina feriale alle 7:30 raccoglie, sceglie, traduce e impagina, e l'edizione è pronta sul PC, sul telefono in casa o su carta. La parte che ha retto meglio non è nessuno dei singoli passaggi: è che ognuno scrive il proprio risultato nell'archivio, dove un giro interrotto lascia lo stato leggibile e rieseguire non costa niente.

Se dovessi indicare la lezione trasferibile: il formato finale decide l'architettura. Un giornale che deve stare su due fogli obbliga a scegliere, a dire cosa è rimasto fuori e a misurare nel formato in cui la pagina uscirà. Il modello linguistico, in tutto questo, è un componente piccolo e sostituibile: traduce. Il lavoro sta nel resto.

prossimo passo — non ancora fatto

I giudizi ▲ ▼ si accumulano già nell'archivio, ma non fanno ancora niente da soli: pesi e soglie si ritoccano a mano. Chiudere il cerchio — usare i giudizi per correggere il profilo, e mostrare quali parole chiave lo hanno fatto sbagliare — è il passo successivo, e lo farò quando ce ne saranno abbastanza da renderlo statistica invece di aneddoto.

Scrivimi per una consulenza ↑ Tutti i progetti

Il codice non è pubblico. Se ti serve un profilo tuo — altre fonti, altri argomenti, un altro formato di carta — scrivimi.