The complete GTFS toolchain
Full validation
CRUD with query language
--where. Referential integrity is guaranteed before writing.Rust speed
gtfs-validator. Parallel validation, multi-million-row feeds handled without breaking a sweat..gl scripts
Local-first
CI-ready
Built for the GTFS lifecycle, not just one step of it
Most teams string together three tools to ship a healthy feed: a validator (usually gtfs-validator on the JVM), a pile of Python scripts that patch the broken rows it finds, and a one-off HTML report emailed to an operations team. gapline collapses that chain into one binary.
The same engine that validates a feed also edits it with a concise --where filter, enforces referential integrity on every write, and sequences both in a .gl batch file so a weekly cleanup pipeline commits cleanly to a git repo.
The result: a feed that never ships broken, a pipeline that never goes stale, and a 7 to 9 times shorter loop on every iteration. No JVM, no accounts, no uploads. The whole validation suite runs offline in under a second on a mid-sized feed, and the structured JSON output slots into any CI you already have.
Install
A single binary. No dependencies, no runtime to warm up.
curl -fsSL https://gapline.dev/install.sh | shInvoke-WebRequest https://gapline.dev/install.ps1 | Invoke-Expressioncargo install gaplineSee it in action
Real output from gapline validate on a production STM feed. With -o, the console shows progress and summary; every issue goes to the file. Drop -o to stream them inline.
$ gapline validate -f stm.zip -o output.txtFile Structure [] CSV Formatting [] → Feed loaded: 847,392 rows in 14 filesThird-Party Validators [] Field Validation [] Key & Reference Validation [] Semantic & Logic [] Best Practices [] ===================================Summary===================================45 Errors — 94912 Warnings — 177074 InfosStatus: FAILDetails written to output.txt (every error, warning, and info, with file and line). Why gapline
A single Rust binary that replaces a fragmented toolchain.