Skip to content

The complete GTFS toolchain

A single Rust binary to validate, edit and script GTFS feeds. Fast, offline, CI-friendly.
200+
validation rules
17
GTFS files covered
>95×
faster than gtfs-validator
0
data leaves your machine

Full validation

Every rule from GTFS Schedule, not a subset. Each error points to file, line, field, and value.

CRUD with query language

Read, edit, and delete with a concise --where. Referential integrity is guaranteed before writing.

Rust speed

Up to >=95x faster than gtfs-validator. Parallel validation, multi-million-row feeds handled without breaking a sweat.

.gl scripts

Chain validation and CRUD in a single batch. The feed stays in memory, with a single save at the end.

Local-first

No data leaves your machine. No accounts, no network dependencies.

CI-ready

JSON/XML/CSV/HTML outputs, structured exit codes, shell autocompletion. Built for pipelines.

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.

Terminal window
curl -fsSL https://gapline.dev/install.sh | sh

See 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.

Terminal window
$ gapline validate -f stm.zip -o output.txtFile Structure              [██████████████████████████████] 0/14CSV Formatting              [██████████████████████████████] 0/2 Feed loaded: 847,392 rows in 14 filesThird-Party Validators      [██████████████████████████████] 0/6Field Validation            [██████████████████████████████] 0/13Key & Reference Validation  [██████████████████████████████] 0/24Semantic & Logic            [██████████████████████████████] 0/24Best Practices              [██████████████████████████████] 0/9 ===================================Summary===================================45 Errors94912 Warnings177074 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.

8 MB
RAM on typical feeds
49× less than gtfs-validator (399 MB).
7–9×
faster on real-world feeds
Up to 96× on small feeds. Parallel validation.
1
binary, 0 runtime
Replaces gtfs-validator (JVM), Python scripts, custom tools.