TrainDex

A field guide for spotting New York City subway trains

Inspiration

We found a niche community of riders who post about weird and cool MTA roll signs and train models: ones that have been discontinued, ones that are rare to see, and ones that show up somewhere they are not supposed to be. Their posts are part detective work and part celebration, and we loved the energy. We wanted to build an app that supports that community while also bringing new people in, so that anyone on a platform can spot a cool train, keep a record of it, and learn the story behind it.

What it does

TrainDex is a snap and go app. You take a picture of the route sign on a subway car, and TrainDex turns it into your very own trading card. Each card shows the route, the matching sign design, the photo you took, and when you took it. Your cards collect by route, so you can see which lines you have found and which ones are still waiting for you.

How we built it

TrainDex works in a few simple steps:

  1. SNAP            2. FRAME           3. READ
  Take a photo  -->  Zoom in on    -->  Gemini describes
  of the sign        the sign           the sign
                                            |
                                            v
  6. COLLECT         5. CONFIRM         4. MATCH
  Your trading  <--  You pick the  <--  Our sign library
  card is saved      route and model    finds the closest designs

In plain terms, there are three parts working together:

  • The app is what you see on your phone. It opens right in the browser with no account needed, lets you take or pick a photo, and shows your collection of cards.
  • The sign reader sends your photo to Gemini, Google's AI model, which looks at the sign and describes it: the letter or number, the shape, the colors, and whether it is an old roll sign, an LED display, or an LCD screen.
  • The sign library is our own catalog of 323 sign designs (48 photographed in person and 275 rebuilt as graphics). It compares Gemini's description to every design it knows and returns up to three of the closest matches.

We kept the reader and the library separate on purpose. Gemini only describes what it sees, and our library decides what that description matches. That way the library can grow or the AI model can change without rebuilding everything else. We hosted our backend services on Vultr.

Today, the app plays the full experience with sample sightings, the sign library is live and returning real matches, and the sign reader is built and ready to switch on once it is connected to Gemini.

Challenges we ran into

Listing the train model. We had to decide whether every card should name a specific train model. The catch is that a sign's style does not prove which car it is on. A sign drawn in the style of an R62A, for example, could still appear on a different model. We made the train model optional, with an "Unknown" choice, so riders only record a model when they actually know it.

OCR or Gemini. We debated whether to use traditional OCR (text recognition) or Gemini to read the signs. OCR is good at pulling out letters and numbers, but a subway sign is more than its text. The meaning lives in the shape (circle or diamond), the color, and the type of display. Old roll signs are often faded or scratched, and LED signs are made of dots that OCR struggles to read cleanly. We chose Gemini because it can describe the whole sign at once, including the details OCR would miss.

Being honest about matches. Our match score measures how similar a photo is to a design, not a guaranteed answer. We show it together with how clear the photo was, and when a photo is too blurry, the app asks for a retake instead of guessing.

Accomplishments that we're proud of

We are proud of the design. TrainDex looks and feels like something you want to open on the platform, and we managed to capture each sighting as a beautiful trading card that is fun to collect and show off. We are also proud of building the sign library from the ground up: 323 designs, gathered, organized, and connected so that a single photo can be matched against all of them.

What we learned

We learned that the hardest part of a recognition app is not the recognition. It is deciding what the app is allowed to claim. Building TrainDex taught us to design around uncertainty, with optional fields, clear retake prompts, and a confirm step where the rider has the final say.

Working with Gemini showed us how much more an AI model can see than plain text recognition. Instead of just reading a letter, it could tell us the sign's shape, its colors, and what kind of display it was. We also learned to give Gemini a narrow, well defined job (describe the sign) rather than asking it to make the final call, which made its answers more consistent and easier to check.

Splitting the project into an app, a sign reader, and a sign library taught us the value of building pieces that each do one thing well. We could test the library on its own long before the reader was finished.

Using Vultr taught us how to get our backend services running in the cloud and reachable by the app, and how to keep the pieces deployed separately so we could update one without taking down the others.

Finally, we learned how much variety hides in something as familiar as a subway bullet. Cataloging the signs carefully gave us a real appreciation for the community that inspired us.

What's next for TrainDex

  • More train lines. Expanding the sign library to cover more lines and more sign variations.
  • Live trains. Wiring TrainDex up to real time data so riders can catch live trains and know which models are currently in service.
  • More models in the wild. Tracking the different train models running on each line, so riders can hunt for the rare ones before they disappear.

Built With

Share this project:

Updates

Submission history