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.
- 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.
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 · 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 · 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 -
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 · 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 · 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.
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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à.
-
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.
Cosa non ha funzionato
La parte utile. Sono errori veri, con la diagnosi.
-
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.
-
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.
-
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.
-
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.
-
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.
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.