// the find
opentripplanner/OpenTripPlanner
An open source multi-modal trip planner
OpenTripPlanner (OTP) is a Java-based multi-modal trip planning server that builds routable graphs from GTFS and OpenStreetMap data and serves itineraries over GraphQL. It's aimed at transit agencies and civic-tech teams who need real trip planning (bus/rail + walk/bike/ride-hail) rather than just point-to-point driving directions, and it's been running in production at agencies worldwide since TriMet launched it in 2009.
The test suite is the real signal here: ext-test alone covers multiple fare implementations per-agency (Orca, HSL, Atlanta, Oregon Hop), flex routing, carpooling insertion/matching, and empirical delay modeling — this is edge cases from real transit systems, not toy coverage. CI runs a speed test on every merged PR with results published to a public dashboard, which is a level of performance discipline most projects don't bother with. It's built entirely on open formats (GTFS, OSM) and exposes a GraphQL API, so it slots into existing transit data pipelines instead of inventing its own schema. And it's had 16+ years of continuous development funded by an actual transit agency plus adoption by many others, so it's not going to disappear.
It's a Java/Maven monolith — expect a slow build, a shaded JAR deploy model, and real JVM heap requirements once you load a city-sized OSM+GTFS graph into memory; this isn't something you spin up casually for a side project. The bundled JS client is explicitly described as for testing only, with the docs stating most real deployments build their own client from scratch — so OTP gives you the routing engine and API, nothing closer to end-user UI. The README itself has zero code/API examples; everything meaningful lives on the external docs site, so you can't evaluate the API shape from the repo alone. And the fare handling having separate v1 and v2 implementations plus per-agency custom classes (Atlanta, HSL, Orca, Oregon) signals that if your agency's fare structure isn't already supported, you're writing and maintaining your own fare service class against their internal interfaces.