← Back to portfolio

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.

64×more Google clicks a week: 7 at launch, 451 now
50,000Google impressions in the first 60 days
5,100+visits in 60 days; month two was 2.7× month one
6,700+trips planned in the journey planner in one month

Results so far

Two months, no ads

Clicks from Google SearchPer day, 7-day average · 12 Sept – 10 Nov 2026
Show the numbers as a table
WeekVisitsGoogle clicksGoogle impressions
12 Sept – 18 Sept1407377
19 Sept – 25 Sept1909492
26 Sept – 2 Oct330361,852
3 Oct – 9 Oct560523,014
10 Oct – 16 Oct650804,075
17 Oct – 23 Oct1,0201736,174
24 Oct – 30 Oct75025211,352
31 Oct – 6 Nov84040714,399
7 Nov – 10 Nov (4 days)7082598,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.
284 routes1,500+ stops700+ pages4 languages

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

  1. Parse the documents. Every route, direction, fare stage, running time and frequency becomes structured data.
  2. Find each stage on the ground. Stage names are matched against OpenStreetMap, which usually offers several candidates per name.
  3. 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.
  4. Trace the road. Each route is drawn along the actual road network between its stages.
  5. 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