Skip to content
Julien Gosset
Search
Go back

Building a WoW launcher in Python: a weekend project

The context: I still play private-server World of Warcraft occasionally, and every launcher available is either a) sketchy freeware compiled in 2014, or b) a bloated Electron app that ships a whole browser to run a login form. I figured I could do better in a weekend.

Turns out I could — but the interesting part wasn’t the launcher itself. It was everything I had to learn about how Blizzard actually ships its game data.

What a launcher actually does

Boiled down to essentials, a WoW launcher does five things:

  1. Check the local game version against a remote manifest.
  2. Diff missing / outdated files and download only what’s needed.
  3. Rewrite realmlist.wtf to point at the private server.
  4. Launch Wow.exe with the right command-line flags.
  5. Not accidentally break the client’s cryptographic patch signatures.

The first four are trivial. The fifth is what ate my Saturday.

DBC files, MPQ archives, and the joy of legacy binary formats

Blizzard’s game data lives in .MPQ archives — a proprietary compressed container format that hasn’t fundamentally changed since Diablo II. Inside those archives, the game’s tabular data (spells, items, quests, mob stats) sits in .DBC files, which are Blizzard’s homegrown flat-file database format.

Both formats are documented, kind of, in reverse-engineering wikis maintained by the private-server community. “Documented” here means “someone in 2011 wrote down what they figured out from a hex editor”. Fields drift between game versions. Field types are guessed. Client hotfixes silently reformat entire tables.

The most useful thing I did was port a small MPQ + DBC reader to Python instead of relying on the C libraries everyone links to. It’s slower, but I can actually debug it — and reading DBC row-by-row from Python was, unexpectedly, the most fun I’ve had coding this year.

What I learned about building for exactly one user

The freedom of writing something that only I will ever run is genuinely underrated. No config file. No CLI arguments. Hard-code the paths. Delete the try/except. Ship it to your own Downloads folder.

Every professional habit I’ve built over the years — abstraction, configurability, error handling — was actively slowing me down. The moment I gave myself permission to write throwaway code for one user (me), the launcher went from “80% done, buggy” to “done, works” in one evening.

I might write a proper post on the DBC reader itself. There’s something oddly satisfying about parsing 20-year-old binary data on a laptop that could run the game 400 times over.



Next Post
How I built an AI prospecting workflow with Clay