Upcoming Max Transit Changes

Upcoming Max Transit Changes

Max Transit has recently released their plans for upcoming changes to Birmingham, AL’s transit system that will go into effect in mid to late May. The plan primarily consists of two parts:

  1. Using the new BRT (Bus Rapid Transit) stations as hubs to begin moving away from the central hub and spoke model that has been out of date for decades.
  2. Using “On-Demand” service for areas of low ridership.

Why is this happening?

There appears to be three major reasons for these changes.

First, Birmingham’s transit system has used a hub and spoke model for 60+ years. The original assumption was that every one from the edges of Birmingham would all want to come to Central Station. With changes in population, this is no longer an accurate representation of how riders want to utilize public transportation.

Several other hub and spoke transportation systems in other cities in the US have already or are planning to reconfigure their system into a grid like system. A grid system has several advantages, including higher frequency, multiple paths to your destination, and better coverage. However, it comes with a potential downside of needing to transfer rather than having a direct route. Transferring is really only an issue if the frequency of buses is poor.

With the completion of the East-West BRT (Bus Rapid Transit) system last year, Birmingham now has several stations or hubs that can be utilized. This is allowing Max to begin to reconfigure their system into a more grid like system and utilize the BRT as the backbone of the system.

In my opinion, this is the correct direction to be heading in, and I am excited about realignments that focus on connecting with the BRT.

Second, as seems to always be the case in Birmingham, Max is severely underfunded. This means trying to use what little resources they have as efficiently as possible. Unfortunately, this means removing duplication and eliminating areas of low usage, so you can allocate more resources to areas of high demand.

Third, there is a nation wide shortage of bus operators, mechanics, and other related workers. During the meeting, Director Charlotte Shaw said that there is a 80k-100k shortage of public transit workers nationally. At Max, there is currently a lack of bus operators. Max has 30% fewer operators than they need to operate the system! This means drivers are working overtime and/or trips on routes have to be canceled daily. In fact, if you subscribe to Max’s alert system, you will get messages like those below throughout the day of trips being canceled, likely because of a lack of operators.

Messages of Canceled Runs

Bus operators must have a CDL (commercial drivers license), and finding operators to hire has been difficult for Max since COVID.

One advantage of the On Demand service, is that the vehicle is a standard Minivan and does not require a CDL, which means it is easier to find operators.

Route Realignments

First, let’s look at routes that are being modified to use the BRT stations as hubs:

17 – Eastwood

This is a map of the current route 17 (Green) and the BRT (Purple). Currently, the 17 meets up with the BRT at the east Woodlawn station, but continues to central station downtown on the 3rd/4th Ave S/US 78 corridor.

Existing Route 17 and BRT

The upcoming changes have the 17 terminating at the BRT east Woodlawn station. Riders that want to continue downtown must now transfer to the BRT.

Modified Route 17

The Route 17 is significantly shorter and eliminates duplication. Based upon the proposed timetable, it is a 35 minute loop with a 10 minute buffer at the Woodlawn transit center. This allows the transit agency to run a single bus and have 45 minute frequency, whereas previously, frequency was at best 55 minutes. With the updated route, the bus will run the route 21 times vs currently only running 19 times.

Riders will have to transfer to the BRT, and depending upon that transfer time, the time to central station should be roughly equal, as the BRT is an express bus, rather than a local.

The biggest effect is that the 17 no longer provides service down US 78 (3rd/4th Av S). To compensate for this, the 25 will be realigned to no longer duplicate the BRT down 1st Av N, but instead take US 78.

Route 25 – Center Point

This is a map of the current route 25 (Red) and the BRT (Purple).

Existing Route 25 and BRT

With the re-alignment, the Route 25 will still meet the BRT at the east Woodlawn Station, but will then follow the previous Route 17 down US 78 to Central Station.

Modified Route 25

The Route 25 currently has two buses service it in the morning and evening with 45 minute frequency, but only a single bus during midday with 1 hour and 30 minute frequency. According to the modified schedule, the Route 25 will now have 2 buses servicing it throughout the entire day, giving it a constant 45 minute frequency and 6 extra trips a day.

