A self-hosted World of Warcraft character dashboard that uses the official Battle.net API to display stats and track weekly activities across all characters on your account.
- All Characters — Automatically discovers every character on your account
- Account Summary — Total gold, mount count, pet count, and Horde/Alliance breakdown at a glance
- Character Cards — Portrait, level, item level, race, class (with icon), faction, and last played timestamp
- Gold Tracking — Per-character gold and formatted total account gold
- Sorted Display — Characters ordered by level then item level (descending)
- Raid Progress — Current tier raid progress (Normal / Heroic / Mythic) per character
- Dungeon & Delve Info — Mythic+ and Delve completion tracking per character
- Drag-and-drop interface — Drag characters from your roster onto vault slots
- Three activity tracks — Raid (3 slots), Mythic+ Dungeons (3 slots), Delves (3 slots)
- Persistent state — Slot assignments saved to
localStorageand survive page refreshes - Cross-tab sync — Vault state updates instantly across multiple open tabs
- Visual feedback — Character portrait and class icon shown in each filled slot
- Quest-log style layout — Weekly tasks per character in a scrollable list
- Task tracking — Great Vault slots, raid bosses, dungeons, and delves
- Manual check-offs — Mark tasks complete with a click; state persists in
localStorage - Vault integration — Characters dragged into the Great Vault page auto-complete their vault tasks here
- Warband view — All eligible characters (level 90+) shown in one place
- Full profession matrix — All characters as columns, all professions as rows
- Three tabs — Primary Professions / Secondary Professions / All Tiers (expansion history)
- Skill bars — Visual progress bar per expansion tier with the tier name shown on hover
- Maxed highlighting — Skill bars turn gold when a profession is maxed
- All expansion tiers — Shows every expansion's profession tier, not just current
- Secondary professions — Cooking, Fishing, Archaeology and other secondaries tracked separately
- Battle.net OAuth2 — Secure login; no passwords stored
- Parallel API fetching — All character data fetched concurrently for fast load times
- Auto-refresh — Page polls until character data is ready after first login
- Consistent navigation — Shared header with logo and colour-coded nav buttons on every page
- Multi-region support — US, EU, KR, TW regions configurable via environment variable
- Go to https://develop.battle.net/access/ and log in with your Battle.net account
- Click Create Client
- Fill in the details:
- Client Name: anything you like (e.g.
WoW Stats Tracker) - Redirect URLs:
http://localhost:8081/callback - Service URL:
http://localhost:8081
- Client Name: anything you like (e.g.
- Click Save — you will be given a Client ID and Client Secret
⚠️ Keep your Client Secret private — never commit it to a public repository.
Copy the example environment file and fill in your credentials:
cp .env.example .envEdit .env:
BLIZZARD_CLIENT_ID=your_client_id_here
BLIZZARD_CLIENT_SECRET=your_client_secret_here
REGION=eu # us, eu, kr, tw
LOCALE=en_GB # en_US, en_GB, de_DE, fr_FR, es_ES, etc.
PORT=8081go run main.godocker-compose up --buildThen open http://localhost:8081 in your browser and click Login with Battle.net.
| Route | Description |
|---|---|
/ |
Home — character dashboard with account summary |
/vault |
Great Vault tracker — drag-and-drop weekly slot planner |
/roster |
Weekly Roster — per-character weekly task checklist |
/professions |
Profession Tracker — cross-character profession skill matrix |
/refresh |
Force re-fetch of all character data from Battle.net |
- You click Login with Battle.net — you are redirected to Blizzard's OAuth page
- After authorising, the app fetches all characters on your account automatically
- For each character it calls multiple API endpoints in parallel:
- Public profile (level, item level, race, class, faction, last login)
- Media API (character portrait/avatar)
- Protected character endpoint (gold — requires OAuth)
- Profession data (all expansion tiers, primary and secondary)
- Raid progress (current tier, all difficulties)
- Mythic+ and Delve activity data
- Results are displayed sorted by level, then item level
- The Great Vault and Weekly Roster use
localStorage— no server-side storage required
- Your
.envfile is listed in.gitignoreand will never be committed - Credentials are loaded from environment variables only — nothing is hardcoded
- The OAuth token is held in memory only and is not persisted to disk
- No database or external storage is used — all state is stored client-side in
localStorage
| Region | Code | Example Locales |
|---|---|---|
| Europe | eu |
en_GB, de_DE, fr_FR, es_ES, ru_RU |
| Americas | us |
en_US, es_MX, pt_BR |
| Korea | kr |
ko_KR |
| Taiwan | tw |
zh_TW |
"BLIZZARD_CLIENT_ID and BLIZZARD_CLIENT_SECRET are required"
→ Make sure your .env file exists and has your credentials filled in.
Characters not showing after login → The app fetches data in the background after OAuth. Wait a few seconds — the page will refresh automatically.
404 errors for some characters in logs → These are deleted or renamed characters still listed in your account. This is normal and they are skipped automatically.
OAuth redirect error
→ Make sure http://localhost:8081/callback is listed exactly as a Redirect URL in your Battle.net developer portal client settings.
Vault/Roster state lost after restart
→ The Great Vault and Weekly Roster use browser localStorage — clearing browser data will reset them. Server restarts have no effect on this state.
