Sheepdog — I shipped a WoW addon.
A bout of nostalgia pulled me back into WoW for a bit — TBCC specifically, where I'd always enjoyed the PvP. Arena is the fun part for me: small teams, fast decisions, high ceiling. But the default UI makes it harder than it needs to be — the thing you need to see most (what the enemy is doing right now) is the thing the game shows least.
So I built an addon.
The Problem
Arena is a 2v2 or 3v3 PvP mode. To make decisions you need to answer, continuously:
- Who is casting what, and can I interrupt it?
- Who's sitting in CC, and when do they break out?
- Which CC categories have diminishing returns left — can I still land a Polymorph, or will it last two seconds?
- Who still has their PvP trinket?
The default enemy frames show health bars. That's it. Everything else lives in combat log scrollback, scattered unit frames, or your head.
What Sheepdog Does
Each enemy gets a square frame. The portrait in the middle is a priority slot: by default it shows the 3D model, but a cast replaces it with the spell icon and a cast bar, and a breakable CC replaces that with a big red countdown. A column on the right tracks diminishing returns per category — green border means a fresh CC lasts full duration, yellow is half, orange is quarter, red is immune. Trinket cooldown sits at the bottom.
Click casting is built in. Left click targets, right click casts your main CC, middle click interrupts, Shift+right click your instant CC. Every binding is editable.
The Tech
The whole thing is Lua, inside the WoW client. No external process, no network — the game dispatches events, you react.
- Event-driven everything.
COMBAT_LOG_EVENT_UNFILTERED,UNIT_SPELLCAST_START,ARENA_OPPONENT_UPDATE. The addon is essentially a reducer over a stream of game events. - No targeting required. You don't have to click an enemy to see their state — DR tracking and trinket detection run off the combat log, so the frames stay accurate for enemies you never target.
- Click-cast rebinding uses WoW's secure action button system — the only way to cast spells from an addon without tripping the taint system.
- Saved variables persist settings across sessions in a per-character Lua table the client serializes on logout.
- Test mode fakes a full arena with configurable opponent counts, so you can tweak layout without queueing.
Shipping
Published on CurseForge. Source on GitHub. The CurseForge pipeline auto-packages tagged releases from the repo.
A couple of hours. I now win more arena games. Worth it.