Gazebo (code)

Summer 2014


Axis&Allies (code)

Summer 2013


EasyAuth (code)

Winter 2013


TVTracker (code)

Spring 2013


2EZ (Url Shortener) (code)

Spring 2014


RTFA (code)

Winter 2013


PopOut (code)

Spring 2014



I built this while putting off choosing classes. It helps you choose classes.

How to use

  • Click the red link to change between calendar and requirements modes
  • Click and drag to move courses between requirements or semesters
  • Type in the box to search for and add new courses
  • Click a requirement name or TODO box to see a list of options
  • Right click a course to get its description + offered terms


Axis & Allies is a tabletop minatures game I played a lot as a kid. This is my HTML5 tribute to that game: it's animated, multiplayer, completely free, and (I think) a lot of fun, so give it a try! This is probably my largest solo project.

Tech stuff: - Pure javascript (both client and server) - Multiplayer over the web, with both synchronous and asynchronous gameplay - Heavily database-driven: features autosave and instant replays - Infrastructure built with Meteor.js, an awesome (and as of writing half-finished) web framework


  • Draft Phase: Click a unit's name to see its card. Choose your units using the number boxes in the cards.
  • Deploy Phase: Click on the board to deploy a unit; click again to take it back.
  • Movement and Assault Phases: Click a friendly unit to select it, then click an empty hex to move there. Or, right-click an enemy unit to inspect it.
  • Assault Phase: with a unit selected, enemies within attack range will be highlighted. Click an enemy unit to attack.

How to Play

Axis and Allies is a turn-based strategy game for two players. The game is played in rounds, and each round has several phases. At the start of each round, one player is chosen randomly to play first during each phase of that round.

Setup Round

  • Draft Phase: Build an army.
    • Each unit has a cost, and you have 100 points to spend.
  • Deployment Phase: Place your troops.
    • If you are the first player to deploy, you can choose to deploy in the East or West.
    • Each unit must be placed within 3 hexes of your border.

Play Rounds

  • Movement Phase: Move your units.
    • Each unit can move once during your movement phase.
    • Vehicles are slower moving through Forests and Hills, and cannot move through Marsh.
    • No units can move into Ponds.
  • Assault Phase: Attack or move again.
    • Each unit can either attack or move (but not both) during your assault phase.
    • The Attacks table on each unit's card shows the number of attack dice it gets against each unit type. The number of attacks decreases when you attack from farther away.
    • An attack succeeds on a roll of 4+. The number of successes determines the attack's effect:
      • Less than enemy's defense: you missed.
      • Equal to enemy's defense: one hit.
      • Greater than enemy's defense: two hits.
      • Double the enemy's defense: three hits.
    • Hits from multiple attackers are added together.
  • Casualty Phase: Hits from assault phase take effect.
    • 1 hits: Soldiers and vehicles are disrupted. Disruption lasts for 1 turn, preventing movement and weakening attacks (-1 to each die)
    • 2 hits: Soldiers and damaged vehicles are destroyed; undamaged vehicles take damage. Damage is a permanent -1 to movement range and attack rolls.
    • 3 hits: Undamaged vehicles are destroyed. Destroyed units are removed from play.
    • Units in defensive terrain (all units: Towns, Forests, Hills; soldiers only: Marsh, Shell Holes) can take cover, reducing multiple hits to 1.
    • Soldiers have a 50% chance of taking cover. Vehicles have a 33% chance of taking cover.


  • Once 7 rounds have passed, you can win by controlling the objective. If only you have units on or immediately next to to the objective (the crosshairs), you win!
  • Once 10 rounds have passed, you can also win by military superiority. If you have more points' worth of units still in play than your opponent, you win!


A little daemon that uses Twilio and Mailgun to intercept SMS messages and forward them to other phone numbers and email addresses. Use it to make Stanford 2Factor authentication less of a hassle!

Tech Stuff

  • Ruby with Sinatra
  • Twilio API (10/10, would API again)


  • Integrate Google Authenticator or similar. This would shave a second or two off the code generation time.


My first major, finished(ish) personal project. Pumped!


  • Create an account
  • Start tracking existing TV shows--or add your own!
  • Read plot summaries and actor lists
  • Keep track of which episodes you've watched, and when the next one's airing
  • Enjoy some snazzy jQuery

Why I made it

I got to play around with APIs, somewhat-complex jQuery, and deal with building a full rails app from start to finish.

I also actually use this to keep track of all the TV shows I [never have time to] watch --and I hope that someone else will too. That'd be exciting.

How it works

TVTracker uses two APIs to gather the information it needs: * TVRage for the episode lists * OMDB for the posters and show-level information like plot summaries

Url Shortener

A simple link shortener hosted at my personal website. This was a fun little project, inspired by my realization that is the same length as

The shortening method

I wanted the links to be very short but still look random, so they're not really very random. Links are 3 characters, and must include at least one letter and at least one number. They're case insensitive, so you can read them over the phone or something.


  • Private links, track with either email auth or password
  • Track request referrers


(Read the effing article! Form your own opinions!)

A simple chrome extension that hides comment threads on news aggregator sites (currently HackerNews and Reddit) until after you've read the article.


On these sites I have an unfortunate habit of going to the comments to get the "gist" and then skipping the article entirely. I'm trying to break this habit... and spend less time in comment sections in general.

And I wanted to try building a chrome extension. (It was fun. B+!)


As it turns out, for security reasons you can't actually use js to determine whether a user has visited a link. So this extension manually keeps track of your last few hundred pages visited from HN/Reddit. In practice this works well enough.




Get it from the Google webstore.


A tiny chrome extension that adds a 'Pop out tabs to right' button to your menu bar. Click it to move your current tab and all tabs to the right to a new browser window.

Feel free to contact me with any questions!

Install PopOut

Get it from the Google webstore.