Rural Cyprus transport discovery app. Find bus routes to mountain villages, or request a shuttle if none exist.
This application is currently in development mode.
- Details such as telephone numbers, taxi company names, and shuttle names are fictional and for demonstration purposes only.
- Information about villages and population may be inaccurate.
- Bus data is pulled from GTFS datasets available on data.gov.cy.
The code in this project was built with the help of AI technologies, namely Cursor, Claude and Grok. As the time-frame for building the project was very short, we used AI to speed up prototyping so our 2-person team could focus on the big wins: engineering the high-level logic and nailing the impact angle.
-
Download GTFS datasets:
-
Unzip datasets and rename the folder to lowercase name of the dataset (e.g.
paphos,intercity). -
Set up Motis:
# Create a folder for Motis mkdir motis-cyprus cd motis-cyprus # Download Motis (for Mac ARM, adjust TARGET for your platform) # Options: linux-amd64, linux-arm64, macos-arm64, macos-x86_64, windows TARGET="macos-arm64" wget https://github.com/motis-project/motis/releases/latest/download/motis-${TARGET}.tar.bz2 tar xf motis-${TARGET}.tar.bz2 # Download Cyprus OSM data from Geofabrik wget https://download.geofabrik.de/europe/cyprus-latest.osm.pbf
-
Inside
motis-cyprus, create a foldergtfsand establish the following folder structure using unzipped GTFS datasets:gtfs/ ├── paphos/ ├── famagusta/ ├── limassol/ ├── larnaca/ ├── intercity/ └── nicosia/ -
Create a file
config.ymlin themotis-cyprusfolder with the following contents, changing the file names where necessary:server: host: 0.0.0.0 port: 8080 web_folder: ui osm: cyprus-latest.osm.pbf timetable: first_day: 2026-01-17 num_days: 30 datasets: famagusta: path: gtfs/famagusta limassol: path: gtfs/limassol larnaca: path: gtfs/larnaca nicosia: path: gtfs/nicosia paphos: path: gtfs/paphos intercity: path: gtfs/intercity street_routing: true geocoding: true osr_footpath: true
-
Start Motis (routing engine):
cd motis-cyprus ./motis import ./motis server -
Start the frontend:
npm install npm run dev
- User opens app → requests geolocation
- User clicks village marker → sidebar opens
- App queries Motis for routes TO and FROM village
- User sees route options, clicks one to preview on map
- If no routes, user can request a shuttle (stored in localStorage)
All journey planning is handled by Motis (local server). Frontend sends origin/destination coordinates, receives complete itineraries with stops, times, and polylines. No GTFS parsing in frontend.
- Motis — Local routing engine at http://localhost:8080. Handles all GTFS parsing and routing logic.
- OpenStreetMap — Map tiles
- Leaflet — Map rendering via react-leaflet
Shuttle requests are stored in browser localStorage. Data persists locally on user's device.