MARTA Transit Intelligence

Trains
Buses
Routes Active
Refresh in
30s
⚠ MARTA's NextGen Bus Network launches April 18, 2026 — this view shows the current 118-route network. Routes, stops, and coverage boundaries will change.
Rail lines
Red
Gold
Blue
Green
Vehicles
Train (heading)
Bus (click for route)
Selected route
Click a bus to reveal its full route shape.

Real-Time Data Orchestration

Architected as a three-layer serverless proxy system — each Netlify function solves a distinct integration problem. The bus feed decodes GTFS-RT Protocol Buffers server-side, converting binary protobuf into clean JSON with CORS headers. The rail feed holds the MARTA API key in a secure environment variable, deduplicates arrival records into one canonical position per train, and surfaces lat/lon for map rendering. The static feed proxy caches a 20MB GTFS zip in warm-instance memory for 6 hours, parsing 412,000+ shape points and 46,000+ trip records on demand.

Operational Scale & Coverage

  • 118 bus routes tracked via GTFS-RT vehicle positions (protobuf-decoded)
  • 4 rail lines with hand-curated station polylines (38 stations)
  • 412,000+ shape points in the static GTFS feed, Douglas-Peucker simplified to ~2KB per route
  • 30-second polling cycle matching MARTA's upstream refresh cadence
  • Server-side caching: 15s bus, 10s rail, 6h static feed — respectful of upstream rate limits
  • Paratransit equity model: live hex-binned coverage estimation against ACS 5-year census tract populations
  • Engineered for MARTA's NextGen Bus Network (April 18, 2026) — route directory auto-refreshes on cold start

Serverless Proxy Architecture

Three Netlify Functions eliminate the need for a dedicated backend:

  • bus-feed — Fetches MARTA's GTFS-RT protobuf endpoint, decodes with gtfs-realtime-bindings, returns structured JSON. Solves CORS and binary-format barriers simultaneously.
  • rail-feed — Proxies MARTA's Rail RESTful API with the API key held server-side. Deduplicates per-station arrival rows into one record per train with nearest-arrival priority.
  • gtfs-static — Downloads and caches the full GTFS zip. Serves a route directory (118 route IDs → friendly names) and per-route simplified GeoJSON via Douglas-Peucker line simplification (~5m tolerance). Reduces 84,000-point routes to <2KB payloads.

Visualization & Interaction Design

MapLibre GL on Carto Dark Matter basemap (no API key required). Rail lines rendered as colored polylines with glow layers. Live trains displayed as directional arrow icons rotated by heading (N/S/E/W). Buses rendered as interactive dots — click any bus to fetch its full route shape from the static GTFS proxy, drawn as a gold dashed polyline. AI narrative bar synthesizes the current network snapshot: time of day, active vehicle counts, busiest rail line, and arriving-now tallies. Countdown ring uses SVG stroke-dashoffset animation for continuous sweep.

Equity Analysis Model

The paratransit equity panel computes a live coverage estimate from active bus positions. Vehicle coordinates are binned into ~1km grid cells (census tract proxy), expanded by one ring of neighbors to simulate the ¾-mile ADA paratransit buffer, then multiplied against mean ACS 5-year tract populations (~3,900 for the Atlanta region). Coverage ratio benchmarked against MARTA's 1.5M service-area population. The model exposes how coverage contracts during off-peak hours — a disparity that concentrates in South DeKalb, South Fulton, and Clayton County.

Cloud-Native Deployment Stack

Single-command production deployment via Netlify CLI. Three serverless functions bundled with esbuild. Static assets served from Netlify's global CDN with instant cold-start performance. No framework overhead, no build pipeline dependencies. Built through an agentic AI workflow — the same rapid implementation model delivered to clients.

MapLibre GLNetlify FunctionsGTFS-RTProtocol BuffersDouglas-PeuckerJSZipCarto Dark MatterACS Census Data