This is a good thing for Center Point residents, however, overall this is a loss for some of the current riders of the 17. Most notable, the 25 does NOT run on the weekends, which means any riders that previous used the 17 between Central Station and Woodlawn will no longer have Saturday Service.

Route 48 – South Powderly

Several years ago, during some major cuts, the Route 8 was eliminated and the Route 48 was realigned to combine the 8 and 48. Frequency was also cut back. This is a map of the current Route 48 (Red) and BRT (Purple).

Existing Route 48 and BRT

As you can see, there is quite a bit of overlap between downtown Central Station and the BRT. With the re-alignment, the 48 will no longer go to Central Station, and instead will use the 6th Av S / Goldwire BRT station has a hub. The rest of the route will remain the same.

Modified Route 48

According to the proposed timetable, the Route 48 will now have a frequency of 1 hour, instead of 1 hour 25 minutes.

Route 7 – Fairfield

This is a new route that utilizes the BRT’s West Crossplex Transit Station as a hub and services Fairfield and connects with the Route 5 – Ensley/Wylam/Fairfield.

New Route 7

At this point, the route is somewhat limited, as it only runs on weekdays with a frequency of 1 hour. It also only runs in the morning (6am – 9am) and in the afternoons (3.30pm-6.30pm). The route also has a 10 minute buffer at the Crossplex Transit Station to help with connections to the BRT.

On Demand Changes / Route Eliminations

For those not familiar, the city of Birmingham entered a partnership with Via several years ago to provide On Demand micro transit. This allows riders to use an App similar to Uber/Lyft to schedule a pickup. A 5 person van picks up riders along the same route and drops them off.

However, this is not a door to door private service like Uber/Lyft. You are typically asked to walk around 1-2 blocks to a specific corner/side of the street. This is to help optimize the route, so the vehicle isn’t pulling U-turns or changing directions. It is possible that you will get the van to yourself, but if there are other requests along the same path, those riders may be picked up or dropped off along the way.

Originally, this was paid for and managed by the City of Birmingham. Recently, the city of Birmingham has been working in partnership with Max Transit to promote the service as a unified solution to transit. This is a step in the right direction, but eventually, Max Transit should be the owner of this rather than the city of Birmingham.

With constant budget cuts comes more route eliminations. The changes presented eliminate Route 12 – Highland Park, Route 18 – Fountain Heights, and Route 43 – Birmingham Zoo.

Route 12, Route 18, and Route 43 will all be eliminated!

These neighborhoods will no longer be services by _any_ fixed route bus service. Instead, Max is proposing extending the zone of the Birmingham On-Demand Service to include these areas.

In my opinion, this is a huge loss for these neighborhoods. Highland Park is the original street car neighborhood in Birmingham, and was designed around the #12 street car. Several years ago, when there were major route cuts due to funding, Highland Park lost the #44 and was left with only the #12. The #12 was re-routed to attempt to cover parts of both the #12 and #44, but instead, it ended up ruining the route costing ridership.

While I am not against On Demand Micro Transit, I have concerns about how it is currently being implemented. Micro Transit is not a replacement for fixed route service. Nor should Micro Transit be a way to bypass fixed route service.

If you look at many of the fixed route bus lines, you can see that they are rarely straight. Instead, they meander all over the place to pickup a few riders here or service this business over there. When there are budget cuts, routes get combined causing them to cover even more areas.

What this does is slow down the bus routes and leave us with long run times and poor frequency, making a frustrating experience. What should be a 15 minute bus ride, becomes 35 minutes due to it not being direct.

Micro Transit can help with this problem. It allows the transit agency to realign and straighten the route. The bus route no longer has to go out of its way, into a low density neighborhood, to possibly pick up 1 or 2 passengers. On Demand Micro-Transit can instead, pick up those 1 or 2 passengers and bring them to the bus stop. It solves a critical first-mile/last-mile issue, especially for those who can’t or won’t walk longer distances or ride a bicycle.

This can give everyone a better experience. The bus is quicker. The bus has better frequency. And most importantly, we don’t leave any riders behind.

Unfortunately, this is not how Birmingham’s On-Demand Micro Transit is currently being implemented. Even though it is now a “partnership” with Max, it is still a separate service, with a separate fare, and no ability to transfer between fixed route services or on-demand.

