Visualize, analyze, and edit GTFS transit data entirely in-browser with DuckDB WASM. No backend required.
- Upload GTFS zips or load example datasets — all processing client-side
- Interactive maps and tables for stations, stops, and pathways
- Edit stations, stops, and pathway connections with live preview
- Pathfinding between station parts with traversal times
- Export edited data back to GTFS CSV format
- CLI with local DuckDB database and browser dashboard
- DuckDB extension installable from any DuckDB instance
Visit gtfs-viz-production-f1a4.up.railway.app or run locally:
yarn install --ignore-engines && yarn build:extension && yarn devnpm install -g @gabrielahn/gtfs-viz-cli
gtfs-viz import /path/to/feed.zip
gtfs-viz stations --name "Park"
gtfs-viz station "Park Street"
gtfs-viz examples # See all commandsThe CLI and web app use the GTFS DuckDB extension for all station analysis, pathway queries, and pathfinding. See the extension docs for standalone usage.
packages/
duckdb-extension/ DuckDB extension (C++ native + TypeScript API + SQL)
web/ React web application (DuckDB WASM, Deck.gl, TanStack)
cli/ CLI tool (npm: @gabrielahn/gtfs-viz-cli)
yarn install --ignore-engines
yarn build # Build all (extension -> web -> cli)
yarn dev # Web dev server at localhost:5173
yarn build:extension # Build DuckDB extension TS layer
yarn build:cli # Build CLI only
yarn check # Type-check all packagesRailway via railpack.json: yarn build outputs to dist/, served by Caddy as SPA.

