Build: 76

About This App

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.

You Asked For It: Nerd Mode

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.

Select Date & Time

Minimum Transfer Time

Minutes to allow between arriving on one ferry and departing on the next.

minutes