Case study 02
busapp: Sosiri în timp real pentru transportul public
Aplicație web pentru București-Ilfov care separă clar estimările live de orele din program.
Pe scurt
busapp răspunde la întrebarea pe care o ai în stație: mă grăbesc, mai aștept sau pot sta liniștit?
Aplicația arată sosirile din București-Ilfov și explică sursa fiecărei estimări. Predicțiile live și orele din program arată diferit, ca să știi cât te poți baza pe minutele de pe ecran.
Context
Datele de transport amestecă orarul planificat cu observațiile primite de la vehicule. Dacă ambele sunt afișate la fel, nu poți vedea când sursa live întârzie sau lipsește.
În busapp, interfața arată sursa fiecărei sosiri: eticheta, vechimea datelor și momentul în care aplicația trece la orar.
Constrângeri
Panoul trebuie să răspundă repede și când sursa externă are întârzieri sau goluri.
- Datele vehiculelor pot întârzia, pot lipsi la o actualizare sau pot contrazice orarul static.
- O estimare poate fi corectată doar după ce profilul stației, liniei sau tipului de transport a fost verificat pe sosiri reale.
- Aplicația trebuie să meargă pe telefon, direct în stație, fără cont și fără setări.
- Locația și călătoriile salvate rămân în browser, iar utilizatorul nu este urmărit.
- Alertele operatorului sunt vizibile, dar nu acoperă sosirile.
Ce am livrat
Interfața arată doar ce contează în stație. În spate rulează cache-ul și sistemul care măsoară precizia estimărilor.
- Căutarea stațiilor după locație sau nume și linkuri directe către fiecare stație.
- Sosiri marcate clar LIVE sau ORAR, alerte de la operator și un indicator separat pentru actualitatea datelor.
- Călătorii și preferințe salvate local, în browser.
- Date GTFS statice preîncărcate, cache pentru fluxul în timp real și timeout-uri stricte la actualizare.
- Un sistem care măsoară calitatea predicțiilor și păstrează doar rezultate agregate, fără identități sau coordonate ale vehiculelor.
LIVE sau ORAR
Estimare calculată din date recente primite de la vehicul.
Ora din program apare când nu există date live și este afișată mai discret.
- ActualDatele live sunt la zi.
- Pauză scurtăUltima stare confirmată rămâne cel mult 60 de secunde dacă o actualizare este incompletă.
- ExpiratAplicația trece pe orar și afișează eticheta ORAR.
Arhitectură
Fluxul datelor de sosire
Decizii importante
- Etichetarea sursei
- Eticheta LIVE apare numai pentru date recente și confirmate. În rest, aplicația spune clar că afișează orarul.
- Când lipsesc datele live, interfața o arată deschis, chiar dacă pare mai puțin sigură.
- Păstrarea unei pauze scurte
- Dacă o actualizare este incompletă, ultima stare confirmată a vehiculului rămâne afișată pentru scurt timp.
- După această pauză, datele expiră repede, ca să nu pară mai sigure decât sunt.
- Corectarea estimărilor
- Sistemul compară predicțiile cu sosirile observate. După ce un profil este validat, poate corecta estimarea pentru stația, linia sau tipul de transport respectiv.
- Până la validare, busapp folosește direct predicția primită în timp real.
- Totul pentru decizia din stație
- Aplicația răspunde la o singură întrebare: când vine următorul vehicul. Hărțile și conturile au rămas pe dinafară.
- Planificarea traseelor rămâne în afara aplicației.
Ce poți verifica
Pagina oricărei stații arată sosirile, sursa datelor și alertele curente.
Deschide busapp (se deschide într-o filă nouă)Limite
Fără flux live, aplicația folosește orarul.
Când fluxul operatorului întârzie sau cade, busapp folosește pentru scurt timp datele din cache, explică problema și apoi trece pe orar.
Rol și tech stack
Am proiectat și construit logica produsului, fluxul de date în timp real, interfața, regulile de confidențialitate și infrastructura de operare.
Next.js · Node.js · GTFS static + în timp real · cache pe server · systemd · Caddy