About.
PlayVessel started as a personal solution to a very real problem I was having, I buy games faster than I can play them. I wanted a way to track, categorize, and actually finish them. So rather than just playing the video games more, I started another big project 😂! What began as a simple idea to help me organize my games, quickly grew into the largest and most ambitious app I've ever worked on. It taught me a lot more than I expected, from managing a large codebase to handling boring business stuff like API keys and emails.
Challenges.
PlayVessel was my most complex project to date, and it pushed me hard technically. I started building it with plain React + Vite, fully client-side, which worked at first, until performance tanked as the site grew That bottleneck led me to dive into server-side rendering, which is how I developed my love for Remix.run (now React Router v7). That framework completely changed how I build websites and I've been using it, almost exclusively ever since.
Another major challenge I dealt with was the IGDB API, not because it's bad, quiet the opposite, but because of the sheer amount of data that becomes available to you. Managing such large amounts of data forced me to rethink my entire approach to ingestion and processing. I overhauled that system multiple times, learning a ton about concurrency, batching, and efficient database operations in the process.
Aftermath.
Looking back, PlayVessel became my best work, not because it succeeded in user count or revenue, but because of how much I learned building and running it. It wasn't just about the site or product itself, it was about the entire process of building it.
Ultimately, though, PlayVessel didn't make sense to keep running indefinitely. It had a small handful of users, no monetization, and hosting costs that despite being drastically reduced with the 2.0 version, would add up over time. The concept of a backlog tracker doesn't have many paths to monetization outside of ads or donations, and even then it's a very niche market that very much lends itself to subsization of a larger service.
Rewrite (v2).
Before shutting it down, I spent a couple months rewriting PlayVessel from scratch using Typescript, using everything I'd learned since v1.
This rewrite was a complete overhaul of the entire project and brought with it serverless architecture with things like game ingest and webhooks being split off into their own microservices.
Performance and maintainability were top priorities this time. The UI is faster, cleaner, and much easier to extend. The biggest wind by far was the search system, which was actually one of the leading reasons for the rewrite. Now powered by Typesense, it is much faster, brining query times from 10+ seconds to a max of 10 milliseconds! To add more salt to the wound those astronomical query times of the original version were without filters! The new search system allowed for filtering across many different categories such as genre, platform, theme, and more. Even with the most complex filters you rarely saw more than 10ms search times. On average, search latency was around 3ms (excluding negligible network time thanks to Cloudflare's global network).
This version of PlayVessel represents what I always wanted the app to be, a fast, responsive, and easy to use backlog tracker. Even though it's now offline, I'm proud of it. It's proof of how much growth I've had since v1, and even more so before I even thought of the project.










