Skip to content
Infrastructure

Researching self-hosted game library consolidation

By Victor Da Luz
homelab gaming self-hosted research

My games are scattered. Steam, GOG, Epic, the Xbox app, a PlayStation account, a Switch. I own things I have forgotten about and occasionally almost buy a game twice. I wanted one place to see everything: a single library, ideally self-hosted and web-based so it lives in the homelab next to everything else. Before writing any code, I went looking for a tool that already did this.

To be clear about scope, this is about storefront libraries, the games I have bought across platforms. It is not about the emulation ROMs I manage in RomM, which is a separate problem with a separate tool.

The problem: six libraries, no single view

Every storefront is its own walled garden with its own launcher and its own list. There is no native “everything I own, everywhere” view. The result is a backlog I can’t actually see, which is a strange way to fail at the simple goal of knowing what games I have.

What I wanted was specific: self-hosted, web-based, and able to pull from multiple platforms into one unified list with cover art.

The tools I looked at

I worked through the obvious candidates and a few obscure ones: Playnite, GOG Galaxy 2.0, LaunchBox, the official Xbox PC app, and a handful of smaller trackers.

A few conclusions stood out:

  • Playnite is the best overall. Open source, with plugins for nearly every storefront. The catch is that it’s a Windows desktop application. There is a Playnite Web companion, but it serves a running desktop install rather than standing on its own. “Self-hosted” there really means “a Windows box running Playnite around the clock,” which is not what I wanted in the rack.
  • GOG Galaxy 2.0 is the most polished, with genuinely good official integrations, but it’s proprietary and desktop-only.
  • The rest of the field is desktop-first. Very few true self-hosted, web-based options exist at all.

The API reality

The other half of the problem is where a unified tracker gets its data, and this is where the walls are tallest.

  • Steam has a clean Web API. A free key and one GetOwnedGames call gets you the whole library. Easy.
  • GOG has no official public API. You scrape or import by hand.
  • Epic, Xbox, and PlayStation need developer accounts and OAuth flows before they tell you anything.
  • Nintendo is the hardest of all, with effectively no sane API.

So any “unified” tracker is really a stack of per-platform integrations, each with its own authentication story, and Steam is the only one that is genuinely easy.

The decision

After all of it, nothing fit. The self-hosted web app I wanted did not seem to exist: the good tools were desktop, and the web-adjacent ones leaned on a desktop app behind them. The conclusion I wrote down was that I would probably have to build it myself. A small service pulling from the Steam Web API, enriching metadata from IGDB, storing in Postgres, sitting behind Traefik like every other service. Start Steam-only, add platforms later. I even spec’d out the phases.

That is a perfectly good place for a research spike to land. I knew the landscape, I knew Steam was the only easy integration, and I knew the build was bounded if I scoped it down. Knowing what to build, and how small to start, is the whole point of looking first.

Postscript: I didn’t build it

Months later, when I actually got around to this, I did not write a line of that custom app. A self-hosted tracker I had not found during the research had since shown up, and I deployed that instead, with a detour into maintaining my own security fork of it. That story is in Self-hosting Backlogia, and fixing it before running it.

Research narrows the field. Sometimes the answer you want just isn’t born yet when you go looking.

Related reading

Infrastructure

Self-hosting Backlogia, and fixing it before running it

Backlogia is a self-hosted app that pulls your game libraries from Steam, GOG, Epic and more into one place. Before I would run it I read the code, found four security gaps, and forked it. Then Starlette and a CORS bug had opinions too.

Read
Infrastructure

Self-hosting my ebooks with Kavita

I wanted my EPUBs, PDFs, and Kindle purchases in one self-hosted library I could read from any device. Kavita became that library: a clean web reader, OPDS for mobile, and the work of getting Kindle books in.

Read
Infrastructure

Self-hosting my audiobooks with Audiobookshelf

I wanted my Audible library streamed to my phone, position-synced, and not locked inside one app. Audiobookshelf got a container in the homelab. Here is the deploy, the WebSocket gotcha, the iOS client I picked, and the work of getting an Audible library out of DRM.

Read

Ready to Transform Your Career?

Let's work together to unlock your potential and achieve your professional goals.