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.

one enemy frame flash ⑤ 63% 58% Shivv 1 2 3 12 8 15 1:42 ½ ¼ X incap root stun fear trinket 4 5 1 2 3 4 5 health portrait power DR column trinket class-colored bar, percent on the left live 3D model, name at the bottom — casts and CC take it over (see below) mana / rage / energy, percent one slot per CC category, top to bottom: incapacitate · root · stun · fear border = DR tier, number = seconds to reset, corner badge ½ ¼ X PvP trinket cooldown, border red until ready — the whole frame flashes when it pops the whole frame is a secure button — click-cast: left click → target middle → Counterspell right → Polymorph shift + right → Frost Nova portrait takeover Shivv Polymorph 1.4 4 Polymorph cast starts CC lands nothing going on casting sitting in CC priority: breakable CC (prio ≥ 7) > active cast > root · silence · disarm (prio 5–5.5) > model a cast bar turns red and reads "Interrupted" for a moment when you kick it DR tier fresh · full ½ duration ¼ duration immune

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.