Using it as a replacement or an excuse to replace fixed route service is not a good solution. I really hope in the future, the implementation of micro transit is changed to require either the pick up location or destination be a transit station, and I sincerely hope Max considers bringing back fixed route service in both Highland Park and Fountain Heights.

Questions Left Unanswered

The public meeting about these changes left several questions unanswered. If I learn any more details about these questions, I will update this page.

Payment Systems + Transfers?

The Fixed Route Buses, the BRT, and On Demand all have different payment/fare systems and are not compatible with each other. This brings up a major issue for riders of the 17, 7, and 48, as they are now expected to transfer from fixed route to the BRT.

However, at this time, it is not possible to use your Fixed Route Fare which could be a single ride ticket, daily ticket, or monthly ticket on the BRT. You have to purchase a separate BRT fare card. This means that a trip from Eastwood to downtown now essentially costs $3.00 instead of $1.50!

Max leadership indicated that they are currently looking into unifying the system between Fixed Route and the BRT, but it is not clear if will be available by Mid May when these changes take effect.

Because the On Demand Micro Transit is paid for by City of Birmingham instead of Max and is operated by Via, there are no plans currently to integrate fares or transfers between it and the Fixed Route or BRT systems.

Updated On Demand Coverage Areas?

Currently, the On Demand service has limited coverage areas and does not currently include Highland Park. It stops just short at St. Vincent’s Hospital.

Max Leadership indicated that the On Demand coverage area would be expanded to include Highland Park, but there has been no confirmation of this at this time.

The material says “Via Daytime zone covers a good percentage of this local fixed route”. However, that is not true, as it only covers from St. Vincent’s Hospital to downtown, nothing in the actual Highland Park neighborhood. The online map still shows coverage of Highland Park lacking:

On Demand coverage of Highland Park

With the changes to the 17, many people between South Side and Woodlawn will now have to utilize the 25. However, the 25 doesn’t run on Saturday. Unfortunately, it does not appear that On Demand coverage will be expanded for this area either, leaving all these residents without any weekend service.

On Demand Coverage of the Route 17

On Demand Hours?

Currently, On Demand doesn’t begin until 6am. Both the 12 and the 18 began service at 5.30am. Some riders were concerned they would no longer be able to make their connections at Central Station.

No Rider Left Behind?

Leadership did take each riders concerns very seriously and are looking to make this transition as easy as possible. To that extent, they are running a few month program during the transition called “No Rider Left Behind”. Any users affected by these route changes will be able to call a support number and have a van pick them up.

For additional information about these changes, please see Max Transit’s Web Site.

See Stops and Arrival Estimates in Go Transit Apps

I have been making several improvements to the montclair code base, which is the software that powers all the Go Transit apps.

Go Transit now shows the stops of the selected route
See the stops for the Highland #12

First, for the selected routes, you can now see where all the stops are. This helps people who are unfamiliar with the system know where to pick up a bus that is near by.

See the arrival times of buses for the selected stop
Stop Arrival Times

Selecting a stop on the map will show you the estimated arrival time of buses for that stop! This is a live view that is continuously updated as the arrival estimates change.

If multiple buses use this stop, view all their arrival times
Arrival Times of a Stop with Multiple Buses

If multiple buses go through the same stop, then the app will show the arrival estimates for all the buses. This is especially useful in cases where routes overlap and you have multiple options.

All of these changes have already been pushed out, and any apps you have should automatically update!

Validating Availtec’s Bus Arrival Estimates

In my last post, I created a dashboard that shows the estimated arrival time of buses at specific stops. After using it, I was curious to see how accurate those estimates are.

So I have created a new project:


As always, everything is opensource and available on my github page.

This project consists of two parts:

  1. A capture script that queries Availtec’s API every 30 seconds for the estimated arrival time and stores them in a local database
  2. A graph script that generates pretty visualizations from the captured data.

Here is an example of the Route 44 Inbound at St. Vincents Hospital for Birmingham, AL’s transit system.

Route 44 Estimates

Each “block” is a bus trip throughout the day. The dark black line represents the actual time the bus arrived at this stop. The dark blue line shows when Availtec estimated the bus would arrive at that specific time.

