Treintracker

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
/seriesTreinserie-verkenner: overzicht van alle actieve treinseries
/series/{nummer}2D-matrix van alle ritten in een treinserie op een dag
/series/{nummer}/statsPrestatiestatistieken voor één treinserie: punctualiteit, vertraging, uitval
/rolling-stockRit-historie per materieelnummer met GPS-track
/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/treintracker/services/. HTML-fragmenten worden server-side gerenderd via Jinja2-templates in api/templates/fragments/ en via HTMX in de pagina gezet — geen JavaScript-framework nodig.

Twee achtergrondtaken draaien continu met automatische herstart bij een crash: een treinpoller (elke 15 seconden) die live posities van NS- en regionale treinen verzamelt en opslaat in SQLite, en een anomaliepoller (elke ~60 seconden) die GPS-acceleratiedata analyseert op harde remmingen en stationsafwijkingen. Caching per endpoint (20–300 seconden in-memory) voorkomt overbelasting van externe APIs.

Treinserie-routes worden berekend via een Dijkstra-implementatie (spoorkaart_graph.py) op de spoorkaartgraph. Journey-chaining (journey_chain.py) voegt een forward chain van gekoppelde ritten samen tot één gecombineerd verloop — puur functioneel, zonder IO.

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)
BISON KV6 via NDOV
Posities van regionale rail-vervoerders (Arriva, Connexxion, Keolis, Qbuzz) via BISON KV6, doorgegeven via het ndov-project.

Disclaimer

Treintracker is een persoonlijk, niet-commercieel hobbyproject en heeft geen enkele formele band met NS, ProRail, NDOV, BISON of welke andere vervoerder of overheidsorganisatie dan ook. Namen, logo's en merken van deze partijen worden uitsluitend gebruikt om naar de databron te verwijzen en impliceren geen samenwerking of goedkeuring.

De getoonde informatie komt rechtstreeks uit de NS Open Data APIs en open NDOV/BISON-feeds en wordt ongewijzigd weergegeven. Er worden geen garanties gegeven over juistheid, volledigheid of beschikbaarheid van de data. Vertraging, uitval of fouten in de bron kunnen leiden tot afwijkende informatie op deze site.

Gebruik deze site niet als enige bron voor reisbeslissingen. Raadpleeg voor actuele en officiële reisinformatie altijd ns.nl, de NS-app of de officiële kanalen van je vervoerder.