Your agency isn't generic. Your screens shouldn't be either.

The open-source core stays clean and client-agnostic. Everything specific to your agency — display hardware skins, fleet liveries, feed quirks, brand cartography — lives in a thin custom module we design, build, and maintain for you.

The two-screen pylon

A platform pylon we built as an agency module: the top screen rotates the active route's badge, sized to be read from across the platform; the bottom screen follows with that route's alerts and live departures. Both surfaces poll one endpoint and flip pages in lockstep.

Each screen is a role on the shared display engine — the agency module registers the skin, the fonts, and the two-screen pairing, and the core does the rest.

Top screen of a two-screen platform pylon, landscape: agency logo above a large route letter badge with destination. Bottom screen of the same pylon: service alerts, live departures with minutes, and route info, labeled in four languages.

Work we've shipped as agency modules.

Display hardware skins

Variants matched to your physical fleet: two-screen platform pylons, single-screen boards, static system-map screens, e‑ink, portrait or landscape — each registered as a skin on the shared display engine, with your typography and brand system.

Fleet vehicle liveries

Per-vehicle icons on live maps, keyed by vehicle ID — so a historic streetcar shows up on the map as that streetcar. Adding a vehicle is dropping in a PNG; no code changes.

Brand cartography

Custom vector basemap styles served per agency, so every embedded map matches your identity instead of a generic web map — swappable per deployment from an admin setting.

Feed quirks

Realtime stop IDs that don't match your static feed, agency-specific route enrichment, import pipelines tuned to how your GTFS is actually published.

GTFS extensions

Support for the extension files your region actually publishes — GTFS+ and beyond — modeled as first-class entities alongside the standard spec.

Website & CMS integration

Live maps and boards embedded into your existing site with per-origin frame security, a postMessage contract for graceful empty states, and legacy-parity URL parameters for painless migration from older widgets.

Custom code as a thin layer, never a fork.

Variant registration, icon injection, ID mapping, install-time defaults — the agency module does its work through hooks the core publishes. The core stays upstream and upgradable; your customizations stay small, testable, and yours.

  • Upstream core — you track the same modules everyone else runs
  • Hook-based — nothing in core gets patched
  • Config-seeded — agency defaults install automatically, stay editable in the admin UI
# One thin agency module, three hooks

hook_gtfs_display_variants_alter()
  → register the 'pylon' hardware skin

hook_gtfs_display_map_rt_vehicle_icons_alter()
  → per-vehicle liveries from vehicleIcons/*.png

hook_gtfs_display_rt_entity_ids_alter()
  → map static stop IDs to realtime feed IDs

Put your feed to work.

Every agency has the thing no off-the-shelf product handles. Tell us what's weird about your system — that's our favorite part of the job.