I built distance-by-time instead of distance-by-map.
I built "20 minutes from your university" into a room search
Every rental portal lets you filter by neighbourhood. Which is useless to a
student, because they don't care about the neighbourhood — they care about
whether they can get to their 9am lecture.
So I built distance-by-time instead of distance-by-map.
Plinthos is a rental management tool for landlords renting single rooms, and
it has a public portal attached. On that portal you don't search by area.
You pick your university campus and you say 20 minutes on foot, or 30 by
bike, or 40 by public transport. What comes back is every room inside that
travel-time shape.
Getting there was more work than I expected:
- Isochrones come from Valhalla, self-hosted in Docker. Building the routing
tiles for northern Italy took 18 minutes and 1.7 GB of RAM.
- Public transport needs GTFS feeds, one per city, each in its own state of
disrepair. Valhalla segfaulted on transit until I pruned the feeds down to
urban services only.
- Half the cities I wanted have no usable GTFS at all, so their stops come
from OpenStreetMap instead.
- Every listing gets its travel-time bands computed on insert by a trigger,
so search is a polygon lookup, not a routing call. Search has to be fast;
precomputation doesn't.
10 cities so far. Bologna, Milan, Rome, Turin, Naples, Florence, Padua,
Modena, Parma, Reggio Emilia. Metro lines included where they exist.
The part I like: the same data makes the listings better, not just the
filter. A room isn't "in Bolognina", it's "14 minutes from Unibo
Engineering". That's the sentence the student actually needs, and it writes
itself from the geometry.
Happy to go deeper on the Valhalla setup if anyone's fighting with it —
the transit side in particular is badly documented and cost me a weekend.