A web application for planning and managing World of Warcraft Classic raid compositions. Build raid groups by assigning characters to slots, manage boss-specific assignments, and share compositions via URL.
- Composition Builder - Assign characters across multiple raid groups (25-man), filter the roster by rank, class, spec, and role, copy the composition as an image to clipboard
- Shareable URLs - Raid compositions are serialized into query params so you can share a link directly
- Boss Assignments - Per-boss assignment views with automatic role-based logic and one-click MRT addon note generation:
- Raid-wide - Generic cross-raid assignments
- T4 (Gruul's Lair / Magtheridon's Lair) - High King Maulgar, Gruul the Dragon Killer, Magtheridon (tank assignments, Manticron cube clickers, interrupt rotations)
- SSC (Serpentshrine Cavern) (assignments coming soon)
- TK (The Eye) (assignments coming soon)
- Blackwing Lair (disabled)
- Ahn'Qiraj 40 (disabled)
- Naxxramas (disabled)
- BIS - Best in Slot gear lists per spec
- Characters - Roster view grouped by class with WCL performance rankings, linked to individual character pages
- Warcraft Logs Integration - Character performance percentiles and gear are pre-fetched via the WCL API and bundled at build time
- Players - Roster view showing all players and their characters
- Calendar - Raid schedule pulled from Raid Helper event data
| Class | Roles |
|---|---|
| Warrior | Tank, Melee DPS |
| Paladin | Tank, Healer, Melee DPS |
| Hunter | Ranged DPS |
| Druid | Tank, Healer, Melee DPS, Ranged DPS |
| Rogue | Melee DPS |
| Warlock | Ranged DPS |
| Mage | Ranged DPS |
| Priest | Healer |
| Shaman | Healer, Melee DPS, Ranged DPS |
- Angular 21
- TypeScript 5.9
- SCSS (Sass module system -
@use/@forward) - html2canvas - screenshot to clipboard
- Font Awesome 6
- Node.js ≥ 20.19 or ≥ 22.12 (required by Angular 21)
Install dependencies:
npm installStart the development server:
npm startOpen http://localhost:4200/ in your browser. The app reloads automatically on file changes.
Production build:
npm run buildBuild for GitHub Pages deployment:
npm run build:gpagesBuild artifacts are output to the dist/ directory.
Character rankings and gear snapshots are fetched from the Warcraft Logs API v2 and baked into a static TypeScript file before the Angular build. This keeps the app fully static (no runtime API calls).
Create a .env file in the project root:
WCL_CLIENT_ID=your_client_id
WCL_CLIENT_SECRET=your_client_secret
WCL_DEFAULT_REALM=gehennas
WCL_DEFAULT_REGION=eu
# Optional
WCL_ZONE_ID=1012 # Filter rankings to a specific zone
WCL_SKIP_GEAR=false # Set to "true" to skip gear fetching (faster)
WCL_API_DELAY_MS=300 # Delay between API calls in msThen run:
npm run bake:wclThis writes src/app/_data/wcl-baked.data.ts, which is imported by the app at build time. The script is a no-op if WCL_CLIENT_ID is not set, so the existing baked file is preserved.
Character profile data (race, class, gender, level, active spec, item level, avatar) is fetched from the Blizzard Battle.net Profile API and baked into a static TypeScript file before the Angular build.
Add to your .env file:
BNET_CLIENT_ID=your_client_id
BNET_CLIENT_SECRET=your_client_secret
BNET_REALM_SLUG=gehennas
BNET_REGION=eu
# Optional
BNET_GAME_VERSION=classic # "retail" | "classic" | "classic1x" (default: "classic")
BNET_BATCH_SIZE=10 # Characters per concurrent batch (default: 10)
BNET_BATCH_DELAY_MS=500 # Delay between batches in ms (default: 500)
BNET_DEBUG=false # Set to "true" to log raw API responsesThen run:
npm run bake:bnetThis writes src/app/_data/battlenet-baked.data.ts, which is imported by the app at build time. If a character fetch fails and existing data is present, the existing entry is preserved. The script is a no-op if BNET_CLIENT_ID is not set.
npm testUses Karma with Jasmine.
The app is deployed to GitHub Pages at: https://nick-kravchenko.github.io/wow-raid-composition/