Treintracker

Een real-time dashboard voor Nederlandse treininformatie, gebouwd als persoonlijk project. Data komt uit de officiële NS-APIs én een zelf gebouwde NDOV-backend.

Stack

Backend
Python · FastAPI · Uvicorn
Templates
Jinja2 server-side rendering
Interactie
HTMX 2.0 – partial updates, geen page reloads
Kaart
Leaflet.js · Tailwind CSS · Bootstrap Icons
Database
SQLite – treingeschiedenis, statistieken, materieel
HTTP-client
Python httpx (sync, thread-local pool)
Deployment
Docker · GitHub Actions CI/CD

Pagina's

URL Beschrijving
/Alle rijdende treinen op een interactieve kaart met richtingspijlen, type-kleurcodering en snelheidstooltips; stations met vertrektijdenpaneel bij klik
/departures/{station}Realtime vertrektijden, HTMX auto-refresh elke 30s
/arrivals/{station}Realtime aankomsttijden
/servicesRitdetails: stops, snelheidsgrafiek, materieel, drukte
/plannerReisplanner van/naar met autocomplete en eerder/later
/disruptionsActuele storingen en werkzaamheden op kaart met spoorgeometrie
/disruptions/{station}Station-specifieke storingen en werkzaamheden
/series/{nummer}2D-matrix van alle treinen in een treinserie
/rolling-stockOverzicht van alle materieeldelen met live GPS-posities
/station/{station}Station: aftrappen en bijplaatsingen, spoorbezetting en drukte per station
/stationsStationsverkenner: filter op land, type, faciliteiten
/afwijkingenAfwijkingsdetectie: harde remmingen en afwijkend remgedrag bij stations op basis van GPS-acceleratie
/statsPrestatiestatistieken (NDOV): punctualiteit per station, treinserie en baanvak met KPI-tegels en grafiek

Architectuur

De backend is opgebouwd in lagen. Route handlers in api/routes/ delegeren businesslogica naar een aparte servicelaag in src/nsapi/services/. HTML-fragmenten worden server-side gebouwd en via HTMX in de pagina gezet — geen JavaScript-framework nodig.

Een achtergrondpoller verzamelt elke 15 seconden live treinposities via de Virtual Train API en slaat snapshots op in SQLite. Caching per endpoint (7–300 seconden in-memory) voorkomt overbelasting van externe APIs.

Architectuurdiagram van Treintracker

NDOV API backend

Naast de officiële NS-APIs is er een eigen NDOV-backend gebouwd die draait op ndov.yingkidcheung.nl. Deze backend ontsluit NS-databronnen die niet via de publieke API beschikbaar zijn, zoals de RIT-feed en realtime GPS-posities.

Databronnen

DVS
Dynamische Vertrek Staat – realtime vertrektijden per station
DAS
Dynamische Aankomst Staat – realtime aankomsttijden per station
RIT-feed
Volledige rit inclusief alle stops, actuele tijden en materieel
KV1 GPS
Live en historische GPS-posities per materieelnummer

Endpoints (selectie)

GET/live/departures/{station}
GET/live/arrivals/{station}
GET/live/rides
GET/live/rides/{treinnummer}
GET/live/rides/all/{serie}
GET/live/positions
GET/live/positions/{nr}/history
GET/live/positions/rolling-stock/{nr}/history
GET/services/{id}

De materieel- en treinseriepagina's zijn volledig gebaseerd op NDOV-data. Op de kaart- en vertrektijdenpagina's is de NDOV-bron selecteerbaar naast de standaard NS API.

Databronnen

NS Reisinformatie API
Vertrektijden, aankomsttijden, ritdetails, reisplanner
NS Virtual Train API
Live treinposities op de kaart
NS Storingen API
Actuele verstoringen en werkzaamheden
Spoorkaart API
Exacte spoorgeometrie als GeoJSON
NDOV backend ndov.yingkidcheung.nl
RIT-feed, DVS/DAS realtime feeds, GPS-posities (eigen server)
API calls 0