A comprehensive World of Warcraft Classic companion web app — character armory, raid statistics, server population tracking, and a community trading board.
Built for WoW Classic 20th Anniversary servers, with support for multiple regions and game versions.
- Character Armory — Search characters across KR, US, EU, CN, TW, and OC regions (Classic Era & Classic 20th Anniversary)
- Equipment Display — Full gear layout with quality-based coloring, item tooltips, and enchant info
- Talent Tree Visualization — Interactive ×ばつ4 talent grids for all 9 Classic classes, sourced from Wowhead
- Character Stats — Complete stat breakdown (attributes, melee/ranged/spell, defense, resistances)
- Raid Statistics — Global participation stats for Naxxramas and Ahn'Qiraj 40 by region and phase
- WarcraftLogs Integration — Character parse rankings and raid performance data
- Server Population Tracking — Real-time and historical Alliance/Horde population charts, updated every 15 minutes via an in-game addon pipeline
- Community Trading Board — Item, gold, and service trade listings
- Multi-language UI — 11+ languages supported
This project uses a custom pipeline to collect real server population data — not estimates.
[WoW Game Client]
PopulationTracker addon (Lua)
└─ Reads LFG channel user count every 5 min
└─ Stores in WoW SavedVariables (per account)
│
▼
[Local Machine]
scripts/population/auto-pop-sync.js
└─ Parses SavedVariables .lua files from Alliance & Horde accounts
└─ Filters to time slots where both factions have data
└─ Normalizes to 5-min intervals, deduplicates
└─ POSTs to /api/wow-population
│
▼
[Web / Database]
PostgreSQL (WowPopulation table)
└─ Displayed as Alliance/Horde charts on /population page
└─ 15-minute granularity in the UI
A lightweight WoW Classic addon written in Lua that passively monitors the Looking For Group (LFG) channel population count.
- Samples LFG channel user count every 5 minutes automatically
- Saves data to WoW's
SavedVariablessystem (account-level, shared across all characters) - Supports multiple accounts simultaneously (Alliance + Horde)
- Skips recording when the channel count is 0
- Keeps up to 2,000 records per account (oldest entries auto-deleted)
- Data is written to disk on
/reload, character switch, or game exit
Collected fields per sample: timestamp, character, realm, faction, level, lfgCount
In-game commands:
| Command | Description |
|---|---|
/pt or /pt help |
Show help |
/pt on / /pt off |
Enable/disable tracking (account-wide) |
/pt char |
Toggle tracking for current character only |
/pt now |
Manually record current population |
/pt stats |
View statistics (avg/max/min, session info) |
/pt export |
Print last 20 records in CSV format |
/pt clear |
Reset all stored data |
/pt interval |
Check current recording interval |
Tip: If you play multiple characters at the same time, use
/pt charon alts to disable per-character recording and avoid duplicate entries.
Installation: Copy wow-addon/PopulationTracker/ into your WoW Interface/AddOns/ directory.
Reads the SavedVariables .lua files from each WoW account directory and uploads the data to the web API.
# One-time sync node scripts/population/auto-pop-sync.js once # Preview what would be uploaded (no actual upload) node scripts/population/auto-pop-sync.js preview # Continuous monitoring mode (checks every N seconds) node scripts/population/auto-pop-sync.js monitor 60
Windows shortcuts are provided in scripts/population/:
sync-once.bat— one-click sync after logging out of WoWpreview.bat— preview data before uploadingsync-monitor.bat— auto-sync every 60 seconds
Configure your WoW account paths in auto-pop-sync.js:
const LUA_PATHS = { alliance: [ 'C:/Program Files/World of Warcraft/_classic_era_/WTF/Account/YOUR_ACCOUNT/SavedVariables/PopulationTracker.lua', ], horde: [ 'C:/Program Files/World of Warcraft/_classic_era_/WTF/Account/YOUR_HORDE_ACCOUNT/SavedVariables/PopulationTracker.lua', ] };
Only time slots where both Alliance and Horde data exist are uploaded, ensuring paired accuracy.
| Category | Libraries |
|---|---|
| Framework | Next.js 16 (App Router, Turbopack), React 19, TypeScript 5 |
| Styling | Tailwind CSS 4, Radix UI, Lucide React |
| Database | PostgreSQL, Prisma 6 (with Prisma Accelerate) |
| External APIs | Blizzard API (OAuth2), WarcraftLogs API |
| Scraping | Puppeteer, Cheerio, Axios |
| Charts | Chart.js, react-chartjs-2 |
| Analytics | Google Analytics, Google AdSense |
| WoW Addon | Lua (WoW Classic API) |
- Node.js 18+
- PostgreSQL database (or Prisma Postgres)
- Blizzard API credentials — register here
- WarcraftLogs API credentials (optional, for parse data)
- WoW Classic client (optional, for population data collection)
git clone https://github.com/blessedrabies/wow_armory.git
cd wow_armory
npm installCreate a .env.local file in the project root:
# Blizzard API BLIZZARD_CLIENT_ID=your_client_id BLIZZARD_CLIENT_SECRET=your_client_secret # WarcraftLogs API (optional) WARCRAFTLOGS_CLIENT_ID=your_client_id WARCRAFTLOGS_CLIENT_SECRET=your_client_secret # Database DATABASE_URL=postgresql://user:password@host:5432/dbname # Analytics (optional) NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX NEXT_PUBLIC_GOOGLE_ADSENSE_ID=ca-pub-XXXXXXXXXXXXXXXX
npx prisma generate npx prisma migrate deploy
npm run dev
Open http://localhost:3000.
/app
/api # API routes
/character/[realm]/[name] # Character data (Blizzard API)
/raid-stats # Raid statistics
/wow-population # Population data ingestion & query
/warcraftlogs # WarcraftLogs integration
/community # Trading board posts & comments
/character/[realm]/[name] # Character detail page
/raid-stats # Raid statistics dashboard
/population # Population charts & history
/community/trade # Community trading board
/privacy, /terms # Legal pages
/components
TalentTreeNew.tsx # Interactive talent tree
ItemSlotShadcn.tsx # Equipment slot with tooltips
StatsPanelShadcn.tsx # Character stats display
PopulationChartJS.tsx # Alliance/Horde population charts
WarcraftLogsDisplay.tsx # Parse rankings display
/lib
blizzard-api.ts # Blizzard API client
wowhead-talent-encoder.ts # Talent build → Wowhead URL encoder
all-classes-talents-bilingual.ts # Talent data for all 9 classes
/scripts
/population
auto-pop-sync.js # Main sync script (SavedVariables → API)
pop.js # Manual population entry
read-population-data.js # Read & analyze SavedVariables data
sync-once.bat # Windows: one-click sync
sync-monitor.bat # Windows: auto-sync every 60s
preview.bat # Windows: preview before upload
backup-database.js # DB backup utility
/prisma
schema.prisma # DB schema
/migrations # Migration history
/wow-addon
/PopulationTracker
PopulationTracker.lua # Addon main file (Lua)
PopulationTracker.toc # Addon metadata
chatchannels.lua # Channel detection helpers
| Model | Purpose |
|---|---|
SearchLog |
Character search analytics |
WowPopulation |
Alliance/Horde population samples over time |
RaidStatistics |
Class/spec participation by region & phase |
Post |
Community board posts |
Comment |
Nested post comments |
Survey |
User polls |
npm run fetch-talents # Fetch talent descriptions from Wowhead npm run fetch-wowhead # Fetch localization data npm run fix-encoding # Fix character encoding issues npm run lint # ESLint
This app is deployed on Vercel. Set the environment variables listed above in your hosting platform.
This project is for educational purposes. World of Warcraft and Blizzard Entertainment are registered trademarks of Blizzard Entertainment, Inc.