This past weekend, my colleague and friend Sandy
Smith participated in Election
Hackathon 2012 (read his
take
of the hackathon). We built our first public
Musketeers.me product,
Candidata.me. This was my first hackathon, and it
was exciting and exhausting to bring something to life in little more
than 24 hours. Our idea combined a number of APIs to produce a profile
for every candidate running for President or Congress in the United
States. The seed of the idea was good enough that we were chosen among
10 projects to present it to the group at large on Sunday afternoon.
Under the Hood and Hooking Up with APIs
We used our own PHP framework, Treb, as our
foundation. It provides routing by convention, controllers, db acccess,
caching, and a view layer. Along the way, we discovered a small bug in
our db helper function that failed because of the nuances of
autoloading.
I quickly wrote up a base class for making HTTP Get requests to REST
APIs. The client uses PHPs native stream functions for making the HTTP
requests, which I've found easier to work with than the cURL extension.
The latter is a cubmersome wrapper to the cURL fucntionality.
To be good API clients, we cached the request responses in Memcached
between an hour to a month, depending on how often we anticipated the
API response to change.
Sandy also took on the tedious - but not thankless - task of creating a
list of all the candidates that we imported into a simpl Mysql table.
For each candidate, we could then pull in information such as
- Polling data from Huffington Post's Pollster
API, which we then
plotted using jqplot. Polls weren't
available for every race, so we had to manually match available polls
to candidates.
- Basic Biographical information from
govtrack.us.
- Campaign
Finance and
Fact Checked
statements from Washington Post's APIs.
- Latest News courtesy of search queries to NPR's Story
Api.
- A simple GeoIP lookup on the homepage to populate the Congressional
candidates when a user loads the page
Bootstrap for UI goodness.
I used this opportunity to check out Twitter's Bootstrap
framework. It let us get a clean
design from the start, and we were able to use its classes and
responsive grid to make the site look really nice on tablets and
smartphones too. I found it a lot more feature filled than
Skeleton, which is just a responsive CSS
framework and lacks the advanced UI elements like navigation, drop
downs, modals found in Bootstrap.
Improvements that we could make
We've already talked about a number of features we could add or rework
to make the site better. Of course, given the shelf life this app will
have after November 6th, we may not get to some of these.
- Re-work the state navigation on the homepage so that it plays nice
with the browser's history. We did a simple ajax query on load, but a
better way to do it would be to change the hash to contain the state
"http://candidata.us/#VA", and then pull in the list of candidates.
This would also only initiate the geoip lookup if the hash is missing.
- Add a simple way to navigate to opponents from a candidate's page.
- Allow users to navigate to other state races from a candidate's page.
- Get more candidate information, ideally something that can provide us
Photos of each candidate. Other apps at the hackathon had this, but we
didn't find the API in time. Sunlight provides photos for Members of
Congress.
- Pull in statements made by a candidate via WaPo's Issue API, maybe
running it through the Trove API to pull out categories, people, and
places mentioned in the statement.
- Use the Trove API to organize or at least tag latest news stories and
fact checks by Category.
Overall, I'm very happy with what we were able to build in 24 hours.
The hackathon also exposed me to some cool ideas and approaches,
particularly the visualizations done by some teams. I wish I'd had
spent a little more time meeting other people, but my energy was really
focused on coding most of the time.
Please check out CandiData.me and let me know
what you think either via email or in the comments below.