v1: Very basic prototype with no coding considerations
v2: Build upon v1 but redo the code so it's cleaner
v3: Clear up code and add all features