Whenever I dejectedly waited for the T, I always wondered: just how many vehicles are running? Am I waiting so long because there are too few vehicles on the route? How many are typically running - and is it more or less than that? While I'm at it, is it particularly busy now? Knowing a trip's duration is a proxy for how busy the route is (because the T spends longer at each spot to pick up and drop off passengers), so can I estimate how busy it is throughout the day?

To answer these questions, both visually and dynamically, I decided to make a webapp...

Ok, that's not really true. In reality, I wanted to develop my first webapp while learning new technologies along the way. No PHP, no apache, no upstart daemons.

In that measure, I consider this project a massive success. I developed a solid understanding of a web framework (django), a templating language (Jinja2), a webserver (nginx), virtual environments (virtualenv), a distributed task queue (celery), a task manager (supervisor), a caching system (memcached), a CSS framework (Bootstrap 3), responsive web design, AJAX (using JQuery), an emergent plotting framework (plotly.js), load testing (loader.io) and finally Google Analytics. I also continued to refine my knowledge of pandas, SQL, git, bash and Unix permissions. I'm extremely satisfied with the technical functionality of the app and, to my surprise, I'm not disappointed with the design either.

Nevertheless, one thing about the app bugs me: it's kind of useless. Sure, it's neat to see how many vehicles are on the track, but more vehicles than usual doesn't necessarily mean the wait time is any less. Similarly, trip duration from start to finish isn't what people actually care about - they want to know how long their commute takes throughout the day. Only after getting fairly deep in the project did I realize that, from a user experience standpoint, the app is a failure.

UPDATE [11-27-2016]: This app unfortunately used a lot of resources on my lightweight t2.small EC2 instance so I decided to retire it. I've included some images below for posterity. As always, the code can be found on my GitHub.