More than meets the eye.

An Image

This site looks simple, but under the covers there are dozens of intricate components.

My name is Grady Ward, I am from the class of 2016, and before my junior year, I wrote the HTML and CSS which defined this site.

People were happy, times were good.

To keep the site up to date, I had written a barebones content management system in Java.  It was shoddily written, but was easy enough to run that our web guru that year (Sarah Khimjee) was able to easily update the site on her own.

Unfortunately, this was not a permanant solution, because the site needed more flexibility, and needed to have more people have access to editing it.

What I created in its place is one of my proudest coding accomplishments. Here is how the site works, it has two main components:

  1. The site uses Github Pages to support and store most of the pages on the site (everything except petitions).
    1. is served from Github, at the Github repository
    2. This enables the site to be version controlled, simply go to Github to see the site in all of its versions.
    3. When a change is made (via an awesome and intuitive editing interface) the changes are saved to Github as a commit via the OAuth procedures described in the Github API documentation.
  2. The site uses Google App Engine as a mechanism to do basic storage (Stories for News, Profile information, Petition Results), in addition to providing the authentication framework (via Google Email addresses) and of course, the server which spins to keep the site updated when someone wants to edit it.
    1. The App URL is, and that is where you can login (if you have been given permissions) and edit any page on the Student Union Site
    2. The Login authentication provided by GAE makes petitioning really easy.

There is so much going on in this project, so many neat little tricks, that I can't do it justice in a single page.

Heck, it supports image uploads.  Have you ever built an image uploader from scratch? What a rush!

I really enjoyed building this, and I am certain that it will be in use for a long time.

The code is availible on github:

Questions/Comments/Concerns, feel free to contact me at