Mariano Gappa's Blog<br>9 months in: building an advanced StarCraft reporting tool with Go & Claude<br>Jul 14, 2026
How it started<br>When I was 15, I met my best mate at a LAN party in downtown Buenos Aires, right as the StarCraft: Brood War craze was catching fire. We fell in love with the game on the spot.<br>It’s 2026 now, we have jobs and live on opposite ends of the world, but we still Zoom almost every weekend to play and mess around. And through that decades-long passion came an idea.<br>The idea, on a weekend call<br>“What if we could just ask an AI in natural language about the game we’d just played?”<br>e.g.:<br>Does this guy always go Carriers?<br>Did all 3 of them ally against us last game?<br>What’s the average time I should have turrets against this particular Zerg?<br>The natural shape for that is an MCP server<br>, but what do we feed to it?<br>Brood War writes a replay file (a .rep) after every game, which lets the game client play the game back to you. But MCP doesn’t read StarCraft replay files.<br>So I went looking for parsers, and András Belicza’s screp<br>was the natural choice (which is already written in Go).<br>Thus, screpdb was born:<br>Parse replays using screp<br>Structure the output and ingest it onto a relational database (SQLite)<br>Put an MCP server in front<br>The first commit<br>landed on September 30th, 2025 .<br>From chatbot to reporting tool<br>Then we actually used it for a couple of sessions, and something felt off. Typing questions to a chatbot was an impedance mismatch.
The first version: Claude querying screpdb over MCP and drawing its own chart. Powerful, but asking a chatbot to rebuild every view, every time, got old fast.<br>What we wanted wasn’t a conversation. It was a reporting tool.<br>However, that’s a much bigger build. Before I’d get into that, I’d want to see what options already existed.<br>The tools that already existed<br>BWChart<br>is the pioneer tool we all used since 2003. Its last update was in 2017, after which SCRChart (below) superseded it. Its Liquipedia page<br>has the full history.
SCRChart<br>is the 2019 heir to BWChart, though it seems to have been abandoned later that same year. Being a Java application, it’s cross-platform.
RepMastered<br>is András Belicza<br>’s excellent web database and in-browser analyzer, built on his screp parser, which this whole project stands on (intro thread<br>). It holds over 100 million replays<br>and is fully featured:<br>Bulk-upload and share replays, even whole folders at once.<br>A huge, filterable database: search by player, map, matchup, or tag.<br>In-browser analysis: APM/EAPM, hotkeys, build-order and strategy charts, and an animated map replay.
vespene.gg<br>is the newest arrival (2026) and the boldest: according to its creator, dethsc, responding to my question in the intro thread on TL.net<br>, it’s a fresh reverse-engineering of SC:R’s binaries, which lets you upload a replay and watch the game in-browser, with all kinds of real-time metrics, an AI coach, a replay database, tournaments, Twitch streams and more.
These are great tools. But what we needed wasn’t quite covered. We wanted to see higher-level semantics during our play sessions.<br>But before building the reporting tool, I had to learn how tricky it was to get semantics from a replay file.<br>Why StarCraft replays are secretly, wonderfully hard<br>A StarCraft replay does not record what happened. It records only the commands : the stream of orders each player issued.<br>The engineering of the game engine and replays is fascinating, but it’s not the focus of this article; if you’re interested, I vibe-coded this didactic site that goes deeper into it while staying approachable: Inside Brood War
In short: in order to know what really happened in the game, you’d need to run the commands against the game engine, but as of SC:Remastered, there’s no headless API to do this (BWAPI & OpenBW exist for pre-remastered but come with tradeoffs; dethsc’s reverse-engineering of Remastered is closed source).<br>This means that certain things just cannot be answered from replays alone:<br>How many resources does each player have over time? Is a player supply-blocked right now?<br>A unit was created, but was it killed later? Was a building destroyed?<br>A unit was ordered to go somewhere, but was it able to arrive there? When?
And the commands themselves are noisy:<br>Spam. Plenty of orders were recorded but rejected by the engine (not enough resources, cancelled builds, a worker killed on the way), and we often can’t tell which ones actually happened.<br>Missing data. Commands that ought to carry coordinates, or a source unit or target, frequently just don’t.<br>Ambiguous units. Units are identified by a recyclable 16-bit “unit tag”, not a type, so it’s often impossible to say which unit did what.<br>But then AI started getting so good, so fast, that I could prototype things that would have been impossible back when BWChart and SCRChart were...