How Kav works
Kav is an Android app and an optional server. The app does most of its work on the phone, and asks outside services only for what it can't know itself: where the buses are now, and trips planned against live data.
On the phone
- The map is a vector map of Israel from OpenStreetMap (the Protomaps build, about 176 MB), downloaded once from GitHub and drawn with MapLibre. It works without signal. The satellite view loads from Esri when you use it.
- The timetable for the coming week, compiled every night from the Ministry of Transport's GTFS feed by GitHub Actions and downloaded in the background. Departure boards, line pages and timetables read it, with or without signal.
- Your places, favourites, recent trips and settings never leave the phone, except in a
.kavbackup you save yourself.
Sources you pick
Planning, live buses and timetables are three separate choices in Settings. Each can be Kav's server, Bus Nearby, EGG, your own server, or (for planning and timetables) He who shall not be named's public website. Only the providers you picked are ever asked. The privacy policy lists what each one gets.
Kav's server
Kav's own server is a few Docker containers behind Cloudflare:
- Live buses (
server/live.py, plain Python). It reads the Ministry of Transport's real-time feed (SIRI) for the whole country every 15 seconds while the app is in use (every minute otherwise), keeps it in memory, and answers the app by line, stop or area. It also records when each bus passed each stop, kept for ten weeks, for the predictor. - Trip planner: OpenTripPlanner, rebuilt every night from the ministry's timetable and OpenStreetMap, on Kav's own predicted times, with a second one on the ministry's official times beside it.
- Predictor: Kav's own arrival times, every 30 seconds, from a model trained on that history. They replace the ministry's estimates in the app and the planner. See A predictor of your own.
- Shared trips: links like
share.kavapp.link/Ab3dE7f, kept until they expire.
The app signs every request to the server, so it answers official Kav builds only. Requests reach it without your IP address, and it keeps no log of them.
Addresses
| Address | What's there |
|---|---|
kavapp.link | This website |
api.kavapp.link | The server's API, for the app |
share.kavapp.link | Shared trip links, and the page someone without Kav sees |
kav.noammm.uk | The server's first address, kept working for every copy of Kav already installed |
Running your own
Every part of the server runs on a machine of yours, from one install command, and the app can use it in place of Kav's. Start with Self-hosting, then Server API if you want to write a part yourself.