:: Projects

These are a few side projects that I've worked on in my spare time. Alternatively, you can just go straight to my GitHub account. I've also included some projects I worked on in undergrad here.


This is a tool to help early essay-writers in the writing process. It facilitates starting with an outline, then translating that outline into an essay. The webapp is a split-pane editor with the outline and essay side by side, giving the user an always-present view of the outline while writing the essay.

Once part of the essay is written, the app can automatically analyze both the outline and essay (using some basic natural language processing) to match points from the outline with text in the essay, highlighting to make the connections clear. Users can also manually highlight matching sections. The hope is that this will help keep the outline in mind while the writer works through the essay, making the whole process less of a chore.

A demo is posted here (code here).


OK, so this is mostly just an excuse to learn a little javascript, but here's a neat little out-to-dinner trick: make sure your total comes out as a palindrome. This app asks for the base amount and desired tip percent and finds the closest match to create a palindrome total. That's it. It's live here (code here).


This is actually just a single small bash script that performs batch actions on a set of git repositories. I have a whole bunch that I like to keep in sync between my machines (e.g. config files, code I'm working on) and this is helpful to run before I shut my machine for the night / after work. It makes it easy to pull from all of my repos, or commit and push everything that I was just working on. If you're interested, you can check it out here.

Webcam + AdaBoost

My family has a vacation home in Northeastern Pennsylvania equipped with several webcams hooked up to check if we have any unwanted visitors while we're not there. Simple software exists that starts recording when the scenery changes sufficiently, but it relies on very simple heuristics like how many pixels have changed from one moment to the next. Since these heuristics are not very discriminating, the number of images we must sift through amounts to hours every week. I have adapted the AdaBoost implementation from my undergrad research (see here) to allow a user to train the algorithm to identify only "important" events, for whatever definition of "important" the user would like.

The application provides friendly Qt interfaces for training and testing images. While this is of course more involved then setting up a simple filter, it can greatly reduce the number of images one needs to go through.

The program is implemented in C++. I haven't actively developed this in a while but the code is here for anyone who's interested!


This was my first foray into combining Qt libraries and SQL queries. It provides a simple and hopefully intuitive graphical interface for keeping track of all the food and other items in the kitchen. While admittedly not the most useful application if the program is running on the home computer next to your fridge, I see it as a handy tool for the tablet-toting or smartphone-carrying population. Imagine going to the grocery store and remembering that you meant to check if you still have any oregano. If you have the program installed (and have been updating it) you can check right then and there. Looking way in the future, it'd be great to have an application sync with RFID tags attached to the food items in the refrigerator and cabinets. This would be a less tedious way of keeping track of everything in the kitchen.

The program is implemented in C++. Source code can be found here.

WPA Supplicant Configuration Manager

While the network managers provided by GNOME and KDE are easy to set up, they can be a bit finicky, to say the least. Using the wpa_supplicant utility directly can lead to more robust connections, but has a steep learning curve. Additionally, managing multiple networks in a single wpa_supplicant.conf file is a nightmare. I wrote the WPA Supplicant Configuration Manager to ease the learning curve and make the organization of networks more logical and manageable.

The manager checks which networks are available, and which of those the user has already created config files for. If the user chooses a network without an associated config file, the manager opens up a template for the user to fill out. Otherwise, the config file is copied to the default wpa_supplicant.conf path at which point the user can connect to the new network. The program is a small python script with a nice curses interface to choose a network.

You can download the source here.

Anagram Generator

I am very bad at Scrabble. My mother is very good at Scrabble. Shortly after learning my first bit of C in sophomore year of college, I decided to write a small program to create anagrams from the letters in a Scrabble game. It's coded in C, not C++, so there are no Boost program options, no CMake, no objects to speak of. I grabbed a hash table implementation that I found online, and proceeded to write a rather messy and poorly-organized program. It works, is well commented, and (best of all) passes through valgrind without a scratch. Oh, and it makes Text Twist really easy.

Fun fact: if you lean really heavily on list comprehensions, you can write the basic functionality of this project in 4 lines of python code.

Grab the source if you're interested here.