Skip to content

RaidKit · Web tool

Raid Ledger

Paste a Warcraft Logs report and see who was flasked, fed, enchanted, gemmed and resist-capped, per player, per pull.

Web toolTBC Classic Anniversary2026-09-12Live For raid leaders, officers and loot or attendance managers who log to Warcraft Logs and want a fast, defensible answer to "who came unprepared" — and raiders checking their own prep

Nobody: it is a web page · In your browser; the audit runs on the RaidKit server and the report is cached for everyone · Nothing. Send them the report link and they see the same tables; an account is needed only for private reportsLive at raidkit.app: all three audits, the shared report cache and the Warcraft Logs connection for private reports. Per-guild race and Mage talent settings still come from seed files for one guild, and there is no settings page or export yet.

Overview

Raid Ledger is the audit tool inside RaidKit for Classic Anniversary raids, currently the Burning Crusade phase. After a raid night you want to know who actually showed up prepared. The Warcraft Logs site can tell you, but only one player, one slot and one fight at a time, and its own gems and enchants column mislabels enchants. Raid Ledger reads the combat log data instead: the gear and buff snapshot Warcraft Logs records at every boss pull, plus the buff and cast events during each fight. It turns that into three color-coded tables with a Flags column that says in plain words what each person is missing.

The three audits are shadow resistance (for Mother Shahraz in Black Temple: each raider's resistance from gear and from buffs at the pull, scored against 244 buffed and 160 gear), enchants and gems (is every enchantable slot enchanted and every socket filled, with the exact missing slots named) and consumables (flask or elixir uptime, food uptime and potions used against a two-minute cooldown budget, per player across every boss of the night, optionally including trash). One note on wording: on this page SR means shadow resistance. In Gargul Persistence Bonus, RaidKit's loot ledger tool, SR means soft reserve.

Using it feels like pasting a link. There is nothing to install and no account is needed for public or unlisted reports. You paste the report URL or its 16-character code, a fight list appears, you click an audit, and a sortable table comes back. Every fetch is cached on the server, so a report opened once is served from the cache for everyone after. Private reports open too once you sign in and connect your own Warcraft Logs account under Settings > Connections.

Raid Ledger reads reports through the Warcraft Logs API. Warcraft Logs is a separate service; RaidKit is not affiliated with or endorsed by it. World of Warcraft is a trademark of Blizzard Entertainment, and RaidKit is a fan-made project with no affiliation to Blizzard. The other RaidKit tools (BrokenDice, Gargul Persistence Bonus, Grudge List and Raid Ping) are separate products; Raid Ledger shares no data with them today.

What it does, in detail

What the audit reads and what it cannot see

Warcraft Logs stores a combatant-info snapshot at the start of every boss pull: each player's equipped items with enchant, temporary enchant and gem ids, and the auras on them at that moment. Raid Ledger resolves those ids against an offline item, enchant and gem database built from the wowsims project's tooltip dumps, plus an extra.json file for Anniversary-only items the dump predates. An item id the database does not know is never silently dropped: the shadow resistance audit lists it in Flags as "Unknown items: [ids]", and the enchants and gems audit treats an unknown off-hand item as one that needs an enchant, although it cannot know the item's socket count and does not mark the row. The audits therefore describe the state at each pull, not between pulls, and a player who died before a snapshot's pull can show fewer buffs than they actually used.

Two things are not in the log at all: race and talent ranks. Draenei and Undead get +10 shadow resistance, and a Mage's Magic Absorption talent gives +2 resistance to everything per point (up to 5). Today these come from two seed files carried over from the Python tool; the race file is keyed by character name, and a Name-Server key also works. Alliance Shamans are inferred as Draenei and Horde Paladins as Blood Elf from class and faction, where the faction comes from the report's guild (or from a character probe stored with the snapshot), so a report with no guild attached gets no inference. Everyone else without an entry shows ? and a flag. A per-guild settings page is the planned replacement.

Shadow resistance for Mother Shahraz

For the selected fight, each raider gets a Gear SR (items, assumed green suffixes, enchants, armor kits, glyphs and resist-all gems) and a Buffed SR (gear plus the strongest protection buff, flask, Broiled Bloodfin, Gift of Arthas, Mage or Demon Armor, racial and talent). The targets are buffed at or above 244 and gear at or above 160; green means at target, red means below, and tanks are never colored. Each row also shows Race / Class and Role. The table is sorted by gear SR so the weakest links are at the bottom.

Buffs in one group do not stack, so only the strongest counts: Prayer of Shadow Protection at +70 beats Gift of the Wild at +25 in the protection group, and the flask, food, Gift of Arthas and armor groups each count once. The buff columns are headed Shadow Protection, Flask, Broiled Bloodfin, Gift of Arthas and Mage (the armor column, which shows n/a for any class other than Mage or Warlock). Hover a buff cell to see which buff was actually found. Random-suffix greens (the "of Shadow Protection" pieces most people wear for this fight) are a special case because the log does not store the suffix. Every random-suffix item is counted as its shadow-resistance roll: known items use a Wowhead-verified table, unlisted ones are interpolated from same-slot greens at that item level and listed in Flags as "Estimated green suffix value", and items with no SR suffix at all count 0. The engine notes every assumed green as "ASSUMED SR suffix — verify in game", but the site does not show per-item notes, so a green with a known suffix value produces no visible flag; check the Greens column instead.

Enchants and gems

The enchants and gems audit answers one question per slot: should it carry an enchant, and does it. Head, shoulder, back, chest, wrist, hands, legs, feet and main hand always need one. Off hand needs one only if it is a weapon or shield: a one-hand weapon in the off hand is required, a Held In Off-hand item is n/a, and an item the offline database does not know is treated as required. Ranged needs one only if it is a bow, gun or crossbow, and neck, waist, trinkets, shirt and tabard never do. Socket counts come from the offline database, so an empty socket is caught even though the log only records filled ones. An enchant id the database does not know is counted as present, and a log that shows more gems than the item has sockets is noted in the engine; neither note is shown on the site.

Each row shows Enchants done/needed, Gems filled/sockets, a Status of OK or MISSING, and a Missing column with the exact problem ("Legs: no enchant", "Head: 2 empty sockets"). Rings follow the auto policy: ring enchants exist only for Enchanters, so both rings are required only for a player who already has one ring enchanted. A separate Warnings column lists things that do not change Status: a poor, common or uncommon quality gem, a meta socket filled with a non-meta gem, and no temporary weapon enchant (oil, sharpening stone, poison or shaman imbue) on the main hand at the pull.

Consumables across the whole night

The consumables audit covers every boss encounter in the report rather than one pull. For each player it shows Fights (how many of the covered fights they attended), Flask / elixirs as the average uptime of whichever was up (a flask, a battle elixir or a guardian elixir; under the "any" policy a flask or a single elixir is a complete setup), Food as the average Well Fed uptime shown as a percentage (the engine resolves which food was eaten, but the site does not display the name), and Potions as used / possible. The budget is one potion per two minutes of fight plus the opener, because every TBC potion shares a two-minute cooldown. A Potion breakdown lists what was used (for example 4× Haste Potion, 2× Super Mana Potion). Rows are grouped Tanks, Healers, DPS. A player who appears only on trash and attended no boss fight is left out.

Uptime cells are green at 90 percent or better and red under 50 percent. Potion cells are green at 50 percent of budget or better and red under 25 percent. Flags spell it out: "No flask or elixir in n/N fights" with the boss names, which fires for any fight where the best flask or elixir uptime was under 50 percent, "No food in n/N fights", "Food dropped below 90% in n fights (died / ate late)", "0 potions in n/N boss fights", "Potion usage x/y possible (z%)" when under half the budget, and "Unverified classification" when a flask, elixir or food buff was recognized only by its name rather than a known spell id (potions, healthstones, drums and runes matched by name are counted without that flag). The engine also has an "Only one elixir, no flask ... counts as 50% coverage" flag, but it only fires under the both policy, which the site does not run. Healthstones, drums and runes are tracked in the engine but not yet shown as columns.

Trash pulls have no aura snapshot, so they are off by default. Include trash carries each player's flask, elixir and food state forward from the last boss pull or event, capped at the buff's duration (flask two hours, elixirs one hour, food thirty minutes), until the next boss snapshot resets it. Potions used on trash never count against the budget; they appear as "(+n on trash)" in the breakdown. Treat trash numbers as approximate.

Tables you can sort and share

Click any column header to sort, click again to flip. Sorting is value-aware: "17/21" sorts by the ratio and "72%" by the number. The first click on a number column sorts descending, which puts "?" and blanks at the bottom; the second click flips to ascending and they move to the top. Text columns such as Player and Flags start ascending. The Flags, Missing, Warnings and Potion breakdown columns wrap as text so a long list stays readable. Every audit lives at a plain URL, so sharing a result is pasting a link into Discord; whoever opens it sees the same cached tables without signing in, unless the report is private.

Caching, refresh and the live window

Every fetch from Warcraft Logs is stored once in the RaidKit database and shared by all viewers. A report that ended less than 24 hours ago is treated as live: opening it re-checks the fight list against the API, a fight whose end time moved is refetched, and the consumables lines are rebuilt when new fights appear. Older reports are served from cache until someone asks for a refetch. The Refresh button on the report page adds ?refresh=1 to the report URL, which refetches only the report header (title, fight list, visibility); the audit links it renders carry no refresh flag, so a cached audit is still served unless its fight's end time or the set of fights changed. To refetch an audit itself, add ?refresh=1 to that audit's own URL. The /ledger page lists the 12 most recent public and unlisted reports anyone has loaded and the homepage the 4 most recent, ordered by the raid's start date rather than by when they were loaded, with zone and date. Private reports are never listed there.

Public, unlisted and private reports

Public and unlisted reports are read with RaidKit's own Warcraft Logs API client, exactly as Warcraft Logs would serve them to anyone with the link, and the site finds the report across the www, classic and fresh partitions on its own. A private report is different: it is read only with the token of a signed-in person who connected a Warcraft Logs account that can see it, and cached data for a private report is served only after Warcraft Logs confirms on that request that the viewer's token still opens it. The cache never makes a private report more public than it is on Warcraft Logs.

When a fetch fails, the notice says the next step for you specifically: Sign in, Connect Warcraft Logs, or Reconnect Warcraft Logs when a link has expired. Long-lived tokens are refreshed automatically near expiry; a refused refresh asks you to reconnect. What RaidKit keeps for the connection is your Warcraft Logs username and the tokens it issued. Disconnecting deletes them. A RaidKit account itself is created with Google, GitHub or an email address and password (with email verification, forgot and reset password, and an optional authenticator app as a second factor); Warcraft Logs shares no email address, so Continue with Warcraft Logs only signs in an account that already connected it from Settings.

Where the engine came from

The audit engine is a line-for-line TypeScript port of the author's wow-audit Python tool, and parity tests hold both implementations to the same numbers on the same fixtures (for example one character at 174 gear and 244 buffed shadow resistance, matched against the in-game character sheet). The Python tool remains the offline reference and still has a few things the web version does not: an editable Magic Absorption rank picker and per-audit Excel workbooks. The web table's Talent cell already carries the rank-picker data (player, talent, rank, maximum), but the site does not render a picker yet.

Functions

Features

Paste a report, get a fight list
Paste a Warcraft Logs URL or a bare 16-character report code on the homepage or /ledger. A ?fight= parameter in the URL carries over. The report page shows title, zone, date, boss and trash counts, guild and logger, then every boss pull with Kill or Wipe (with percent left), length, and per-pull SR and Enchants & gems links. The /ledger page also has a Docs button that opens this page.
Shadow resistance audit
Gear SR and Buffed SR per raider for the selected fight, with Race / Class and Role, Items, Greens, Enchants and Gems source columns, one column per buff group (the Mage column shows n/a for classes other than Mage and Warlock), Racial and Talent columns, and Flags. Colored against buffed 244 and gear 160; tanks are not colored; sorted by gear SR.
Greens counted as their SR suffix
The log does not store a random suffix, so every random-suffix item is counted as its of Shadow Protection or of Shadow Resistance roll: Wowhead-verified values for known items, interpolated for unlisted ones and listed in Flags as an estimated green suffix value, 0 for items with no SR suffix. The engine's per-item "ASSUMED SR suffix" note is not shown on the site, so verify greens in game.
Plain-language SR flags
Per non-tank: no Glyph of Shadow Warding (+20), Shadow Armor Kits on n/4 slots, no SR cloak enchant (+15 available), no Medallion of Karabor (+40), only a weaker protection buff (or none) at pull, no Flask of Chromatic Wonder (+35), no Broiled Bloodfin (+8), no Gift of Arthas (+10). Tanks get a single "Tank — no SR gear expected" flag instead. For Mages and Warlocks: Fel Armor instead of Demon Armor, or armor spell not in the snapshot. Also race unknown, Magic Absorption rank not on file, estimated green values and unknown item ids.
Enchants & gems audit
Enchants done/needed, Gems filled/sockets, Status OK or MISSING, and a Missing column naming the slot and problem. TBC slot rules built in: nine slots always, off hand only for weapons and shields (a one-hand weapon there is required, a Held In Off-hand item is n/a, an item unknown to the database is treated as required), ranged only for bows, guns and crossbows, never for neck, waist, trinkets, shirt or tabard. Sorted by number of missing items.
Ring enchant policy (auto)
Both rings are required only for a player who already has one ring enchanted, since ring enchants exist only for Enchanters. The engine also supports require and ignore, but the web UI always uses auto today.
Gear warnings that do not change Status
Poor, common or uncommon quality gems, a meta socket without a meta gem, and "Main Hand: no temporary weapon enchant (oil / stone / poison) at pull". The engine resolves the name of a temporary enchant that is present, but the site does not show it.
Consumables audit for the whole report
Per player across every boss encounter: Fights attended, Flask / elixirs uptime, Food uptime, Potions used / possible with a two-minute cooldown budget, a Potion breakdown by type, and Flags. Rows grouped Tanks, Healers, DPS; players seen only on trash are skipped.
Include trash
Adds every trash pull with flask, elixir and food state carried forward from the last boss snapshot (capped at two hours, one hour and thirty minutes). Potions on trash are shown as (+n on trash) and never count against the budget.
Sortable, color-coded tables
Click a header to sort, again to flip; ratios and percentages sort by value. Number columns start descending with blanks and "?" at the bottom; flipping to ascending moves them to the top. Cells are toned ok, warn or bad; hovering a buff cell shows which buff was found.
Shared report cache with a 24-hour live window
Each fetch is stored once and shared by every viewer. Reports that ended less than 24 hours ago are re-checked on open so a log loaded mid-raid does not stay frozen. The report page's Refresh button refetches the report header; ?refresh=1 on an audit URL refetches that audit.
Recent reports
/ledger lists the 12 most recent public and unlisted reports anyone has loaded and the homepage the 4 most recent, ordered by raid start date, with zone and date. Private reports are never listed.
Private reports through your own Warcraft Logs account
Sign in, connect Warcraft Logs under Settings > Connections, and private reports you can see there open here. Cached private data is served only after Warcraft Logs re-confirms your access on that request. Errors name the next step: Sign in, Connect Warcraft Logs or Reconnect Warcraft Logs.
Connections settings
Warcraft Logs is listed first with Connect, Reconnect and Disconnect, the connected username and date, and an expired-access notice. Disconnecting deletes the stored tokens and is refused if it would leave the account with no other way to sign in.
RaidKit account with email and password
Accounts are created with Google, GitHub, or an email address and password. Sign-up sends an email verification, forgot and reset password exist, and you can add an authenticator app (TOTP) as a second factor. Continue with Warcraft Logs on the sign-in page only signs in an account that already connected Warcraft Logs from Settings, because Warcraft Logs shares no email address.
Offline game data with overrides
Item, enchant and gem lookups use compact JSON built from the wowsims dumps plus extra.json for Anniversary-only items. TBC enchant names are corrected (Arcanum of becomes Glyph of). An unknown item id is listed in the SR audit's Flags; an unknown enchant id is counted as present.
Fight selection
?fight= accepts last (the last boss pull, the default), last-kill, a fight id, or a boss-name substring, which picks the last kill of that boss or else the last pull.
Configuration warning
When the site's Warcraft Logs API credentials are missing, /ledger shows "Warcraft Logs is not configured on this site, so new reports cannot be fetched yet" instead of failing on the first paste.

URLs

CommandWhat it does
/ledgerFront door. Paste a Warcraft Logs report URL or 16-character code; shows the 12 most recent public and unlisted reports, whether your Warcraft Logs account is connected, and a Docs button to this page.
/ledger/open?ref=<url or code>Resolves a report reference and redirects to /ledger/<code>, carrying any ?fight= from the pasted URL. A bad reference goes back to /ledger with the reason. This is what the homepage form submits to, so it works without JavaScript.
/ledger/<code>Report view: title, zone, date, boss and trash counts, guild and logger; the boss pull table with per-pull SR and Enchants & gems links; the three audit buttons and a Consumables + trash button; a Refresh button.
/ledger/<code>?fight=lastSelects the pull the per-fight audits run on. last is the default (last boss pull).
/ledger/<code>?fight=last-killSelects the last boss kill in the report. lastkill and kill also work.
/ledger/<code>?fight=<id>Selects a specific fight by its Warcraft Logs fight id (the # column on the report page).
/ledger/<code>?fight=shahrazSelects by boss-name substring: the last kill of that boss, or the last pull if there was no kill.
/ledger/<code>/sr?fight=last-killShadow resistance audit for the selected fight.
/ledger/<code>/gear?fight=last-killEnchants & gems audit for the selected fight.
/ledger/<code>/consumablesConsumables audit across every boss encounter of the report.
/ledger/<code>/consumables?scope=allConsumables audit including trash pulls, with carried-forward buff state.
/ledger/<code>?refresh=1What the Refresh button opens: refetches the report header (fight list, title, visibility) from Warcraft Logs. Cached audits are not refetched by this alone.
/ledger/<code>/sr?fight=last&refresh=1?refresh=1 on an audit URL (sr, gear or consumables) refetches that audit's data from Warcraft Logs instead of serving the cache.
/settings/connectionsConnect, reconnect or disconnect your Warcraft Logs account. Needed only for private reports; requires being signed in.
/sign-upCreate a RaidKit account with an email address and password (a verification email follows), or with Google or GitHub. Needed only for private reports.

Settings

SR targets: buffed 244, gear 160
The Mother Shahraz thresholds in the anniversary rules (srThresholdBuffed, srThresholdGear). Gear SR at or above 160 and Buffed SR at or above 244 color green, below colors red, tanks are never colored. The table function accepts overrides, but the web UI does not expose them yet.
ELIXIR policy: any
A flask or a single elixir counts as full coverage in the Flask / elixirs column. The engine also understands both, which would require two elixirs in place of a flask, count one elixir as 50 percent and add an "Only one elixir, no flask" flag; the site runs any.
Potion budget: one per 120 seconds plus the opener
potionCooldownS is 120 because every TBC potion shares a two-minute cooldown with no potion sickness. Possible potions per boss fight = floor(fight seconds / 120) + 1. Trash pulls have a budget of zero.
Food target uptime: 90 percent
foodTargetUptime is 0.9. A fight where food was up less than 90 percent of the time is flagged as dropped, which usually means a death or eating late.
Ring policy: auto
ringPolicyDefault is auto: both rings are required only when the player already has one ring enchanted (an Enchanter). require and ignore exist in the engine but are not selectable on the site.
Fight selection (?fight=)
Which pull the shadow resistance and enchants & gems audits use: last (default), last-kill, a fight id, or a boss-name substring.
Consumables scope: Boss encounters only / Include trash
A toggle button on the consumables audit (the report page also has a Consumables + trash button). Include trash is ?scope=all.
Refresh (?refresh=1)
Bypasses the cache for that request only. On the report URL (the Refresh button) it refetches the header; on an audit URL it refetches that audit. A report that ended less than 24 hours ago is re-checked automatically anyway.
Guild setting: player races (seed file today)
Race is not in the Warcraft Logs data. Draenei and Undead are worth +10 shadow resistance. Today races come from data/races.seed.json, a name-to-race map for one guild that also accepts Name-Server keys; Alliance Shamans and Horde Paladins are inferred from class and the report's guild faction (or a character probe), so a report with no guild gets no inference. Unknown races show ? and a flag. Not editable on the site yet.
Guild setting: Mage Magic Absorption ranks and manual adjustments (seed file today)
Rank 0 to 5 gives +2 resistance to everything per point. Any player can also have a manual +N with a note. Today these come from data/sr_adjustments.seed.json. A Mage without an entry shows ? in the Talent column and is flagged. Not editable on the site yet, although the Python tool has a rank picker and the web Talent cell already carries the picker data.
Warcraft Logs connection (Settings > Connections)
Connect, Reconnect or Disconnect your Warcraft Logs account. Required only for private reports. Stores your Warcraft Logs username and the OAuth tokens it issued; Disconnect deletes them.
Deployment: WCL_CLIENT_ID and WCL_CLIENT_SECRET
The site's own Warcraft Logs API client credentials, used for public and unlisted reports. When either is missing, /ledger shows "Warcraft Logs is not configured on this site" and new reports cannot be fetched. Values live in the server environment, never on the page.
Deployment: AUTH_WARCRAFTLOGS_ID and AUTH_WARCRAFTLOGS_SECRET
The OAuth client used for Connect Warcraft Logs and for refreshing a connected user's token near expiry. When they are missing, an expired connection cannot refresh and the notice asks you to reconnect.

How-to guides

01First raid night with Raid Ledger

The whole loop for a raid leader after the first logged night: paste the report, read the three audits, and send the links. Nothing to install and no account needed for a public or unlisted log.

  1. 1After the raid, open your report on Warcraft Logs and copy its URL from the address bar (something like https://fresh.warcraftlogs.com/reports/<code>?fight=last). The 16-character code on its own also works.
  2. 2Go to raidkit.app/ledger, paste the URL into the box and click Open report. On the homepage the same form is labeled Audit it.
  3. 3You land on /ledger/<code>. Check the header: zone, date, number of boss encounters and trash pulls, and the guild name. The table lists every boss pull with Kill or Wipe (and percent left), the length, and SR and Enchants & gems links for that pull.
  4. 4The first open fetches from Warcraft Logs. After that the report is cached and shared by everyone who opens the same link.
  5. 5Click Enchants & gems. The button hint tells you which pull it uses (the last boss pull unless the URL said otherwise). Sort by Status or read the Missing column for the exact slot each person forgot.
  6. 6Go back with Fight list and click Consumables. This covers every boss of the night. Read Flags for who had a flask or elixir up less than half the fight, no food, or almost no potions, and which bosses it happened on.
  7. 7If you raid Black Temple, click Shadow resistance on the Mother Shahraz pull. Gear SR under 160 or Buffed SR under 244 shows red; tanks are not colored.
  8. 8Copy the audit URLs and paste them into your raid channel. Anyone can open them without signing in. Officers who want to check a different pull can change ?fight= in the URL.

02Check shadow resistance before Mother Shahraz

Shadow resistance (SR on this page, not soft reserve) is what Mother Shahraz's fight demands. This audit reads each raider's gear and pull-time buffs and scores them against 244 buffed and 160 gear.

  1. 1On the report page click SR next to the Shahraz pull, or click the Shadow resistance button, or set ?fight=shahraz in the URL. Any pull works if you only care about gear; a Shahraz pull also shows the buffs that were up for the real attempt.
  2. 2Read Gear SR (unbuffed, target 160) and Buffed SR (with pull-time buffs, target 244). Green is at or above target, red is below. Tanks are never colored and carry the flag "Tank — no SR gear expected".
  3. 3Use Items, Greens, Enchants and Gems to see where a number comes from. Greens are counted as their shadow-resistance suffix; only interpolated ones show an "Estimated green suffix value" flag, and a green with a known suffix value shows no flag at all, so verify a borderline player's greens in game.
  4. 4Read the buff columns: Shadow Protection (the strongest of Prayer of Shadow Protection, Shadow Protection, Shadow Resistance Aura and Gift of the Wild, since they do not stack), Flask, Broiled Bloodfin, Gift of Arthas, and Mage, the armor column, which counts Mage Armor or Demon Armor and shows n/a for every other class. Hover a cell to see which buff was found.
  5. 5Read Flags. They name the missing pieces with their value: Glyph of Shadow Warding (+20), Shadow Armor Kits on n/4 slots, an SR cloak enchant (+15), Medallion of Karabor (+40), Flask of Chromatic Wonder (+35), Broiled Bloodfin (+8), Gift of Arthas (+10), and Fel Armor on a Warlock who should be in Demon Armor.
  6. 6A ? in Racial or Talent means the race or the Mage's Magic Absorption rank is not on file, so that player's Buffed SR may be up to 10 short. Today those values come from a seed file; a settings page is planned.
  7. 7Click Gear SR or Buffed SR to sort by that column; click again to flip. The default order is gear SR descending, so the players to talk to are at the bottom.

03Find who is missing enchants or gems

One table per pull that names the exact slot and problem for every raider, using TBC slot rules so an unenchantable off hand or relic never counts against anyone.

  1. 1On the report page click Enchants & gems, or the Enchants & gems link on a specific pull. The URL is /ledger/<code>/gear?fight=<id>.
  2. 2Status is OK or MISSING. Enchants shows done/needed and Gems shows filled/total sockets for that player.
  3. 3The Missing column names the exact problem: "Chest: no enchant", "Head: 1 empty socket". Rows with the most problems sort to the top by default.
  4. 4Rings follow the auto policy: a player with one ring enchanted is an Enchanter and is expected to have both, everyone else's rings are ignored.
  5. 5Warnings are informational and do not change Status: a poor, common or uncommon quality gem, a meta socket without a meta gem, and "Main Hand: no temporary weapon enchant (oil / stone / poison) at pull".
  6. 6This table does not mark items the offline database does not know: their socket count is unknown, so an empty socket on such an item is not caught, and an unknown off-hand item is treated as needing an enchant. Open the SR audit for the same pull to see "Unknown items: [ids]" in Flags. Anniversary-only items need adding to extra.json.

04Review flasks, food and potions for the whole night

The consumables audit reads buff uptimes and potion casts across every boss encounter of the report, so one table covers the whole raid.

  1. 1Open the SR or Enchants & gems audit once first. The consumables view borrows roles and specs from a cached fight snapshot of the same report; without one, everyone shows as DPS with no spec.
  2. 2On the report page click Consumables. The title tells you how many boss encounters and kills it covers, and the Fights column shows how many each player attended.
  3. 3Flask / elixirs and Food are average uptime over the fights each player attended, shown as percentages. A flask or a single elixir counts as a full setup. Green at 90 percent or better, red under 50 percent.
  4. 4Potions is used / possible on boss fights, where possible is one per two minutes of fight plus the opener. Green at half the budget or better, red under a quarter.
  5. 5The Potion breakdown lists what was used, for example 4× Haste Potion, 2× Super Mana Potion. Flags list the bosses where a player's best flask or elixir uptime was under 50 percent, where they had no food, or zero potions, and note when food dropped below 90 percent (usually a death).
  6. 6Click Include trash to add trash pulls. Buff state on trash is carried forward from the last boss snapshot and capped at the buff's duration, so treat those numbers as approximate. Potions used on trash appear as (+n on trash) and never count against the budget. Click Boss encounters only to go back.

05Open a private report

Public and unlisted reports need nothing. A private report is read only with the token of someone whose Warcraft Logs account can see it, so you connect yours once.

  1. 1Create a RaidKit account or sign in. Accounts are created with Google, GitHub, or an email address and password on /sign-up (a verification email follows; forgot and reset password exist, and you can add an authenticator app later). Continue with Warcraft Logs on the sign-in page only works for an account that has already connected Warcraft Logs, because Warcraft Logs shares no email address.
  2. 2Go to Settings > Connections. Warcraft Logs is listed first. Click Connect Warcraft Logs; you are sent to warcraftlogs.com to approve RaidKit and come straight back with a Connected badge showing your username and the date.
  3. 3Return to /ledger and paste the private report. The report page shows a "Private report" badge, and Warcraft Logs re-confirms your access every time cached data for it is served.
  4. 4If a report errors with a private or not-found message, the notice offers the next step for you: Sign in, Connect Warcraft Logs, or Reconnect Warcraft Logs when the link has expired. Tokens refresh on their own when they can; a refused refresh asks you to reconnect.
  5. 5Private reports never appear under Recent reports, and other viewers without access get the same private notice, even for a cached report.
  6. 6To stop RaidKit reading your logs, click Disconnect on the Connections page. The stored tokens are deleted with it. Disconnect is refused if Warcraft Logs is the only way into your account and no password is set; set a password first.

06Re-audit a log that is still uploading

Logs are often uploaded live during the raid. The cache knows this and re-checks young reports, and Refresh exists for everything else.

  1. 1A report that ended less than 24 hours ago is treated as live. Opening it re-checks the fight list against Warcraft Logs, so new pulls appear as they upload.
  2. 2If a fight was cached while it was still in progress, its end time changes on the next check and the site refetches that fight on its own. The consumables lines are rebuilt when the set of fights changes.
  3. 3Reports older than 24 hours are served from cache until someone asks for a refetch.
  4. 4Refresh on the report page opens /ledger/<code>?refresh=1, which refetches only the report header (fight list, title, visibility). The audit links on that page carry no refresh flag, so a cached audit is still served unless its fight's end time or the set of fights changed.
  5. 5To force a refetch of an audit itself, add ?refresh=1 to that audit's own URL, for example /ledger/<code>/consumables?refresh=1 or /ledger/<code>/sr?fight=last&refresh=1.

Good to know

  • SR on this page means shadow resistance. In Gargul Persistence Bonus, RaidKit's loot ledger tool, SR means soft reserve.
  • Anniversary (TBC phase) is the only ruleset. Other Classic eras are not supported yet.
  • Every random-suffix green is counted as its shadow-resistance variant because the log does not store the suffix. Only interpolated greens show an "Estimated green suffix value" flag; a green with a known suffix value shows no flag, and the engine's per-item ASSUMED note is not displayed. Verify in game before trusting a borderline number.
  • Race is not in the Warcraft Logs data. Only Alliance Shamans (Draenei) and Horde Paladins (Blood Elf) are inferred, and only when the report has a guild faction (or a character probe) to read it from; everyone else needs an entry in the race seed file or shows ? and a flag. Draenei and Undead are worth +10.
  • Mage Magic Absorption ranks are not in the log. A Mage without an entry shows ? in the Talent column (counted as 0) and is flagged. The site cannot edit this yet.
  • The race and adjustment seed files hold one guild's roster, so other guilds' players show unknown race and talent flags until per-guild settings exist.
  • Consumables roles and specs are borrowed from a cached fight snapshot of the same report. Open Consumables before any SR or Enchants & gems audit and everyone shows as DPS with no spec.
  • Only boss pulls carry a gear and buff snapshot, and Warcraft Logs only serves events inside fights. The audits reflect the state at each pull, not between pulls.
  • Buffs drop on death, so a player who died before a snapshot's pull can show fewer buffs than they actually used.
  • Trash pulls have no snapshot. Include trash carries flask, elixir and food state forward, so a buff that quietly expired between pulls can be over-counted on trash.
  • Potions on trash never count against the budget; the budget is boss fights only. A player who attended no boss fight at all is left out of the consumables table.
  • "No flask or elixir in n/N fights" fires for any fight where the best flask or elixir uptime was under 50 percent, not only when nothing was up.
  • A flask, elixir or food buff recognized only by its name is flagged "Unverified classification"; potions, healthstones, drums and runes matched by name are counted without a flag, and any unknown elixir is assumed to be a battle elixir.
  • Fel Armor gives 0 resistance and is flagged for Warlocks; an armor spell missing from the pull snapshot is flagged rather than guessed. The armor column is headed Mage and shows n/a for every class other than Mage and Warlock.
  • Ring enchants are required only for players who already have one ring enchanted. The require and ignore policies exist in the engine but are not selectable on the site.
  • The 244 / 160 targets are fixed on the site even though the engine accepts overrides.
  • An item id the offline database does not know is listed in the SR audit's Flags as "Unknown items: [ids]". The Enchants & gems table does not mark it: its socket count is unknown, and if it sits in the off hand it is treated as needing an enchant. An unknown enchant id is counted as present. Anniversary-only items need adding to extra.json.
  • The temporary weapon enchant's name and the resolved food name are computed by the engine but not shown on the site; you see only the "no temporary weapon enchant" warning and a food uptime percentage.
  • Cached results are shared by everyone. A report that ended more than 24 hours ago is served from cache until someone asks for a refetch, and the report page's Refresh button refetches only the header; add ?refresh=1 to an audit URL to refetch that audit.
  • Sorting a number column descending puts "?" and blanks at the bottom; the second click (ascending) moves them to the top.
  • Recent reports are ordered by the raid's start date, not by when they were loaded, so an old log opened today does not appear first. /ledger shows 12, the homepage 4.
  • A private report is never listed under Recent reports, and its cache is served only after Warcraft Logs re-confirms the viewer's token on that request.
  • Continue with Warcraft Logs cannot create an account: Warcraft Logs shares no email address, so it only signs in an account that already connected it from Settings. Create the account with Google, GitHub or email and password first.
  • You cannot disconnect Warcraft Logs if it is the only way into your account and no password is set.
  • No Excel or workbook export in the web version yet; the Python tool has it.
  • Healthstones, drums and runes are computed per fight in the engine but not shown as columns yet.
  • Do not trust the Warcraft Logs site's own gems and enchants column for this; it mislabels enchants such as Glyph of Shadow Warding. Raid Ledger resolves the raw enchant effect ids instead.

Visuals

From one pasted Warcraft Logs link to three audit tables: the page flow of Raid Ledger.
How a report travels from the Warcraft Logs API through the shared cache and the TypeScript engine into the audit table.
What goes into Gear SR and Buffed SR for one raider, measured against the Mother Shahraz targets of 160 and 244.

Requirements & credits

Requirements

  • A Warcraft Logs report from a Classic Anniversary (TBC phase) raid. Public or unlisted works as-is; private needs a signed-in RaidKit account with a connected Warcraft Logs account.
  • A modern web browser. Nothing to install.
  • Optional: a RaidKit account (created with Google, GitHub, or an email address and password) and a Warcraft Logs account connected under Settings > Connections, only for private reports. Continue with Warcraft Logs signs in only an account that already made that connection.
  • For race and Mage talent values in the shadow resistance audit: an entry in the seed files, which today hold one guild's roster. Other guilds' players show ? and a flag until per-guild settings exist.
  • For the site operator: Warcraft Logs API credentials (WCL_CLIENT_ID and WCL_CLIENT_SECRET) in the server environment, and an OAuth client (AUTH_WARCRAFTLOGS_ID and AUTH_WARCRAFTLOGS_SECRET) for Connect Warcraft Logs; without the first, /ledger says Warcraft Logs is not configured.

Credits

  • Warcraft LogsAll report data comes from the Warcraft Logs v2 API, with the site's own client for public and unlisted reports and your own Warcraft Logs account for private ones. Warcraft Logs is a separate service; RaidKit is not affiliated with or endorsed by it.
  • wowsimsThe offline item, enchant and gem databases are built from the open-source wowsims TBC and WotLK repositories' tooltip dumps. Not affiliated.
  • WowheadResistance values, random-suffix tables and spell effects were verified against Wowhead TBC tooltips. Not affiliated.
  • Blizzard EntertainmentWorld of Warcraft and all related names are trademarks of Blizzard Entertainment. RaidKit is a fan-made project and is not affiliated with or endorsed by Blizzard.

Download & install

Nothing to install

  1. 1Nothing to install. Open raidkit.app/ledger in any modern browser.
  2. 2Paste a Warcraft Logs report URL or its 16-character code and click Open report (Audit it on the homepage). Public and unlisted reports need no account.
  3. 3For private reports: create a RaidKit account with Google, GitHub or an email address and password, sign in, go to Settings > Connections and click Connect Warcraft Logs. You approve RaidKit on warcraftlogs.com and come straight back.
  4. 4Share any /ledger/<code> or audit URL with your raid; they open without signing in unless the report is private.

Changelog

  1. 2026-09-12
    • Private reports open through the viewer's own Warcraft Logs connection: public and unlisted reports still use the site client, a not-found is retried with your token, and cached private data is served only after Warcraft Logs confirms your access on that request.
    • Report header now records visibility and owner; private reports never appear in Recent reports.
    • User tokens refresh through the refresh-token grant near expiry; a refused refresh asks you to reconnect.
    • Error notices show the next step beside the message: Sign in, Connect Warcraft Logs or Reconnect Warcraft Logs.
  2. 2026-09-11
    • Connect Warcraft Logs: an OAuth provider for warcraftlogs.com, Continue with Warcraft Logs on the sign-in page (for accounts that already connected it), and Settings > Connections with Connect, Reconnect and Disconnect.
    • Only Warcraft Logs tokens are stored (with your username there); disconnecting deletes them and is refused if it would remove the only way into the account.
    • RaidKit branding: site name, header wordmark and a homepage that leads straight into Raid Ledger with a plain form that works before JavaScript loads.
    • Report cache and the first pages: three database models cache the report header, per-fight snapshot and whole-report consumables lines; reports that ended in the last day are re-checked so a log loaded mid-raid does not stay frozen.
    • /ledger takes a report URL, /ledger/<code> lists boss fights, and /ledger/<code>/sr, /gear and /consumables run the engine on the server and hand a finished table to a sortable client table.
    • Race and talent settings come from the seed files until guild settings exist.
    • Warcraft Logs client in TypeScript, verified live: report header with trash flagged and ability names, fight snapshot from the Summary table and CombatantInfo events, and whole-report consumables lines with the boss-snapshot and trash-carry-forward rule.
    • One token source serves both the site's own client and a signed-in user's token; the live smoke test reproduces the Python numbers.
    • Engine ported from the wow-audit Python tool to TypeScript with parity tests: the Anniversary rules module, offline item, enchant and gem data (wowsims dump plus Anniversary extras), roster normalization and the three audits as pure modules.
    • Fixtures are the Python tool's own; the parity tests hold both implementations to the same numbers (174 gear SR and 244 buffed for one character's in-game sheet).

Full changelog for Raid Ledger

More from RaidKit