We turned EasyMile's low-level “send a shuttle to coordinates” API into a full autonomous transit product — a real-time backend plus three purpose-built apps for passengers, station guests and fleet operators.
Terhills, a premier resort in Maasmechelen, Belgium, wanted its guests to move between accommodations, dining and activity zones on autonomous shuttles that felt like a public metro — not a fleet of self-driving cars.
The resort partnered with EasyMile to deploy EZ10 vehicles on site. EasyMile's Site CC API is deliberately minimal: it exposes individual shuttles as primitives you can send to a set of coordinates, and streams back live telemetry. Everything between that primitive and a functioning transit service — scheduled lines, live dispatching, collision avoidance, passenger information, and operator tooling — had to be built.
“Three distinct user groups — passengers inside a shuttle, guests waiting at a stop, and resort staff running the fleet — each needed a different experience, and all three had to stay in sync with a fleet of autonomous vehicles moving in real time.”
— Project briefWe designed and built a complete transit product on top of EasyMile's API: a real-time backend and three purpose-built front-ends, each tailored to its audience.
Under the hood, a GraphQL service bridges the operator's metro abstraction and EasyMile's low-level API. A proprietary “metro mode” algorithm assigns shuttles to scheduled lines and recomputes starting points mid-trip from live telemetry. A collision-avoidance engine detects overlap across routes. A per-shuttle state machine reconciles the backend against shuttle events streamed over an authenticated WebSocket.
A live trip timeline inside every shuttle — current destination, upcoming stops, and progress along the route. Packaged as a single-file Vite build so it deploys cleanly on in-vehicle hardware.
A subway-style “next shuttles” board at every stop, showing live ETAs, destinations, and intermediary stops. Bilingual (NL / EN) and tied to station-scoped announcements operators publish directly from the back office.
A live Mapbox view of the whole site with real-time shuttle positions, active trips, and route conflicts. Operators build metro lines, assign vehicles, broadcast messages, and tune operating parameters without developer involvement.
When two shuttles approach the same segment from opposite directions, the lower-priority vehicle automatically diverts to the nearest passing area and holds until the main lane clears.
In-shuttle, station, and operator — one shared backend, one shared content model.
Scheduled lines, mid-trip replanning, and ETAs, built on a per-vehicle coordinate API.
Opposing shuttles on a shared segment negotiate passing areas automatically — the trailing shuttle holds until the lane clears.
Stations, lines, fleet, announcements and operating parameters — all configurable from the dashboard.
NL / EN with station-scoped messaging operators publish in minutes, not sprints.
Serialised reconciliation between WebSocket telemetry, scheduled jobs and admin actions — one source of truth per vehicle.
Click between the operator, kiosk and in-shuttle views — the same moment in a running resort day, rendered three ways. Use the controls to dispatch, broadcast, and scrub through the simulation.
Operators see live positions, active trips, and emerging conflicts on a Mapbox site view. They assign shuttles to lines, broadcast station-scoped messages, and tune operating parameters — all without developer involvement.
Presented to visitors as a coherent metro rather than a fleet of vehicles.
Real-time scheduling and route optimisation, not fixed timetables.
New lines, stations and announcements ship in minutes, without developer involvement.
More shuttles, stations and routes drop into the same model as the resort grows.
Tell us what you're building. We'll tell you how we'd approach it, what it takes, and how fast we can move.
We'll tell you honestly if we're the right fit. And if we're not, we'll point you to someone who is.