Gaming.WithAPlan
Game backlog clearing planner. Also my backend-comparison testbed.
Overview
I have a lot of games, purchased either through Steam Sales or Humble Bundles. I haven't played half of them half as much as I should like; and I have played less than half of them half as much as they deserve. I needed some help getting started.
I decided to write a tool to help organize my backlog. Originally, I was going to sort by Nearness to Completion, but that ended up not being possible, at least with the Steam API. Instead, I sort by peer pressure - it calculates which games you are missing achievements from, prioritizing ones a lot of people have first.
The backend experiment
More recently the interesting part has been the backend. It now runs two implementations side by side — one Python (Flask), one Go — both held to a single OpenAPI spec. CloudFront routes api/python/* and api/go/* to a Lambda Function URL for each, so I can compare the two against the exact same contract: ergonomics, cold starts, how painful the spec is to satisfy in each language.
Current Status
Prototype usable, more work to do. Gaming.WithAPlan
Core Problems
- Too Many Games!!!
- I wanted a real project to run a Python vs Go backend bake-off on
- I wanted an OpenAPI spec to be the source of truth, not an afterthought
- I wanted to experiment with the Steam API (and eventually other game library APIs)
Lessons Learned
- The Steam API is surprisingly limited, especially for statistical data. I actually talked to some of their API developers about it — it's because people use it to "derive Valve's internals" and invest accordingly. I had to do all the statistical analysis on my side.
- An OpenAPI spec that two backends must satisfy stays honest. When only one implementation exists, the spec quietly drifts to match the code.
- Flask is fine once it's running; the Go service was quicker to get cold starts under control on Lambda.
- Using a Lambda to build a reverse proxy in CloudFront was the first time I felt like an AWS developer.
Current Objectives
- Bring the Go backend to full parity with the Python one.
- Add persistence so you don't have to recalculate your peer-pressure scores every time.
- Once persistence is there, build the "Find my soulmate" feature — it finds someone with a similar library so you can play together.
Tools
- React / Vite
- Python (Flask)
- Go
- OpenAPI
- AWS Lambda (Function URLs)
- AWS S3, Route 53, CloudFront
- Terraform
- GitHub
