Real-time fleet oversight for autonomous shuttles
We built a transit product for the Terhills resort on top of EasyMile's shuttle API: a real-time backend and three apps, for passengers, for guests waiting at a stop, and for fleet operators.

At a Glance
- A transit service built on EasyMile's API, which only sends a shuttle to a set of coordinates
- Three apps (in-shuttle display, station kiosk, operator dashboard) driven by one real-time backend
- A dispatcher that assigns shuttles to scheduled lines and replans mid-trip from live telemetry
- Collision avoidance across overlapping routes, and passenger screens in Dutch and English
Challenge
Terhills is a resort in Maasmechelen, Belgium. It wanted guests to move between accommodations, dining and activity zones on autonomous shuttles that behave like a metro line rather than a set of individual vehicles. The resort partnered with EasyMile to run its EZ10 shuttles on site.
EasyMile's Site CC API is deliberately minimal. It lets you send one shuttle to a set of coordinates and streams back its telemetry. Scheduled lines, dispatching, collision avoidance, passenger information and operator tooling all had to be built on top.
Three groups needed different things: passengers inside a shuttle, guests waiting at a stop, and the staff running the fleet. All three views had to agree with vehicles moving in real time.
Solution
We built a real-time backend and one front-end for each of those groups.
In-Shuttle Display
A trip timeline inside every shuttle shows the current destination, the upcoming stops and progress along the route. It ships as a single-file build, so it installs cleanly on the in-vehicle hardware.
Station Kiosk
Every stop has a "next shuttles" board with live arrival times, destinations and intermediate stops. It is bilingual (Dutch and English) and shows announcements that operators publish for that station.
Operator Dashboard
A Mapbox view of the site shows shuttle positions, active trips and route conflicts. Operators create lines, assign vehicles, broadcast messages and tune operating parameters (shuttle speed, minimum spacing, door-opening time) without a developer.
Real-Time Backend
A GraphQL service turns the operator's lines into missions for EasyMile's API. The dispatcher assigns shuttles to scheduled lines and recomputes starting points mid-trip from telemetry. A collision-avoidance engine detects overlaps between routes. A state machine per shuttle reconciles the backend with the events each shuttle streams over an authenticated WebSocket.
Key Features
- One backend, three audiences: in-shuttle, station and operator apps share one data model
- Lines on top of vehicles: scheduled lines, mid-trip replanning and arrival times, built on a per-vehicle coordinate API
- Collision avoidance between shuttles on overlapping routes
- Operator self-service: stations, lines, fleet, announcements and operating parameters are all set from the dashboard
- Bilingual passenger screens (Dutch and English) with announcements per station
- Infrastructure as code for production and staging
Results
- Guests use the shuttles as a single transit service across the resort, not as separate vehicles
- Shorter waits and simpler navigation from real-time scheduling
- Resort staff run the service themselves: new lines, stations and announcements go live without a developer
- Room to grow: more shuttles, stations and routes fit the same model
Gallery
Let's build your product
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.