Ideally, the dark blue line would be as close as possible to the dark black line.

From the image above, we can see that the 4th trip, from 10:44:17 to 10:46:17 had the best estimate. From 10:00am to 10:50am, Availtec estimated the bus would arrive ±30 seconds from when it actually did.

We can also see that the trip after it, had the worst estimate. From the time the trip started, just before 10:50, until around 11:20, Availtec was estimating the bus would arrive at 11:32, when it actually came at 11:38. It wasn’t until about 11:25, that the system suddenly corrected and started estimating a more realistic time.

This project works with any bus system that utilizes Availtec for real time tracking. You can leave the capturer program running in the background for days, then generate graphs based on that historical data. The graphing script allows you to specify which stops, routes, and days to plot.

Real time tracking of Birmingham’s Bus Systems

Birmingham, Alabama’s transit agency, the BJCTA (Birmingham-Jefferson County Transit Authority) has a website for tracking the buses in real time. This website along with their mobile app are ok, but have some things that constantly annoy me. My biggest annoyance is that every time the App is brought to the foreground, it refreshes and resets you back to the main page, losing the bus you were trying to track. The other problem is that you can only view one route at a time (at least on the mobile app). I have 3 routes that I can choose between every day. When I open the app, I want those three routes selected by default so I can quickly see which route to pick.

With that, I present to you Montclair.

Montclair is a simple javascript application written in React. The version running at https://montclair.line72.net supports both the official Birmingham Transit System and the University of Alabama at Birmingham’s transit system. However, the code is not tied to any specific transit system and will actually support any real time system powered by Availtec or TransLoc. As always, everything is open source:

API For Historical Bus Data

My previous blog post (Visualizing the On Time Performance of Birmingham’s Bus System) looked at creating visualizations based on the real time data provided for Birmingham, Alabama’s public transit system. I have now created a simple, public API that can be used to query the historical data captured from the real time system.

Using my dv8 scripts, I am capturing a snapshot of the real time data every 30 seconds. I am then storing this data in a sql database, so that we will have a historical database. This allows for generating reports and visualizations over time. As of writing this, I have about 2.5 months of data captured.

I am making all of this data public, along with a simple API for making queries. The API is located at:



However, if you visit that site, you will notice that you get a ‘Page Not Found’ error. That is because it is only a backend API, and you will need to construct URLS to make queries. Let’s look at a few sample queries (All data is returned in JSON format. I have found that making these queries in Firefox is preferred over Chrome, since Firefox will nicely format the results):

Query for all the routes:


This returned a list of all the known routes and their properties. Each route also has a set of “Trips”. A trip is a unique instance of a bus running along a route. For example, if everyday at 4.00pm a bus leaves Central Station along the route 44 and arrives at its final destination at 5.00pm, this would be a Trip. We can get a list of all the trips for a specific route.

Query for all the trips on the Route 44

Based on the previous query, I have found that the “44 Montclair” has an id of 21.


This returned all 61 trips associated with the route 44. Unfortunately, this doesn’t give us that much information about the individual trip. For instance, we have no idea based on the returned results what time of day a trip runs. For every trip, we can get a series of “Waypoints”. Waypoints are all the known information about a bus on a trip at a given time. They are essentially a snapshot, showing the location, passenger count, time deviation, and various other details. We can pick a specific trip and query it.

Query all Waypoints for a single trip on the Route 44

I am going to select a trip at random from the previous query. I will use 699, and will query its waypoints:


This returned A LOT of data. This trip runs every weekday, and we have samples at every 30 seconds. The API returns a maximum of 1000 waypoints, so only the first part of the data was returned. Typically, we want to filter this data, and only get a specific range. For example, let’s only get the waypoints on a specific date. We can use the start_date and end_date parameters to put limits:

Filter the waypoints for a specific date:


On this date, this trip was an Outbound (0) trip. It left Central Station at 11:45:00 AM and arrived at Eastwood Mall on time at 12:21:00 PM.

We have samples every 30 seconds of this trip. Using that, we could calculated the average on time performance or visualize the number of passengers on the bus. You can take this json data and convert it to CSV using a simple converter tool. You can then import your CSV into a spreadsheet program, like Excel or LibreOffice Calc and create visualizations.

