NFTA Metro · Buffalo, NY

Live departures across NFTA Metro's screens.

Real-time bus and scheduled rail, built entirely on NFTA's own data.

Prepared by Normeltech
Today

How departures look today

This is a real NFTA departure screen, as it looks today — the live departures riders already rely on.

Main St and Allen St
June 2nd 2026, 1:29:00 pm
NFTA-METRO
Route
Destination
ETA
8
DOWNTOWN
17 min
8
DOWNTOWN
47 min
8
DOWNTOWN
60 min
A current bus screen.
The new experience

One clean screen — the same everywhere

The same crisp, NFTA-branded design at every location: the route, where it's headed, and how many minutes away. Bus times count down live as buses move; train times come from NFTA's published timetable.

NFTA METRO
University Station
Bus departures
1:47 PM
Live
8
Downtown
3min12
19
Bailey-Abbott
7min26
48
Williamsville
11min38
A bus screen. Live minutes, counting down as buses approach.
NFTA METRO RAIL
University Station
Southbound · to DL&W Station
1:47 PM
Timetable
MR
Southbound
Departs 1:59 PM
12min
MR
Southbound
Departs 2:11 PM
24min
A train screen. The next departures from the timetable, by direction.
The solution we're building

NFTA's own data in, a simple screen out

No outside services, no middlemen. We read the information NFTA already produces, work out the next departures for each location, and serve a plain web page that any screen can show.

Click any step to learn what it does
NFTA's live data
The bus and rail information NFTA already publishes.
Our service
Reads the data and works out each screen's next departures.
The screens
~100 displays, each just opening a web page.
Step by step

From feed to screen, in seven steps

The whole system is one path — NFTA's data in on one end, a screen on the other. Click any step to see what it does and why it matters.

Built on NFTA's own data

From a location to a screen, in plain steps

Each screen is defined by where it is. From there, the system does the rest automatically — so the right routes simply appear, without anyone maintaining a list by hand.

1

Find the nearby stops

For a screen's location, gather the bus stops and train platforms close by.

2

List the routes that serve them

From NFTA's data, see which routes stop there and which direction each is headed.

3

Work out the next departures

Take the timetable, add the live delay for buses, and show the next few — soonest first.

Many screens, one station

Each screen shows its own view

Big stations have more than one screen — University, for example, has three, one for each set of boarding bays. Each screen shows only the departures for the bays it faces, so riders see what's relevant right where they're standing. It's the same system on every screen; each one simply carries its own short list of stops.

1

University · Screen 1

The bays for routes 5, 44, 47, 48, 49.

2

University · Screen 2

The bays for routes 8, 12, 13, 81.

3

University · Screen 3

The bays for routes 19, 34.

Three screens, three different views, all from one platform — and NFTA staff can change which screen shows which stops or routes at any time, without ever touching the screens themselves.

Behind the scenes

Dependable by design

Built to run unattended for months and to keep working through hiccups. Click any part to see what it does.

Click to explore
Reading the data
Live bus data every ~30 seconds; the schedule refreshes itself.
Working out departures
Turns each location into its next departures.
Serving the screen
One simple web address per screen.
Staying reliable
Never goes blank; the team is alerted to real problems.
NFTA signage system design NFTA's live bus GTFS-RT feed and the static bus and rail GTFS feed flow into a backend service on Docker/Railway. Inside, a live poller, a static ingester, a departure resolver and a board API process the data, backed by a Redis cache and a PostgreSQL database, managed by an Angular admin console (Phase 2), serving one lightweight board page per screen that the OptiSigns displays load. Backend service Docker · Railway Live bus feed GTFS-RT Static GTFS bus + rail Live poller every ~30s Ingester auto-refresh Resolver stops → times Board API ?loc=<code> Board pages ?loc=<code> Displays OptiSigns Redis live cache PostgreSQL config + data Admin console Angular · Phase 2
The whole system on one page. NFTA's two feeds come in on the left; the service resolves the next departures and serves one lightweight page per screen on the right. Redis holds the live cache, PostgreSQL the config and schedule, and the Angular admin console arrives in Phase 2.

Technology: Python & FastAPI · PostgreSQL · Redis · runs in a container on Railway — the same kinds of tools NFTA's own team already works with, so it's straightforward to support long-term.

How it's organized

A clean, simple structure

What the platform uses today is kept in just a few well-defined places. Click any to see what it holds.

Click a table for detail
Screens & locations

Each display location — where it is and what it shows — and the physical screens that point at it.

Routes shown

Which routes appear on each screen and in what order — filled in automatically from NFTA's data.

Schedule & live data

NFTA's bus and rail schedules, loaded and kept current.

Built for what's next

Already structured to grow

The same foundation has room for Phase 2 — messages, departments, and richer screens slot in later without rework. These pieces are designed in now, ready to switch on.

Messages & alerts

Service messages to show on screens, such as a detour or an elevator outage.

People & departments

Who can manage which screens — set up so each department can run its own.

Screen content

A screen can hold more than departures — room for messages, weather, and more.

Built to grow

The foundation is laid for what's next

Phase 1 delivers the live departure screens. Just as importantly, it's structured so the next pieces drop in cleanly — without rebuilding anything.

An admin console

Later, NFTA staff get a simple console to add screens, fine-tune what each one shows, and post messages — all on top of the same foundation. The routes themselves always come from NFTA's data automatically; the console is for the human touches.

More than departures

The same screens can carry service messages, weather, and announcements — added as new content types, not a new system.

Every department

Bus, rail, aviation, and more can each manage their own screens from one shared platform.

The plan

Where we're headed

Now

Live screens

  • Bus + rail departure screens
  • Built on NFTA's own data
  • Running across the display network
Next

Admin console

  • NFTA staff manage screens
  • Post service messages
  • Each department self-serves
Beyond

One platform

  • Weather & announcements
  • Aviation, and more
  • Every screen, one place