Continuous GTFS · by Jarvus Innovations

Stop firefighting your GTFS.

Continuous GTFS lets you transform, validate, and collaborate on your agency's GTFS data so you publish higher-quality feeds, more reliably, with less staff effort.

You shouldn't have to be scrappy to publish high-quality GTFS.

A set of scripts on your laptop, a scramble before every service change, and when something slips, your riders notice before you do. You've kept it running – you shouldn't have to keep doing it this way.

Stop scrambling, start building.

The same work, as a pipeline your team owns end to end.

Today

stop_times.txt hack_v2_FINAL.py ⚠ 214 spec errors feed_BROKEN.zip manual_upload.sh @#?!

One person's scramble, before every service change.

With Continuous GTFS

  1. 1 Ingest your vendor's feed
  2. 2 Transform with rules you own
  3. 3 Validate against the canonical spec
  4. 4 Review & sign off as a team
  5. 5 Publish staged to CDN

Valid feed live – riders get correct data

Transform. Validate. Collaborate.

Publish GTFS to be proud of.

Transform

Bring the scripts off your laptop. Your feed-processing rules run automatically on every upstream change, in one place the whole team can work in.

Validate

Every run is checked against the canonical MobilityData spec, on input and output. Nothing broken reaches production – a staging gate stands in front of your live feed.

Collaborate

A review-and-sign-off step before you publish: see the validation results and a plain-language summary of what's in the feed – trips per day, per route – so more than one person can stand behind it.

Your rules are code you own.

The platform fetches from your upstream sources, runs your rules, validates against the canonical spec, and publishes through a staging gate to a CDN – continuously, on every upstream change. Every run is logged, diffable, and reversible.

Not a GTFS editor – you don't hand-author feeds or key in individual detours. It applies your automated rules to the data you already produce.

transforms/strip_rt_suffix.py committed · v0.31
@step
def strip_rt_suffix(feed):
    """Trip IDs arrive with a vendor
    suffix the realtime feed omits."""
    feed.trips["trip_id"] = (
        feed.trips["trip_id"]
            .str.removesuffix("-RT")
    )
    return feed

Trusted by a high-performing transit team.

Running in production at a major Pacific Northwest regional transit agency: ~20,000 pipeline executions, a 178K-row schedule feed end-to-end in under a second, promote-only production enforced. Built by the team behind California's statewide Cal-ITP GTFS infrastructure and MBTA's V3 API. Open-source core – the pipeline is yours to keep; run it with or without us.

~20,000
production pipeline runs
<1s
178K-row feed, end to end
100%
promote-only production

Walk us through how your GTFS gets from your scheduling system to your riders.

Fifteen minutes.

Email us directly at transit@jarv.us