Case study
Bus Mauritius: a transport map built from paperwork
Buses are the only public transport that covers all of Mauritius, yet the official timetables exist only as office documents. There was no map of the routes and no way to plan a trip. I built both, alone, and launched on 12 September 2026.
Results so far
Two months, no ads
Show the numbers as a table
| Week | Visits | Google clicks | Google impressions |
|---|---|---|---|
| 12 Sept – 18 Sept | 140 | 7 | 377 |
| 19 Sept – 25 Sept | 190 | 9 | 492 |
| 26 Sept – 2 Oct | 330 | 36 | 1,852 |
| 3 Oct – 9 Oct | 560 | 52 | 3,014 |
| 10 Oct – 16 Oct | 650 | 80 | 4,075 |
| 17 Oct – 23 Oct | 1,020 | 173 | 6,174 |
| 24 Oct – 30 Oct | 750 | 252 | 11,352 |
| 31 Oct – 6 Nov | 840 | 407 | 14,399 |
| 7 Nov – 10 Nov (4 days) | 708 | 259 | 8,271 |
Sources: Google Search Console and Cloudflare Web Analytics, to 10 Nov 2026.
- Google clicks went from 7 in launch week to 451 in the latest week.
- The average position in Google moved from 10.6 to 6.3.
- Pages that appear in Google search: 2 in launch week, 400 now.
- Month two brought 2.7× the visits of month one (1,420 → 3,768).
- My own forecast for month one was 100–300 visits. The site got about 1,400.
- People use it: 6,700+ trips planned in a month, about 295 a day now.
The problem
Timetables without a map
The transport authority publishes each route as a list of named fare stages with running times, first and last buses, and frequencies. The lists carry no coordinates, there is no live data, and visitors have no way to ask a simple question: which bus takes me from here to there?
The source is honest about what it is — a tariff document, not a product. Everything a traveller needs had to be reconstructed from it.
The data
From stage names to route lines
- Parse the documents. Every route, direction, fare stage, running time and frequency becomes structured data.
- Find each stage on the ground. Stage names are matched against OpenStreetMap, which usually offers several candidates per name.
- Pick the plausible chain. A sequence algorithm chooses the set of locations that makes sense as one continuous journey, so a stage is never placed in the wrong village of the same name.
- Trace the road. Each route is drawn along the actual road network between its stages.
- Check it. Automated reports flag jumps, detours and stops that different routes place in different spots; the remaining cases are fixed by hand.
The product
A planner with no server
The journey planner runs entirely in the visitor's browser. It finds door-to-door trips with transfers, walking, total time and fare, and estimates waiting time from the published frequency for the hour you choose. Nothing is sent to a server, so it is fast on a weak mobile connection.
For people already at a stop there is “Which bus?”: pick a destination once, then check every bus that pulls in — green, yellow or grey. It keeps working offline.
A live-tracking pilot is in progress: drivers share their position through a 54 KB Android app, and the bus appears on the map moving along its route.
Search
SEO built into the data
Every page is generated from the same dataset that drives the map: one page per route, one per bus station, fares, airport connections, operators, and popular from–to trips. Pages that the data cannot fully support are kept out of the index rather than published thin.
Research showed where the demand is — bus stations first, then fares, then individual routes — and the site was built in that order. French, German and Russian sections followed once search data showed visitors arriving in those languages.
Under the hood
Small, static, cheap to run
- Data pipeline
- Python, OpenStreetMap road graph
- Map
- MapLibre with self-hosted vector tiles
- Journey planner
- RAPTOR routing in plain JavaScript
- Pages
- Templates rendered from the dataset
- Hosting
- Cloudflare Pages, no application server
- Live tracking
- Cloudflare Workers, native Android app