Trenitardo

Dov'è il mio treno e quando arriva da me: web app, app Android e bot Telegram per seguirlo fino alla fermata.

Prova l’app ↗trenitardo.netlify.app

Si installa come una vera app, senza store:iPhone: Condividi → Aggiungi alla schermata HomeAndroid: menu ⋮ → Installa app

tipo
app
anno
2026
stack
Node.js, Express, React, Vite, Kotlin, Jetpack Compose, Web Push, Netlify
online
trenitardo.netlify.app ↗

in breve

Trenitardo ti dice dov'è il tuo treno adesso, di quanto è in ritardo e fra quanto arriva alla tua fermata, e ti avvisa mentre viaggi. Nasce dai dati pubblici di ViaggiaTreno, partito dalla linea Verona–Brennero, e funziona per i treni di tutta Italia. Può anche partire dalla destinazione ("Arriva a") e seguire da solo i viaggi di tutti i giorni (routine). È una web app installabile, un'app Android e un bot Telegram, tutti alimentati dallo stesso servizio.

La home di Trenitardo con l'aspetto Sobrio e la ricerca Trento → Verona Porta NuovaLa vista del treno 16679 Bolzano → Verona, in transito dopo Trento, con la hero Sobria, l'ultimo rilevamento e le fermateI cinque prossimi treni da Trento verso Verona Porta Nuova, con il ritardo di ognuno
  • PWA installabile
  • app Android
  • bot Telegram
  • "Arriva a" e routine
  • orologio e widget

Il problema

Sei sulla banchina alle 6:40. Il tabellone dice che il treno ha dieci minuti di ritardo. Poi venti. Poi smette di dire qualcosa. È in arrivo? È fermo in mezzo alla campagna? Faccio in tempo a prendere un caffè?

Le app dei treni ti danno il ritardo, ma quasi mai la risposta che serve davvero: dov’è adesso, e fra quanto arriva da me. I dati per saperlo esistono: li pubblica ViaggiaTreno. Ma sono pensati per un tabellone, non per una persona con il telefono in mano, e a volte sono sbagliati o in ritardo anche loro.

Ho costruito Trenitardo per rispondere solo a quella domanda. Ho cominciato dalla linea che uso, Verona–Brennero, ma si può cercare qualsiasi treno o stazione d’Italia.

Come funziona

Apri l’app. In alto, se stai già seguendo un treno, c’è una card piccola: dove si trova, fra quanti minuti arriva alla tua fermata, di quanto è in ritardo. Il resto della schermata è la ricerca.

Scrivi da dove parti e dove vai (Trento, Verona). Accanto al tasto “Cerca” c’è un pulsantino “Quando”: di default è “Adesso”, ma toccandolo scegli un altro giorno e un’altra ora con due ruote, come sull’iPhone. Mentre cerca, una linea di puntini con quattro stazioni e una luce rossa che scende ti fa capire che sta lavorando.

Il selettore del giorno e dell'ora, con Domani scelto e le ruote di ore e minuti
Il selettore "Quando"
I treni di domani dalle 06:00 da Trento a Verona Porta Nuova, con gli orari programmati
I treni di domani, dalle 06:00

Arrivano i prossimi cinque treni. Ognuno dice dove va, a che ora arriva da te e in che stato è: ancora fermo, in viaggio, già arrivato.

Tocchi un treno e in cima compare la hero: il treno sui binari col paesaggio delle fermate che sta attraversando, la fermata dove si trova, il conto alla rovescia fino a te e il ritardo in rosso o in verde. (Con l’aspetto classico, al posto della hero c’è un “tabellone” scuro a puntini, come un display LED.) Sotto, la lista delle fermate con un pallino rosso che si sposta fra una stazione e l’altra. La fermata dove scendi è cerchiata di bianco.

Il Frecciarossa 8519 fermo a Trento con il tema chiaro: cielo azzurro, Duomo e Buonconsiglio dietro il treno
Col tema chiaro: un Frecciarossa fermo a Trento

A questo punto scegli “Fino a Verona” e premi “Segui”. Non serve più guardare lo schermo: arriva una notifica quando il treno cambia stazione, quando il ritardo cresce, quando sta per arrivare da te.

Ricostruzione in HTML: una sola notifica che cambia mentre viaggi.

Se lo stesso viaggio è fra tre giorni, la schermata è la stessa, ma al posto del ritardo la hero dice quando parte.

Il 16653 di domani: fermo in banchina davanti alla stazione, la hero dice «Parte domani, 06:09» e l'arrivo a Verona alle 07:32
Un treno di domani: fermo in stazione, la hero dice quando parte

Quello che ancora non c’è: le notifiche push dell’app Android a telefono “a riposo” (oggi vivono finché il servizio dell’app resta attivo).

Cosa sa fare

“Arriva a”: dimmi solo dove vuoi andare

