The current website design.


In 2010 I began working with the author of the Twokinds webcomic to make improvements to the existing website. Shortly after, a publishing deal was made, and the new publisher requested that the website be redesigned to make advertisements more visible to the viewers.

I continued working with the author to build a new design, which was to the publisher’s liking. In addition to layout and CSS changes, I also made improvements to the small amount existing PHP code and added new PHP code to make the website more dynamic and more easily maintainable. A few years later, the website design was revised to enable high resolution comic pages to be displayed. I took the opportunity to update the CSS and markup to use better practices.

Since then, I have steadily improved upon the website as new web technologies are introduced and as I learn more about existing technologies. To date, I consider this website to be my best work.

A game in play.

Minesweeper Classic

In 2015 I was playing around with an old laptop, and while playing Minesweeper it occurred to me that it might be fun to implement the full game in JavaScript. Over the next few months, on and off, I built this fully-functional Microsoft Minesweeper clone. My goal was to try to replicate the look and behavior of the Windows 2000 version of Minesweeper as much as possible. For the most part, it was easy, but jQuery’s event management made window management challenging.

In the end, I was able to implement all features of Minesweeper, as well as many features of the Explorer shell’s window management. This includes window movement, window stacking, and modal dialogs. If you’d like to try it out, I have a live version available here on my website.

Assignments and exams from multiple calendars are displayed, as well as the current date and time.

iCal Display

While I was at school, I utilized Google Calendar to track which assignment due dates and exams I had coming up, as something of a to-do list. As someone who is motivated by seeing tasks get completed, I grew frustrated with the inability to show that a task had been completed, or was late, without deleting the event.

To fix this, I wrote a simple 10-foot style interface to display upcoming events from only the calendars I wanted. I added the ability to read special tags from event descriptions which would cause events to be shown as complete, or urgent.

The application uses a PHP backend to read an iCal file from Google’s server (though any iCal file would work). The frontent uses JavaScript to periodically reload the calendar content and make necessary formatting changes.

The team rankings, displayed in a


Each year, my old FIRST Robotics team holds an off-season competition called the Michigan Advanced Robotics Competition. MARCStats is an application that I designed to provide real-time statistics for teams at this event. These statistics included current team rankings, match scores, and information about those teams. At the same time, the volunteers at the event could take attendance of teams, show alert messages, and input match data in real-time.

It includes a “television display” which can display rankings and match results in a “10-foot” style format, much like that of a television sports broadcast. This was shown on displays around the event venue to allow attendees to very easily check the current state of the game.

Since game rules—including ranking calculation—change every year, MARCStats was to be designed to be able to calculate match results and rankings dynamically based on an arbitrary configuration.

Eventually I realized that MARCStats could never fully match the rankings generated by the offical scoring system at the event, because at a certain point they are randomized. On top of that, there were just not enough people volunteering at the event to make data input reliable. Unfortunately, this led to the project being scrapped in 2013. In the five years that I worked on it, I learned valuable web development skills, so it wasn’t all bad!

The main UI, featuring relationships between lawyers and their clients, and all available operations.

Cypher Client Manager

In 2012 I was asked by a classmate to assist with the development of a piece of software for a client. In particular this involved refactoring and optimization of the software.

I happily took on the project, which was a utility was designed to manage the relationship between lawyers and their clients. It primarily featured an interface to track transactions and expenses incurred by the client so that the company could easily generate invoices. The application interface was written in Visual Basic .NET and used a MySQL database as backing storage. While working on the project, I introduced HTML invoice generation to make it easy for users to save and print the documents.

Unfortunately, the project was scrapped shortly after my work on it was completed.

The application displaying the safety level and ingredients of a food item.

Gluten Free Shopping

In late 2011, I joined a team of five others to create a mobile app that could help people with gluten intolerance. The app was able to locate nearby restaurants with gluten-free menus, scan food items to check gluten content, create a shopping list, and list ingredients which are known to cause problems for those with gluten intolerance.

While I was involved with the project, I built the server-side API that aggregated data from our database and other databases. I also wrote the algorithm that the app used to determine how dangerous foods are, based on the warning level of each ingredient.

I left the project in 2012 after my position on the team was made obsolete.

The web page displaying the school status and weather data.


While I was in high school, I grew tired of checking multiple sources to check for school closures during the winter. To solve the problem, I created a web application which aggregated closing data from all of the local media outlet websites to display whether my school district was open, closed, or delayed.

Later, I added the functionality to display current weather conditions for the area. It would also highlight conditions which were favorable for a closure or delay, such as fog, snow, low visibility, and extreme temperatures.

Since I am no longer in high school and have very few users left (if any), the application is no longer maintained.

The home page of the website.

Monroe Trojan Robotics

This is the website for my high school FIRST Robotics team. It was the first major website that I created, and it’s the primary reason that I know PHP today. I also wrote the content management system backing.

The website itself is fairly simple. It loads content from a MySQL database and generated HTML files. ScurvyCMS—named while my team was called “iPirates”— is a fully custom content management system that I wrote to back the website. It included a built-in WYSIWYM HTML page editor, file management, site menu management, and even a newsletter subscription system.

Since I have long since graduated from high school, this website is no longer maintained by me.

The score display, featuring rankings, current team positions, and a game timer.

FIRST Lego League Autoscore

FIRST Lego League (FLL) is a youth robotics program targeted at middle school aged children. In the program, teams build and program Lego robots to complete tasks on an obstacle course.

My high school robotics team hosted one of these competitions annually for local teams. At the time, the team rankings were displayed in an Excel spreadsheet, which was updated manually to reflect changes, which wasn’t the most elegant solution. The intent of this software was to read this Excel file and display the rankings cleanly and automatically. It was also able to act as the event’s official match timer and displayed which fields teams were assigned to for the current match.

I had quite a bit of fun with this project, and through it I learned how to use threading and Microsoft Office Interop with the .NET Framework. Unfortunately, my robotics team stopped holding the event before the software was completed, though an incomplete version was used during our 2010 event.