I have this crazed obsession with voting methods. I just wanted to get the
best result when voting on a game for board game night, but maybe I went a bit
too far...
Go Vote Tally
2013-2014
All of my side projects are partially rooted in learning something new. At the
time, I was learning Go and so I wrote a few different voting algorithms in
the Go playground. I started with
Borda, then went
to
instant runoff (IRV)
and then eventually landed on a (highly questionable)
blend of both.
I was tired of sending a survey out and then manually entering the survey data
into my program. I started on the Indifference Engine (source;
old broken site), so
called because it allowed for people's ranked choice votes to have ties in
them. It started out based on my earlier IRV / Borda blend but eventually was
migrated to the
minimax method
.
I spent quite a bit more time on this project and learned about Node.js,
Express, publishing packages on npm, MongoDB, Heroku, unit testing in Mocha,
test coverage in Coveralls, CI/CD on Travis CI, Bootstrap, and using templates
in Dust.js.
No More Voting!
Revonarchy
2015
I got tired of my favorite games never getting picked, so I decided to move
away from voting to let people just pick a game and then rotate who picks the
game each time. The problem that quickly showed up was that some people would
only show up rarely and yet got to pick just as often, Thus Revonarchy was
born. (Source; site
was never deployed)
Revonarchy was relatively short lived but I still learned some great stuff
including Bower, Koa, Less, Gulp, Ramda, and most importantly React.
A Triumphant Return to Voting
Majority Judgment
2019
After a long hiatus, I decided to go back to the drawing board with voting. I
had been reading about this new interesting voting method known as
Majority Judgement
. I implemented a modernized board game night voting site (source; site no longer deployed).
After learning a lot of frontend work in my day job, this project became
focused on learning more backend and devops. I used Elixir's Phoenix Framework
for the backend and deployed it using CircleCI and Amazon ECS. The frontend
was React using nivo for charts, Bulma for CSS, and webpack for bundling.
Gaming Side Projects
Sensors Are Down
2017
I have always loved designing and programming video games, but the problem is
that video games have a lot of art and I do not enjoy making art.
Enter Alexa. I could make an audio only game! I decided to create an Alexa
space combat game (source; never published).
In the end, I created something that just wasn't very fun. I fell into the
trap of making a system too complex considering you cannot see the current
state. I think I had some good ideas and I have follow-up ideas for redesigns
but I shelved the game for now.
Sorry for poor audio quality
This project involved mostly learning various AWS technologies that go into
making an Alexa skill. I used an AWS Lambda which I deployed to using the
Serverless Framework. I also tried typed JavaScript for the first time but
picked a losing horse and used flow-typed.
Instantaneous Card Game
Scala.js
2018
I love card games. I could write about that topic alone forever but suffice it
to say, I had an idea for a collectible card game where you build the deck and
then the game plays itself where the winner is whoever had the better deck.
I made an early prototype in Scala.js (source;
site). I stopped mostly
because the Scala.js ecosystem was incredibly barren with lackluster tooling
and few tutorials which were all broken and out of date.
Unity
2019
Over the holidays that year I discussed the idea with my brother and it was
rekindled. Conveniently, I got a Humble Bundle with a bunch of card art assets
for use in Unity, so I decided to build the game in Unity (backend source
; game not released).
The game client was coded in C# and built with Unity. The backend was coded in
Python deployed to AWS Lambda with the Serverless Framework.
In 2016, I made a couple modified
hashi puzzles
for my wife and friends to solve. I really enjoyed making the puzzles and thought
maybe I could make a puzzle game similar to the
Hexcells series
except instead of modified minesweeper I would do modified hashi.
The idea evolved over time but eventually I started working on a level solver
and accompanying level editor to build some puzzles. (level editor source
).
I spent a lot of time on a 3D Unity implementation of the game but every time
I developed new visuals they would either not look how I wanted or they would
obscure the gameplay elements to the point of being a net negative for the
game. After spending a long time on a
pencil hatching shader
and being disappointed with the results, I took an extended break from the project.
Unlike most of my projects, this project was much more focused on execution
rather than learning new technologies. The level solver was built in node with
a heavy use of lodash for array manipulation. The level editor was just
vanilla ES6 JavaScript using babel to transpile and webpack to bundle. I had a
brief diversion where I learned Rust and started migrating the level editor to
Rust for performance improvements.
Fun with Family
PuzzleSync
2020
My family does an annual get-together where we play games and solve puzzles
together. For the occasion I decided to make a little quiz game, sort of a
cooperative version of sporcle. I used the opportunity to learn Gatsby and
sharpen my skills with websockets (backend source
; frontend has private source and implementation).
It was my first time using any sort of react based static site generator. I
found Gatsby to be annoying to use especially their GraphQL internal api. I
had been working with TypeScript at work a bit and so I started developing all
side projects in TypeScript starting with this project. I deployed the
frontend using CircleCI for CI/CD and Amazon S3 to host. I learned Auth0 for
authentication and authorization.
I used an aws official sample for a chat app as the foundation for my backend.
I deployed the backend using Serverless and included Lambdas, DynamoDB, and
ApiGateway from AWS.
Convention Schedule
2022
The most recent family get-together I decided to make a digital schedule. I
added some functionality where attendees could pick which games they were
going to join (source;
site - use username Will
and give it a few minutes for vercel to start the server before refreshing and
logging in).
I had the pleasure of building this site using Next.js and deploying using
Vercel. It made my life really easy and I definitely want to work with Next.js
more in the future. For styling I used Bulma and as a database I used AWS
DynamoDB.
The museum is its own exhibit
Sveltekit
2020-2022
Last, but certainly not least, I want to discuss the very site you are on
right now. The intention is to have several implementations in different UI
frameworks both as a quick way to learn a bunch of technologies and as a
demonstration of their performance against each other on a simple two page
website.
This museum implementation is built using Sveltekit. For styling it uses
TailwindCSS. It is deployed using Cloudflare Pages. I had never used Svelte
before and liked it much more than I expected to. Truly, I had an excellent
experience with all of these technologies and may use them again on future
projects.