Non sempre sai da che stazione partire. Nella scheda “Arriva a” scrivi solo la destinazione, per esempio Milano Centrale. L’app guarda dove sei, trova la stazione più vicina e ti propone i treni che puoi prendere davvero: quando uscire di casa, a piedi o in macchina, e se ce la fai. Puoi dire “parto alle” oppure “arrivo entro”.

La scheda Arriva a: destinazione Milano Centrale, partenza da Roma Termini e i treni con l'ora a cui uscire
Da Roma Termini a Milano Centrale: a che ora uscire e se ce la fai

Le routine

Lo stesso viaggio tutti i giorni? Una routine lo segue da sola. Dalla vista di un treno scegli andata o ritorno e i giorni della settimana: mezz’ora prima della partenza il treno viene seguito in automatico, con le notifiche di sempre. Una routine “Arriva a” fa di più: ogni giorno ricalcola il treno migliore da dove parti e ti avvisa quando è ora di uscire. Si possono mettere in pausa, saltare un giorno, riordinare e gestire anche i viaggi con un cambio.

Aggiungi alla routine: Roma Termini → Milano Centrale alle 13:50, andata o ritorno e i giorni della settimana
Un treno in routine: i giorni e la direzione
Routine Arriva a verso Milano Centrale: da dove parto, a piedi o in macchina, orario e giorni
Una routine "Arriva a": ogni giorno il treno migliore

Seguire un treno fino alla tua fermata

Scegli dove scendi e le notifiche si fermano lì. Se il treno parte fra ore, o fra giorni, l’avviso parte da solo poco prima della partenza.

Sapere dov’è, davvero

La posizione è filtrata: un treno non torna indietro, e un rilevamento strano non sposta il pallino sulla stazione sbagliata. Se oltre 15 minuti dopo l’orario previsto non è ancora partito, lo dice in rosso.

Lo stato della linea

Per la Verona–Brennero c’è anche una pagina con lo stato di tutta la linea, ispirata alle mappe della metropolitana: si vede a colpo d’occhio se il servizio è regolare. Esiste solo per questa linea.

Orari fino a 60 giorni avanti

Scegli un giorno e un’ora e vedi i treni programmati, con durata e cambi. Un tocco apre le fermate, con una nota onesta: gli orari reali compaiono il giorno del viaggio.

I treni già passati oggi

Sono le 18 e vuoi vedere il treno delle 7: la lista c’è, con il ritardo finale e “arrivato”. Utile per capire cosa è successo, o per sapere se quel treno lo fa tutti i giorni in ritardo.

Avvisi che servono

Treno cancellato, nessun aggiornamento da più di 15 minuti, non ancora partito, e un promemoria “ricordati di timbrare” quando mancano un paio di fermate. Il testo del promemoria lo scegli tu.

Condividere il viaggio

Un link con il treno e la fermata dove scendi: chi lo apre vede “Davide scende a Milano” e può seguirlo con un tocco. Il nome davanti alle notifiche distingue i treni degli altri dai tuoi.

Sul polso, nella home, sul retro del telefono

Un’app per Wear OS, i widget nella home di Android e un Toy per la Glyph Matrix del Nothing Phone 3, che mostra il treno seguito con minuti e stazione.

Anche da Telegram e dalla barra del PC

Un bot Telegram (comando /t per i treni, /b per i bus di Trento) e un plugin per la barra di ricerca Essential Search, che risponde alla stessa domanda senza aprire niente.

L’aspetto “Sobrio”

Oltre al tabellone a puntini, l’app ha un secondo aspetto: “Sobrio”. Font IBM Plex, e al posto del tabellone una hero disegnata: il treno sui binari (regionale o alta velocità, a seconda del treno) e dietro un paesaggio italiano low poly che scorre solo quando il treno è in viaggio. Il paesaggio non è a caso: viene dalle fermate che il treno sta attraversando, quindi da Roma passa il Colosseo, a Trento il Duomo e il MUSE, sulle linee di montagna le Dolomiti. Di notte, col tema scuro, il treno viaggia coi finestrini accesi. È la hero che vedi in cima a questa pagina.

Il Frecciarossa 9638 fermo a Roma Termini nella hero Sobria, col Colosseo dietro e i finestrini accesi
Il 9638 a Roma Termini, col Colosseo

Le scene sono in SVG e si accostano in qualsiasi ordine: ognuna viene allungata col proprio bordo specchiato, e dove due scene si toccano c’è una “giunzione” in primo piano (una galleria, un viadotto, un casello) che copre il punto di contatto.

  • Alpi paesaggio

  • Dolomiti paesaggio

  • Colline toscane paesaggio

  • Mare paesaggio

  • Puglia paesaggio

  • Città paesaggio

  • Paese paesaggio

  • Vesuvio ed Etna paesaggio

  • Risaie paesaggio

  • Torre di Pisa monumento

  • Colosseo monumento

  • Mole Antonelliana monumento

  • Duomo di Milano monumento

  • Ponte Vecchio monumento

  • San Marco monumento

  • Duomo di Trento monumento

  • Doss Trento monumento

  • Castello del Buonconsiglio monumento

  • MUSE e Albere monumento