For full documentation on the API including all the routes, parameters, and data types, a Swagger file is available. You can also view the documentation online.

Source Code

Th API was written in PHP using the SLIM framework. The source code is available on my dv8-api-server github project.

Visualizing the On Time Performance of Birmingham’s Bus System

A few months ago, Birmingham, Alabama’s bus system (BJCTA Max Transit) retrofitted all of their buses with a GPS system. Along with this upgrade, they released a website allowing riders and the public to track the locations of buses in real time. The website is backed with a public RESTful API, so I decided I would poll the API to retrieve live information on all the buses throughout the day and store them in a local database.

With this information, it is possible to run some analysis on the system. We could look at passenger count, travel time, travel deviation, areas where buses tend to slow down, performance at different times of the day, and a host of other analytics.

The first analysis I have done is looking at the time deviation. This is how far ahead or behind schedule a bus currently is. A negative number means it is ahead of schedule and a positive number means it is behind schedule. The general rule is that ± 5 minutes is “on time”.

The graph below goes through an entire day looking at all the buses on each route. Each route is separated into its own section, so you can clearly see how a single route performs throughout the day. Along a route, multiple buses will simultaneously be making individual trips along that route. Each color represents a different bus making a different trip. Since there is overlap between buses sometimes making it difficult to see where a trip starts and ends, I have placed bars below the graph. Each of these bars mirrors a single bus making a single trip, allowing you to easily see how many active buses there are and when they started and stopped their trip.


If we zoom into a specific route, we can get more detail (Click on the image to see the full day). This is line 17 – Eastwood Mall. It is one of the busier routes with several buses making simultaneous trips. As you can see, most trips start and end on time, however, there is a bit of a peak about halfway through the trips, where the bus is behind schedule by up to 15 minutes.

After looking through the data, I have few interesting conclusions:

  • There is quite a bit of deviation along most routes. However, the most important thing to look at is the start and end of each trip, and for most trips, those have a tendency to converge on 0 deviation. This means the overall trip length is as expected, but buses are being held up in the middle of trips due to traffic and other unforeseeable circumstances.
  • I don’t know what happened to the 14 (Idlewild Palisades) around 5pm. I’m thinking the bus broke down and a new bus (purple) had to be sent out to replace it.

  • Some routes are interlined. For example, the 12 and 18. The bus starts off as the 12, does its trip, but once it pulls into central station, that same bus becomes the 18 and does a trip along route 18. When it returns to central station, it once again becomes the 12. It appears as though the 18 is constantly taking longer than the expected time which makes the 12 start late. Even though the 12 makes up time, it can’t seem to ever get on schedule.

  • The 280 runs down a major suburban corridor that has the worst traffic in the region. Even during rush hour at 5.00pm, the route is expected to have the same trip time as 10am. Clearly it doesn’t.
  • The most heavily used routes: 17, 1, 3, 44, 45, 6, 28, 8, 1 Ex all have minor deviation and run on time.

The code is currently available on github:


I’m still cleaning up the code, but it is currently usable. I’m also thinking about porting this to D3 and doing live visualization on a website rather than generating a static image.

Global Urban Datafest Hackathon

Last week, myself, Code for Birmingham, and a lot of other talented people came out for the weekend long Global Urban Datafest Hackathon. My team, the Red Mountain COALBOL Miners, worked on a project for the city of Birmingham to help convert their old proprietary datasets into modern formats that they can put in their data warehouse. This is the first big step in getting more open data available for Birmingham.

What was really great about this experience, was every challenge came from a government or city official, so we were solving actual needs and forming great relationships with our city leaders. All five teams did an excellent job, and I hope work continues on all the projects.

My team along with a project working with the Land Bank Authority both won the competition and will be moving on to the nationals. AL.com was one of the sponsors and has done some cool write ups of the weekend:




You can find the code our team worked on at our github page.

BJCTA Trip Planner now in sync with official data

My trip planner for the BJCTA Max buses (http://www.bjctatripplanner.org) along with my android app, are now in sync with the official data from the BJCTA. I will continue to keep my site in sync with their data, which means up to date and accurate data!

The app was not found in the store. 🙁