76
This is an unofficial NYC Ferry planner, built out of frustration with a specific problem: the official app can't plan trips that require a transfer.
If your journey crosses more than one route, you're normally stuck cross-referencing timetables and working it out yourself. This app handles that automatically β just enter your origin and destination and it finds the best way to get there.
Built by ferry riders for ferry riders.
License: MIT. Copy it, fork it, remix it, ship it, as long as the license and attribution stay with it.
No React. No build step. No server. Just vanilla ES modules that do everything in the browser.
Routing went through several iterations. We started with Dijkstra, but for a graph of ~39 stops where transfers matter more than distance, it was overkill. We landed on 0-1 BFS — riding the same line costs 0, transferring costs 1. Fewest transfers first, then shortest path. Solves in under a millisecond.
Map lines needed smoothing so routes follow the waterway instead of zigzagging between GPS points. We tried Catmull-Rom splines, cubic B-splines, and simple moving-average filters before settling on Chaikin corner-cutting — it gave the cleanest curves without overshooting tight harbor bends.
Three options (Earlier / Best / Later) come from re-running the search with shifted departure times. Navigate far enough and you're browsing the full timetable.
Data is pulled from NYC Ferry's public GTFS feed and baked into a single JSON file. No API keys, no rate limits, no surprises.
The whole thing was prototyped with three AI coding agents — Codex, Claude Code, and Mistral Vibe — competing on different approaches for the router, the UX, and the map rendering. The best ideas from each survived. The rest got git reset --hard.
Minutes to allow between arriving on one ferry and departing on the next.