The Top 100 Board Games

A haphazard pile of meeples - roughly human-shaped game pieces - in assorted colors

The Problem

The /r/boardgames subreddit maintains a list of the community’s favorite games, as determined by people rating things on BoardGameGeek (BGG). Alas, months had gone by without an update. The script that produced it still existed, but the person who knew how it worked had moved on. It was content the community valued highly so I thought I’d take it on.

A list of the boardgame subreddit's 10 favorite games, complete with a rank and community ranking
A previous implementation of the Top 10 list in the subreddit sidebar

The Process

In my mind, this was actually two challenges: the code and the experience.

The Code

Usually, the UX comes first, but I was a team of one. Offloading the implementation to a developer wasn’t an option. It seemed prudent to figure out whether I could get/manipulate the data at all and to what extent in order to ground my thinking. Constraints can be your friend, right? (Besides, I already knew the “designing” would really just be tweaking current implementation. Reddit as a platform has a lot of constraints, too.)

I did try to figure out the Python script (even tried to feed it mice) but I don’t know a lot about Python and the code was not well commented. However, I did (and do) know R, and had some knowledge of the BGG API. I knew I would have to grow into the project a little, and I hated setting aside something that already worked, but I could see the shape of a solution in my head so I decided to re-write the script from scratch.

I started by isolating the steps involved:

  1. Get the BGG usernames of all the people in the subreddit.
  2. For each of these, get their collection of ratings.
  3. Aggregate these ratings with some kind of threshold.
  4. Gather interesting details about these rated games.
  5. Rank them (and compare the rankings to the previous rankings)
  6. Profit Post to the community

I very quickly learned that “big data” can be a lot smaller than you think when you’re working with commodity equipment. The portion of the community on BGG is ~6000 people with ~300k individual game ratings. It doesn’t sound like a lot, but my laptop’s memory store and the rate-limited API were, uh, things to contend with. So I worked with a much smaller subset while I was testing things out.

It took me a few weeks of tinkering every night, wrestling with API quirks and memory issues, but I managed to make a script that reliably produced the same information (and then some) that the old one did. (With much better comments!)

The Experience Challenge

After a little thought, drawing on my own experience with the community as a form of low-rent user research, I realized that what these lists were really lacking: discussion.

Top xx lists are a very common feature of the board game community. Nearly everyone who runs a YouTube channel or blog on the subject eventually produces a list of their favorite games. Some do so on a regular basis. (This probably comes as no surprise if you spend any time at all digging into movies, video games, or music.)

These lists, in whatever form, are frequently posted to the subreddit and are almost always popular discussions. The sidebar Top 10 list is highly visible, and I’m sure would be engaging for lots of folks… but it was mute. This had to be fixed.

The Product

I made a  GitHub repo for the project. I’m no Margaret Hamilton, but it works and is well-organized and commented. I’m sure that the same thing that happened to the previous script is the same thing that will eventually happen to this one, but an attempt to make sure future people can use it seemed like the right thing to do.

As far as the actual lists, as you can see above there are some very subtle changes to the layout (which I’m sure will make no actually different but, hey, I’m happier). On top of which, these are now updated at the end of every month and I produce an accompanying post so that there can be an open discussion of how the ratings have changed since last time. The first such post proved to be pretty popular and resulted in a quite a bit of interaction.