Le scene della hero: la striscia sceglie quelle delle fermate che il treno sta attraversando.

Sulla Glyph e nella home

Il treno che segui non resta chiuso nell’app. Sul retro del Nothing Phone 3 il Glyph Toy mostra i minuti all’arrivo, un treno che corre quando è in viaggio e si ferma quando è in stazione, e la sigla di dove si trova. Nella home di Android c’è un widget con la stessa informazione: fermata, minuti, ritardo.

Nothing Phone (3) bianco appoggiato su un pavimento da palestra, con la Glyph accesaNothing Phone (3) nero appoggiato su un pavimento da palestra, con la Glyph accesa

 

Ricostruzione del Glyph Toy: i minuti all'arrivo, il treno e la stazione dove si trova.

Ricostruzione del widget: nella home di Android si aggiorna ogni pochi minuti.

Sotto il cofano

Il treno che tornava indietro. ViaggiaTreno scrive l’“ultimo rilevamento” come testo libero, e a volte è indietro di una fermata o è un punto fra due stazioni. All’inizio lo mostravo così com’era: il pallino saltava indietro e sull’orologio compariva la stazione sbagliata. La regola che ha sistemato tutto è una sola: l’indice della fermata corrente può solo crescere, e il rilevamento si mostra solo se è la fermata corrente, la prossima o un punto fra due stazioni che non è in elenco. L’ho scritta una volta e poi copiata identica in quattro posti (app/src/trainState.js, android/.../follow/Position.kt, ritardobot/engine/trainTracker.js e trainPosition in api/functions/routes.js), perché PWA, app, motore delle notifiche e API devono dire la stessa cosa. Lo stesso vale per i nomi delle stazioni: matchStationName cerca prima il nome esatto, poi la parola intera, poi il testo contenuto, così un nome corto non trova stazioni che lo contengono per caso.

Una fonte che non sa dire “domani”. ViaggiaTreno risponde vuoto per qualsiasi giorno che non sia oggi, e la lista delle partenze azzera gli orari passati ad “adesso”. Per i giorni futuri e per tornare indietro nella giornata l’API interroga anche un’altra fonte pubblica con gli orari programmati (programmaCorse), e poi arricchisce ogni risultato con i dati reali di ViaggiaTreno: ritardo finale, “arrivato”, capolinea (corseDallOra). Le fermate di un giorno futuro non esistono da nessuna parte, quindi si prendono dalla corsa di oggi dello stesso numero; se oggi quel treno non circola, la pagina lo dice e mostra solo le tratte.

Un allarme al posto di una notifica fissa. Un servizio Android che segue un treno deve mostrare sempre una notifica, quindi non può girare per ore prima della partenza. L’app programma invece un allarme esatto (FollowScheduler) all’ora di partenza, e il servizio parte lì. Sul server succede la stessa cosa: il motore registra il follow, resta muto e lo controlla ogni mezz’ora (un timer non regge giorni) finché è ora di attivarlo. Il limite è onesto: sul piano gratuito di Render il file dei follow si perde a ogni riavvio.

Un motore, tanti canali, e il giorno dei 403. Tutta la logica dei dati sta in un solo servizio, e i client (PWA, app, bot, widget) sono sottili. Il motore che decide quando avvisare non conosce il canale: emette eventi (“partito”, “fermo a”, “arrivato”, “cancellato”) a un “sink”, e un sink scrive su Telegram mentre un altro manda notifiche push al browser. Un giorno, tutto si è fermato insieme: ViaggiaTreno aveva cominciato a rispondere 403 alle richieste che non sembrano un browser. Con questa architettura il rimedio è stato di una riga, nell’API (routes.js), e ha rimesso in piedi tutti i client insieme.

flowchart LR
  VT[ViaggiaTreno] --> API[API centrale]
  PR[Programma orari] --> API
  API --> PWA[Web app]
  API --> APP[App Android]
  API --> BOT[Bot Telegram]
  API --> MOT[Motore notifiche]
  MOT --> PUSH[Notifiche push]
  MOT --> TG[Messaggi Telegram]

Progetto indipendente: non è affiliato né sostenuto da Trenitalia, ViaggiaTreno, Nothing o Telegram. I marchi citati appartengono ai rispettivi proprietari.

$ hai un progetto in mente?

Parliamone.

Un sito nuovo, uno da rifare o un’idea ancora confusa: scrivimi due righe e ti rispondo entro un giorno.

❯esc
Scorciatoie