Short version
WCL Analyzer turns WarcraftLogs reports into permanent PBS and CLA report pages.
The site itself is static and runs on Cloudflare Pages. Supabase holds accounts,
guilds, reports and a job queue. Runner workers pull jobs from that queue, talk to
the WarcraftLogs API and write the finished report back. No part of the pipeline
trusts the browser with anything secret.
1 · Import
A guild member pastes a link
Anyone in a guild can paste a WarcraftLogs URL on the dashboard, pick PBS, CLA or
both, and choose which CLA modules to run. The job lands in the queue with status
queued — that is all the web app does.
2 · Queue
A worker claims the job
Runner workers poll the queue and claim jobs atomically, so two workers never grab
the same report. The winner fetches every fight from the WarcraftLogs API, runs the
analyzers and grades each player.
3 · Publish
The report goes live
The finished report is saved to Supabase and published on a permanent page. Anyone
with the link can open it — no login, no API key, no spreadsheet access.
Architecture
The moving parts
Dashboard
Supabase queue
Runner workers
WarcraftLogs API
Supabase
Public page
Cloudflare Pages serves the UI and a set of small API functions: auth, guild
management and report CRUD. Supabase is the single source of truth — users,
guilds, invites, report JSON, the job queue and a shared WarcraftLogs response cache
all live there. The workers are plain Node processes; they can run on any machine
that has the right environment variables, and you can run one or ten. There is no
webhook dependency: a worker that can reach Supabase is a worker that works.
Workers
Pull, don't push
Workers pull jobs instead of waiting to be called. Each worker claims a queued
report with a compare-and-set update, sends a heartbeat every poll cycle so site
admins can see who is online, and releases the job back to the queue if
WarcraftLogs rate-limits it — with an automatic retry counter instead of a
failed report.
Cache
Respecting the point budget
WarcraftLogs gives every API key a point budget, so raw API responses are cached
in Supabase per report. If a job is interrupted or rate-limited halfway, the next
attempt — on any worker — continues from the cached responses instead
of re-spending points from zero. The cache is cleared once the report publishes.
PBS
Role Performance Breakdown
PBS grades how the raid played, broken down by role. It opens on a
General table for the whole raid, then splits into one table per
role (tanks, healers, melee, ranged) plus a matching "casts" table for each role's
cooldown and ability usage.
- Boss Fights — every pull, with duration and outcome.
- Damage Done / Damage Taken — overall throughput and incoming damage per player.
- RPB Damage Taken — avoidable boss mechanics each player ate, counted per fight.
- Debuffs / RPB Debuffs — uptime on key raid debuffs (Sunder Armor, Faerie Fire, etc.) per player.
- Deaths — who died, when, and to what.
- Interrupts — who interrupted what, and which casts went through unchecked.
- RPB Engineering — engineering gadget usage (bombs, nets and similar).
- RPB Other Casts — trinkets, racials and other configured cooldowns.
CLA
Combat Log Analytics
CLA is the spreadsheet-style audit: it checks what the raid brought, not how it
played.
- Fights — the fight list with start/end times used by every other CLA tab.
- Validate — sanity checks that the report parsed cleanly before trusting the rest.
- Gear listing — every player's equipped items, gems and enchants.
- Gear issues — missing gems, missing or low-rank enchants, empty sockets.
- Drums — Drums of Battle/War uptime across the raid.
- Buff consumables — flask, elixir, food and scroll uptime per player.
- Shadow resi — Shadow Resistance gear checks for fights that need it.
Data catalog
Gems, enchants and item details
Gear data straight from WarcraftLogs is rough around the edges: gem names go missing,
icons point at the wrong thing, enchant labels come back oddly scaled. Local catalogs
fill in the gaps so the gear tabs can name every gem and enchant correctly.
wowhead-gems.json maps gem item id to name, icon, item level and effect.
tbc-enchants.json maps permanent enchant id to name, slot and effect.
cla-gear-config.json keeps the audit rules: bad enchants, ignored items, expected socket counts.
Safety
Your WarcraftLogs key, handled carefully
Your personal WarcraftLogs API key is encrypted (AES-GCM) before it is stored, and is
only ever decrypted server-side by the worker that runs your reports. It is never
shown to other users and never included in any published report.
- Saving a key is optional — use the "Temporary WCL API override" field on the dashboard to run a single report without storing anything.
- Already saved a key? Leave the field empty and save again to remove it.
- The public site only sees published reports. Everything else — importing, re-running, guild management — requires a login, and guild access is invite-only.
Spreadsheet DNA
Born in Google Sheets
WCL Analyzer is a port of two community Google Sheets that raid leads have used for
years. The web version keeps their logic — the same checks, the same thresholds —
but swaps copy-pasted sheets for permanent pages, cached API calls and a job queue.
The originals are still maintained and worth a look:
- RPB spreadsheet — make your own copy of the original Role Performance Breakdown sheet.
- CLA spreadsheet — make your own copy of the original Combat Log Analytics sheet.
- Discord — join the community behind the original sheets for support and updates.
Ready to try it
Find your guild's reports
Search for your guild on the homepage to browse its published reports, or create an
account and import your own.