No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
An interactive map of Vienna's U-Bahn and S-Bahn networks. It shows live
U-Bahn departure estimates and scheduled S-Bahn positions.
The Wiener Linien real-time interface publishes departure predictions, not
vehicle GPS coordinates. This app walks each prediction backwards along its
line's official station sequence and estimated segment timings. Train dots are
therefore position estimates, and the interface fades uncertain estimates.
When a line has no usable live prediction, hollow dashed dots show timetable
simulations so they cannot be mistaken for reported trains.Read the full README ↗Website: https://salarshk.github.io/vienna-ubahn-live-map/ Product overview: https://salarshk.github.io/vienna-ubahn-live-map/overview/
An interactive map of Vienna's U-Bahn and S-Bahn networks. It shows live U-Bahn departure estimates and scheduled S-Bahn positions.
The Wiener Linien real-time interface publishes departure predictions, not vehicle GPS coordinates. This app walks each prediction backwards along its line's official station sequence and estimated segment timings. Train dots are therefore position estimates, and the interface fades uncertain estimates. When a line has no usable live prediction, hollow dashed dots show timetable simulations so they cannot be mistaken for reported trains.
ÖBB's public feed does not provide S-Bahn vehicle GPS. S-Bahn dots are therefore interpolated between the station times in the official 2026 GTFS timetable and are always drawn hollow and labelled as scheduled estimates.
?mode=dashboardThe delay model can publish a clearly marked preliminary score after at least
36 hours spanning two calendar days and a sufficiently large untouched test
period. It is automatically promoted to validated status only after the
seven-day safeguards are met. Its methodology is documented in
docs/ml-delay-model.md.
The AI advisor is an optional, separately hosted secure service and is gated
off in the production build for now. The public website never contains an
OpenAI key and does not call the rail-data Worker for GPT requests. Its evidence
contract and safeguards are documented in
docs/llm-rail-advisor.md.
npm install
npm run dev
Open http://localhost:5173.
The hosted site is also an installable Progressive Web App. On Android/Chrome use the browser's install prompt; on iPhone/Safari choose Share → Add to Home Screen. The installed shell can reopen during a short network interruption, while live departures refresh when connectivity returns.
The map's My commute panel stores saved stations only in local browser storage. Follow me uses the phone's GPS only after the user starts it; it can be stopped at any time. Disruption notifications are also opt-in and are generated from the official service-message feed while the app is open or installed with notification support. A server-backed push system would require an additional subscription backend and is intentionally not enabled here.
npm test
npm run build
Pushes to main are automatically built and published through the Pages
workflow in .github/workflows/deploy-pages.yml. The hosted build routes its
read-only departure requests through the open-source corsproxy.nl relay
because the official endpoint does not provide browser CORS headers. The data
still comes directly from Wiener Linien and the relay receives only public
station identifiers.
The Cloudflare Worker saves a station-level Wiener Linien summary to R2 each minute, full observation snapshots every five minutes, and dated WienMobil Rad samples every five minutes. Public rail and bike history endpoints mark stale data rather than presenting it as live. A separate scheduled job publishes hourly reliability reports. GitHub Actions restores a recent training window from the long-term R2 archive, saves new observations before training, and publishes model and data-quality reports. Each completed model report also has a dated R2 copy. The map's live feed is separate from these archives.
Traffic-counter locations are public metadata, but measured road values and event records require provider access. Configure these Worker variables only when the corresponding licensed or public endpoint is available:
VIENNA_TRAFFIC_API_URL measured Vienna traffic-counter feed
EVIS_TRAFFIC_API_URL EVIS / ITS Vienna Region relay
VIENNA_EVENTS_API_URL Vienna event-record relay
This is the beginning of the README. Read the rest at the original. Read the full README ↗