• Years
  • Timeframe
    8 weeks
  • Team
    Solo project
  • Goal
    Build a system to help Operations efficiently load ride vehicles


At Universal Parks and Resorts, every attraction has at least one operator with a role called "Grouper". The Grouper is responsible for greeting guests at the front of the loading dock and asking them how many are in their party. Based on the size of the party, the Grouper will assign each guest a row number on the ride vehicle, filling the vehicle as efficiently as possible.

Traditionally, Groupers perform this task without any assistive equipment such as paper or pens. Many roller coaster trains only seat two guests per row, so it is relatively easy to look at the loading platform and see all remaining available seats. In 2016, however, Universal started introducing rides that seated up to 72 guests, and Groupers understandably started getting overwhelmed.

Park Operations wanted an iPad app to assist the Groupers, but the lowest quote they received for the job was over $150,000, and there wasn't a budget for that level of spend. I had done a mockup for Operations previously, so they asked me if I could help get something off the ground. We talked it over with my leadership, and in the end I designed, developed, and deployed the GrouperAssis iPad app at two attraction venues before handing off the project to a dedicated team.

The Design

In my first meeting with Operations, they showed me a version of GrouperAssist from a different attraction that was in production at another park. After playing around with that app for a few minutes, I noticed some accessibility issues.

A previous design for GrouperAssist had color-related accessibility issues

For our GrouperAssist app, I proposed a fix for colorblindness accessibility and three other design changes. First, the old design had many uncommonly-used settings buttons on the main screen, competing for real estate with the system status UI and causing some visual clutter. I proposed that we move these situational elements into a "Settings" tab that could be shown or hidden as needed.

My final design for GrouperAssist

My second proposed change was the introduction of the scrolling number line at the bottom of the screen. In the previous app design, after a Grouper entered the number of guests in the party, he or she had to press a "Confirm" button. In an app like this, that amounts to ~20-30 presses of the confirm button per minute, which could become a bottleneck for ride throughput. With my number line design, the most commonly used party sizes were selectable with a single button press, while larger party sizes could be accessed by scrolling the number line to access higher numbers.

My first two design changes were gladly approved, but I did propose one idea which was denied. I asked whether the Operations team felt it necessary to render every seat of the ride vehicle in a visual grid like the previous app had done. The grid of seats took up almost the entire screen, and I thought it might be worth challenging this assumption to find a way to convey the same information in a more compact way. The Operations team decided to clarify that the visual grid of a seats was a requirement. Aligned with Operations' vision for the app, I was off to write the code.

The Implementation

The GrouperAssist app was a pretty straightforward Swift job, but I added some nice features:

JSON ride schema: Operations informed me that it was likely that GrouperAssist would be rolled out to many attractions over time, so I wanted to give them a tool to help that happen smoothly. Rather than hard-coding the app UI to any particular number of rows or seats, I generated the app UI at runtime based on the ride schema in a configuration JSON file. That way, if Operations wanted to deploy the app to another attraction, they could just change the JSON instead of having to hire a developer to change the code.

Multithreaded networking: Operations wanted the option to have multiple Groupers simultaneously working the same ride vehicle for faster throughput during peak season. To accomplish this, I used IBM BlueSocket and the Swift Dispatch system to handle state synchronization with other Groupers on separate threads while keeping the UI thread responsive for user input.

The Results

I offered to help the Operations team with a beta test of the app before putting it into production, but the Operations schedule was so tight that they went straight to production within 24 hours of my submission of what I thought was Beta version 1. Fortunately, the app was solid, and we only needed one minor patch in the weeks following launch.

I was the sole designer and developer of GrouperAssist for the first two production launches at Race Through New York Starring Jimmy Fallon™ and Fast and Furious: Supercharged™, at which point we found a loving new home for the codebase. I trained the new development team for four weeks, and at long last bid farewell to the project.

Before the app had gone live, I also filed an invention disclosure with Universal's patent team, and worked with Universal's patent attorney to get an application filed.

GrouperAssist was my first career patent application