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