Voraussetzung: Node.js ≥ 18. Dann:
npm install # einmalig – Server-Tooling (TypeScript + tsx)
npm --prefix web install # einmalig – Frontend (Next.js + MapLibre GL)
npm run build:web # Frontend bauen (statischer Export nach web/out)
npm start # startet Server + Karte + Recherche-TUI
Frontend-Entwicklung mit Hot-Reload: Server mit festem Port starten (PORT=8000 npm start),
dann npm run dev:web (Next-Dev-Server auf Port 3000, proxied /api und /data auf
http://localhost:8000 – anderer Server-Port via API_PROXY übersteuerbar).
Der Server ist federführend für alle Daten: Live-Züge kommen über /api/livetrips
(Transitous-Proxy mit 10-s-Burst-Cache), die Betriebslage über /api/streckeninfo.
Die ISR-Daten werden alle 12 Stunden automatisch neu geladen (Scrape + Rebuild +
Hot-Reload); DATA_REFRESH_HOURS übersteuert das Intervall, 0 deaktiviert es.
Alle Transitous-Abfragen (Live-Züge, Fahrtverlauf, Abfahrten) senden einen
identifizierenden User-Agent – ohne den antwortet api.transitous.org mit
HTTP 403 (Node schickt per Default nur node). TRANSITOUS_USER_AGENT
übersteuert ihn, z. B. um bei einem öffentlichen Deployment eine
Kontaktadresse zu hinterlegen.
Die Kartensuche findet Streckennummern, RL100-Betriebsstellen und Live-Züge
(vollständiger Name wie „ICE 577" oder reine Zugnummer).


