🇧🇷 Versão em português · Latest release: v0.3.0
Warning
Dwow is still under active development. Features, protocol details, configuration, and project structure may change significantly over time. Future updates may require additional setup or migration steps.
Note
Unofficial server compatibility: Dwow will likely also work on private servers that use a compatible game client and addon APIs. The main limitation is the 3D character render: characters from unofficial servers do not exist on Battle.net and therefore cannot be found through Blizzard's API. In this case, Rich Presence will continue using the bundled race and gender portraits as a fallback. Compatibility is not guaranteed when a server modifies the client or its addon APIs.
Rich Presence for World of Warcraft Classic and Project Ascension that shows on your Discord profile — in real time — what your character is doing: fighting a boss, queued for a dungeon (with the actual LFG eye icon), flying on your own mount, fishing, dead after a wipe… over 45 distinct states, in English or Portuguese.
Important
Project Ascension is officially supported starting with Dwow v0.3.0.
Download the dedicated Dwow-Addon-Ascension package and select
"client": "ascension" in the companion configuration. This support was
tested live on the Warcraft Reborn realm using the Dwow addon inside the
Ascension 3.3.5 client, including addon loading, pixel export, window capture,
fractional pixel decoding, character state, AFK flags, and Discord updates.
Asset status: Ascension-only custom classes do not have dedicated Discord art assets yet. Their game data can still be exported, but the Rich Presence may use a generic or fallback image until those class assets are added.
Dwow uses one shared addon and companion core with a small profile for each game client. Releases generate separate, ready-to-install addon archives:
| Client | Addon package | Companion profile |
|---|---|---|
| Classic Era / Hardcore / Season of Discovery | Dwow-Addon-Classic-Era-* |
classic_era |
| Anniversary | Dwow-Addon-Anniversary-* |
anniversary |
| Burning Crusade Classic | Dwow-Addon-TBC-Classic-* |
tbc_classic |
| Mists of Pandaria Classic | Dwow-Addon-MoP-Classic-* |
mop_classic |
| Project Ascension (3.3.5) | Dwow-Addon-Ascension-* |
ascension |
Ascension support uses the same protocol and Rich Presence code, with a legacy addon manifest, older API fallbacks, its own window title, and adaptive fractional-pixel decoding. Battle.net character renders are unavailable for unofficial-server characters, so local race/gender portraits are used. Testing for v0.3.0 was performed on the Warcraft Reborn realm with the Dwow addon installed and running in Ascension. Other Ascension realms and custom classes may expose additional APIs, states, or assets that still need coverage.
Rich Presence examples for Alliance and Horde characters, including portrait, class, level, XP, mount, location, and session time.
- The Discord card does not update every second. The addon collects and exports character state once per second, but the companion enforces a minimum interval of roughly 15 seconds between updates. Discord also applies its own caching and propagation delay, so changes may take a few seconds to appear on the profile.
- The 3D character render is not updated in real time. The image comes from the Battle.net API, which usually refreshes the character only after logging out and allowing Blizzard to synchronize the data. Recent equipment or appearance changes may continue showing the previous render.
- Very short states may never appear. An activity that starts and ends within Discord's update window can be replaced by the next state before it reaches the card.
- The addon cannot force instant updates. This limitation exists outside Lua: the addon continues transmitting pixels normally, while the companion and Discord control when Rich Presence is published and displayed.
┌────────────────────┐ encoded pixels ┌──────────────────────┐
│ WoW Classic │ ──── (on screen) ─────► │ Companion (Python) │
│ + Dwow addon │ │ capture → decode │
│ (official API, │ │ → Rich Presence │
│ zero injection) │ └──────────┬───────────┘
└────────────────────┘ ▼
Discord
Why pixels? WoW addons are sandboxed: no network access, no file writes during play. The addon draws character data as a tiny strip of colored cells (3 px tall) in the top-left corner; the companion reads that strip by capturing the game window — the same technique CraftPresence uses. Details in docs/PROTOCOL.md.
Safe: the addon only uses the official addon API; the companion only reads the screen — no injection, no memory reading, no input automation. Never combine this project with input automation: that is Blizzard's red line.
- Windows 10/11, Discord desktop app running
- Python 3.10+ with
pypresenceandPillow(pip install pypresence pillow) - WoW in windowed or borderless mode, anti-aliasing (MSAA) disabled
Download the ZIP for your game flavor from GitHub Releases,
then extract the Dwow folder into your AddOns directory. You can also copy
addon/Dwow directly when installing from source:
When installing from source, copy addon/Dwow into the AddOns directory and
copy the matching manifest over Dwow.toc:
World of Warcraft\_classic_era_\Interface\AddOns\Dwow (Classic Era / Hardcore / SoD)
World of Warcraft\_classic_\Interface\AddOns\Dwow (MoP Classic)
World of Warcraft\_anniversary_\Interface\AddOns\Dwow (Anniversary)
C:\Ascension\Launcher\resources\ascension-live\Interface\AddOns\Dwow (Ascension)
| Client | Source manifest |
|---|---|
| Classic Era / Anniversary | Dwow_Vanilla.toc |
| TBC Classic | Dwow_TBC.toc |
| MoP Classic | Dwow_Mists.toc |
| Ascension | Dwow_Ascension.toc |
In game, /dwow toggles the export and /dwow status prints the current
payload (useful for troubleshooting).
-
Go to https://discord.com/developers/applications → New Application. Name it
World of Warcraft Classic(this name shows as the game title). -
Copy the Application ID.
-
(Optional, for portraits) Under Rich Presence → Art Assets, upload your art with keys
wow_classic,class_<class>andrace_<race>_<male|female>.All 38 upload-ready images are available in
assets_discord, including the required keys and Developer Portal setup instructions.
cd companion
copy config.example.json config.jsonEdit config.json:
| Key | Meaning |
|---|---|
application_id |
your Discord Application ID (required) |
client |
classic_era, anniversary, tbc_classic, mop_classic, or ascension; selects safe defaults |
window_title |
optional override for the selected client's window title |
language |
"auto", "pt" or "en" — card language; auto detects Windows |
log_language |
"auto", "pt" or "en" — operational log language |
capture_method |
"auto" tries fast BitBlt and falls back to PrintWindow |
clear_after_seconds |
delay before clearing after the WoW window closes |
stale_clear_after_seconds |
longer tolerance for temporary invalid captures while WoW remains open |
infer_afk_after_seconds |
infer AFK after this long unfocused when a minimized window cannot be captured (0 disables) |
use_race_image, show_realm, show_guild, show_xp, show_gold |
toggle card details |
bnet.* |
optional: your character's 3D render via the Battle.net API — create a free client at https://develop.battle.net, fill client_id/client_secret, set enabled: true, pick region (us/eu) and flavor (era/mop/anniversary) |
For Project Ascension, set "client": "ascension". This selects the
Ascension window automatically and disables Battle.net rendering.
Never commit
config.json— it holds your secrets and is gitignored.
python main.pyBefore running normally, check the complete setup with:
python main.py --diagnoseThe diagnostic validates the configuration, WoW capture, pixel protocol and Discord connection without publishing a Rich Presence card.
With WoW and Discord open, your profile updates within ~15 s (Discord's rate limit). The presence clears automatically ~60 s after the game closes.
Auto-start (recommended): register a hidden logon task so the companion is always waiting for the game — run once in PowerShell:
cd companion
.\install_autostart.ps1 # installs and starts (invisible, logs to companion.log)
.\install_autostart.ps1 -Remove # uninstalls- 45+ states with priority ordering: death/wipe, boss encounters (with HP%), PvP flag/orb carrying, drowning and fatigue timers, taxi flights by faction, professions, auction house, mail, vendor/repair, duels, resurrections, idling…
- Dungeon/raid queue: the real LFG eye texture appears as the small icon while queued (LFD/RF on MoP, LFG Tool on Era/Anniversary, BG queues everywhere); a queue pop takes over the card for a few seconds.
- Your actual mount: its name in the phrase and its own icon in the small slot — your character always stays as the large image; live states (flying, forms, death…) show as the small icon.
- Druid/shaman/priest/lock forms: bear, cat, moonkin, travel, flight, ghost wolf, shadowform… each with its own icon, updated live.
- 3D character render (optional, Battle.net API) as the card image, with race portraits as fallback.
- Robust capture: lazy BitBlt/PrintWindow fallback, game-window matching, DPI awareness, viewport-addon relocation, frozen-game detection and checksum.
- Diagnostic logs: capture method, failure/recovery episodes, AFK transitions, clear reasons and a five-minute health summary, localized from Windows.
| Symptom | Fix |
|---|---|
| Read failures/checksum errors | auto capture preserves the last presence and tries the fallback; check /dwow status, MSAA and windowed/borderless if failures persist |
| Presence never updates | Discord desktop must be running before the companion; check application_id |
| Blurry/outdated render | the Battle.net render only refreshes on logout; brand-new characters 404 for a few hours (race portrait is used meanwhile) |
| Queue eye missing | /reload after updating the addon; LFD/RF queues exist on MoP only |
Personal project, not affiliated with Blizzard Entertainment or Discord. World of Warcraft and its assets are © Blizzard Entertainment. The addon only reads official API data and renders pixels; no warranty is given.
See CHANGELOG.md for version history and upgrade notes.

