- Go
- TypeScript
- Svelte
- deck.gl
- Mapbox GL
01/07Lisbon on the live map, in the dark theme: every bus, metro, train and ferry on its line, and the stops nearby.
About
Nexo takes the open timetables of 34 Portuguese operators, from Carris Metropolitana and Metro do Porto to CP, Transtejo, the Algarve's town buses, FlixBus and BlaBlaCar, and serves the whole country on one live map: 51,954 stops, 457,045 trips and 7,206 routes.
The backend is a single Go binary. Offline, it reads GTFS and NeTEx, map-matches missing shapes on OpenStreetMap, measures 616,194 walking paths between stops and writes a compact snapshot. Online, it loads that snapshot in under a second and answers everything from memory: a RAPTOR planner that returns a journey in about 35 ms and was checked against an oracle on 480 real trips (98.8% optimal), vehicle positions, departure boards, isochrones, and real time polled from GTFS-RT and GBFS feeds.
The frontend is Svelte 5 and TypeScript on Mapbox GL and deck.gl, with vehicle positions interpolated in a Web Worker so the main thread stays free. Around it: an installable PWA, a landing page with a working waiting list, and Nico, the X of the logo come to life, who keeps you company from the first tap. He is riding along this page too.
Features
- The whole country, live
- Every vehicle where its timetable or its GPS puts it. Follow a line and it switches to live positions with its delay; the rest glide calmly, labelled as estimates. Scrub the clock to any hour and watch the network breathe.
- Door-to-door planner
- RAPTOR over the whole country in about 35 ms. Leave now, leave at or arrive by, walks measured on real streets, shared bikes and scooters for the first mile, fares, accessibility and live delays.
- How far can I get
- Drop a pin and see everywhere reachable by transit and on foot in 10-minute bands, drag it live, play it through the day, or find where two people can meet halfway.
- Nico and the Caderneta
- A sticker for every line you ride, stamps for stops, medals, weekly missions and levels. Nico breathes, blinks, follows your pointer, waves at the bus, hurries when you are late and falls asleep after midnight. No accounts: it all lives on your device.
- One binary, one small server
- API, planner, real time and the embedded web app run from one Go process on a €7.37 a month VPS. Every push runs the checks and ships the binary; if the new version does not answer its health check, the server rolls back on its own.
- Tested like it matters
- 219 Go test functions, 200+ Vitest unit tests, Playwright end to end, axe audits, screenshot comparisons and frame-time budgets. A change that slows a hot path by more than 10% does not go in.
API Reference
| Method | Path | Description |
|---|---|---|
| GET | /v1/plan | Pareto-optimal journeys between two points, with mode, operator, walking speed and transfer filters |
| GET | /v1/reach | Isochrone: every stop reachable from a point within a time budget |
| GET | /v1/meet | Where two people can both get to, and how long each takes |
| GET | /v1/stops/{id}/departures | Next departures from a stop or station, across service days |
| GET | /v1/vehicles/segments | Compact binary stream of vehicle movements for a map area and time window |
| GET | /v1/lines | Line geometry with side-by-side offsets where lines share a street |