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
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 |
| /services | Ritdetails: stops, snelheidsgrafiek, materieel, drukte |
| /planner | Reisplanner van/naar met autocomplete en eerder/later |
| /disruptions | Actuele storingen en werkzaamheden op kaart met spoorgeometrie |
| /disruptions/{station} | Station-specifieke storingen en werkzaamheden |
| /series | Treinserie-verkenner: overzicht van alle actieve treinseries |
| /series/{nummer} | 2D-matrix van alle ritten in een treinserie op een dag |
| /series/{nummer}/stats | Prestatiestatistieken voor één treinserie: punctualiteit, vertraging, uitval |
| /rolling-stock | Rit-historie per materieelnummer met GPS-track |
| /station/{station} | Station: aftrappen en bijplaatsingen, spoorbezetting en drukte per station |
| /stations | Stationsverkenner: filter op land, type, faciliteiten |
| /afwijkingen | Afwijkingsdetectie: harde remmingen en afwijkend remgedrag bij stations op basis van GPS-acceleratie |
| /stats | Prestatiestatistieken (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.
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
Endpoints (selectie)
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
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.