LibItemDB — Offline Item Database for WoW
LibItemDB is a lightweight library that lets any addon look up World of Warcraft items offline — resolve an item's name to its link or id (and back), and filter by type and subtype — without the item being in the game's cache.
WoW ships no searchable item table and no “find item by name” API. LibItemDB solves that by shipping a pre-built database captured from a full client item scan, so players never wait for a scan and addon authors get instant, reliable lookups.
This is a developer library. Install it if another addon lists it as a dependency, or depend on it if you are an addon author.
What it can do
- Resolve a name to a full, clickable item link — even for items you've never seen
- Resolve a name to an item id, or an id to name / quality / type / subtype / equip slot / item level
- Read an item's stats (strength, stamina, spell power, resistances, …)
- Read the buff a consumable grants on use — food, elixirs, flasks, potions, scrolls, sharpening stones and oils — as the same stats (e.g. +12 Stamina, +25 Agility), and browse them grouped by a category we classify ourselves (flask / elixir / potion / scroll / food / weapon), since the game files every vanilla consumable under a single type. Only real buffs are listed — bandages and other heal-over-time items grant no stat, so they stay out rather than showing up as a buff they aren't. Each consumable also knows its “one active at a time” group (one agility elixir, one strength buff, one flask, one food, one weapon oil, …), which the game itself never records — so a buffs planner can stop you from stacking two of the same kind
- Read the stats a raid, world, self or totem buff grants — Mark of the Wild, Battle Shout, Blessing of Might, the Dragonslayer and Songflower world buffs, shaman totems, and more — at every rank, so a planner can fold a player's active buffs into their totals. Percentage buffs (Blessing of Kings, Spirit of Zandalar, Sayge's Dark Fortune) are included as real percentages, not flat numbers. Ask for every buff in a category (raid / world / self / totem) at once, so a buff picker builds itself from the database instead of a hand-kept list
- Read any class's full talent tree — every tree, with tiers, prerequisites, ranks and names — so a planner can lay out a build for any class offline, not just the one you're logged in on (all the game itself will tell an addon) — plus each talent's stat effects (crit, hit, % stats, weapon-specific bonuses), so a planned build folds into gear scoring
- Look up where an item comes from — a raid or dungeon boss, a quest (and where it's done), a vendor, crafting, a PvP reward, or reputation gear (and which faction) — and list every item that drops in an instance, organised by instance and boss (great for wishlists and loot planners)
- Rank gear by Best-in-Slot / EP value for a class and spec — the top items for a slot, or "what to want from this raid" ranked, plus a full BiS gear list per phase. It reads the stats the game data hides — on-equip hit/crit, defense/dodge/parry/block, weapon skill, spell penetration — matches school-specific spell damage to the right caster, so a “+Fire damage” off-hand counts for a fire mage and not a frost one (generic “+spell damage” still counts for everyone), and values set bonuses and “Use:” / chance-on-hit effects, with a dedicated tank value scale for survival gear. Hunter quivers, ammo pouches and arrows/bullets are valued too — their ranged attack speed and damage are a real DPS gain that is otherwise ignored. Lists only gear your class and faction can actually obtain, and you can load your own BiS list or stat weights. Every value comes with a full breakdown — the stat, the uptime, the weight and the total — so you can see exactly how a number was reached
- A chance-on-hit effect is valued by what actually sets it off — not by how fast you swing. An effect can fire on a weapon swing, on a spell cast, on one of your damage-over-time ticks, or on you being struck, and the game files record which. A shield that procs when you are hit is rated by how often a boss hits you; a trinket that procs off your damage-over-time ticks is rated by how often those tick. Only the swing case follows your weapon, so equipping something faster no longer inflates the value of a shield or a caster trinket that has nothing to do with swinging
- Value a school-restricted item only for the specs that use that school. Tell the scorer which magic schools a spec actually casts and a “+Fire damage” piece stops adding its spell damage for a shadow priest — while its stamina, its crit and everything else still count, and a generic “+spell damage” item is untouched
- Score anything with stats on the same scale as gear — hand the library a buff, consumable, enchant or talent's stats and get back its EP value for a class and spec, computed by the very same scorer that ranks items. So “is this flask worth more than that trinket?” is a fair comparison, and a planner can total gear, buffs and a talent build together without inventing its own maths (which quietly gets mana-regen and spell-power consumables wrong)
- Carry other addons' tooltip lines into a tooltip an addon drew itself — AllTheThings, Recipe Master, Leatrix Plus, TradeSkillMaster, Auctionator and SmexyMats. A bridge, not a re-implementation: the lines are theirs, so they read exactly as they do everywhere else, icons and all. Most of these offer nothing for another addon to call — they simply add to the game's own tooltip — so the bridge replays what they already do onto the tooltip in front of you instead of asking them for anything. All optional, none required, and each is checked at the moment it is used, so an addon that updates or moves drops out of the tooltip instead of breaking it
- Read what a vendor pays you for an item — and unlike asking the game, it is there even for an item the character has never laid eyes on, so a bag or bank valuation never comes up blank while it waits for the game to answer. 18,140 items on Classic, 21,720 on Burning Crusade
- Read what a vendor charges for an item — the number the game only reveals while you are stood at a merchant with their window open, so a cost-to-craft can price the reagents you would simply buy (thread, vials, dye, flux) with no vendor in sight. Only items a vendor genuinely stocks in unlimited supply for gold are priced, so ore and herbs are correctly left out rather than given a price no shop would honour. It is the standard, before-discount price — reputation discounts are applied by the server as you buy and are never sent to addons
- Tell whether an item is restricted to a faction or class, or is a hidden/never-implemented item — so a planner can filter to what the player can really get
- Search by name, item type, subtype, quality, item-level range, and stat — e.g. plate that has strength
- Reconstruct random-suffix variants ("of the Bear", "of the Eagle", …) from a compact id pair, letting the game render the full, correctly-scaled tooltip
- Enumerate types/subtypes and iterate the entire database
For addon authors
local DB = LibStub("LibItemDB-1.0", true)
if DB and DB:IsReady() then
local link = DB:GetLink(19019) -- coloured, interactive Thunderfury link
local stats = DB:GetStats(13468) -- { ITEM_MOD_..._SHORT = n, ... }
local buff = DB:GetEffects(18045) -- Tender Wolf Steak use-effect: { ITEM_MOD_STAMINA_SHORT=12, ITEM_MOD_SPIRIT_SHORT=12 }
for _, r in ipairs(DB:Search({ classID = 4, stat = "STRENGTH" })) do print(r.link) end
-- where does it drop? (raid/dungeon + boss); and list an instance's loot
local drops = DB:GetSources(16921) -- { { instance="Onyxia's Lair", boss="Onyxia" }, ... }
for _, inst in ipairs(DB:GetInstances()) do
print(inst.name, #DB:GetInstanceItems(inst.key)) -- "Molten Core 125", ...
end
-- score a consumable's buff on the SAME scale as gear (4 = rogue, combat spec)
local ep = DB:ScoreStats(DB:GetEffects(13452), 4, "combat") -- Elixir of the Mongoose: ~38.8 EP
-- required PLAYER level to equip it -- not the item level, and they differ
local req = DB:GetRequiredLevel(19019) -- 60 (Thunderfury is item level 80)
-- what a vendor CHARGES you, in copper. The opposite of GetItemInfo's sellPrice
-- (what a vendor pays you), and the client has no API for it at all. This is the
-- BASE price -- a Neutral player's; reputation discounts are applied server-side.
-- nil means we have no vendor record, NOT proof that no vendor sells it: the
-- vendor list comes from a later expansion's data, so it can miss an old vendor.
local cost = DB:GetVendorBasePrice(2321) -- 100 (Fine Thread, 1s)
-- and the other direction: what a vendor PAYS you. GetItemInfo has this too, but
-- only once the item is cached -- this is always populated, even for an item the
-- player has never seen. Roughly a quarter of the buy price; never mix them up.
local paid = DB:GetVendorSellPrice(2321) -- 25
-- random suffix (field 8 of a modern link): rebuild and let the game render it
local s = DB:BuildItemString(15218, 1196) -- "item:15218::::::1196"
GameTooltip:SetHyperlink(s) -- full Crystal Sword of the Bear tooltip
-- an enchant (and, on TBC, up to four gems) can ride along so a stored link
-- rebuilds exactly as it was
local e = DB:BuildItemString(10132, 863, 2504) -- "item:10132:2504:::::863"
-- SCORE AN ITEM, and gate school-restricted spell damage to the schools this
-- spec actually casts. `schools` is a SET, and one match is enough. Omit it and
-- nothing changes -- a "+Fire" piece keeps its spell damage for everyone.
local ep = DB:GetItemScore(19019, 1, "fury", {
setBonus = true,
schools = { fire = true }, -- MINOR 24; see GetItemSchools
attack = { hitsPerSec = 1.4 }, -- paperdoll: WEAPON SWINGS ONLY
})
-- Itemised, for a tooltip: total == GetItemScore, and the factors of each row
-- multiply back to that row's ep, so you can render the whole derivation.
local b = DB:GetItemScoreBreakdown(19019, 1, "fury", { setBonus = true })
for _, p in ipairs(b.parts) do print(p.key, p.ep) end
-- A proc row says WHAT SETS IT OFF, in `sc`: "any" (weapon swing), "spell"
-- (a cast), "periodic" (a DoT tick) or "taken" (you were struck). Only "any"
-- follows opts.attack -- nothing in a paperdoll knows the other three. `pm` is
-- the raw client trigger mask the label came from, if you need a finer answer.
for _, row in ipairs(DB:GetProcEffect(1168) or {}) do -- Skullflame Shield
print(row.b, row.sc, row.pm) -- "damage taken 40"
end
end
Key methods, by what they answer:
- Identity & lookup —
IsReady,Count,HasItem,GetName,GetID,GetInfo,GetQuality,GetItemLevel,GetRequiredLevel,GetLink,GetItemType,Search,Iterate,GetClasses,GetSubClasses,ResolveName,GetMeta - Stats & effects —
GetStats,GetEffects,HasEffects,GetItemSchools,GetUseEffect,GetProcEffect,HasUnscoredProc - Prices —
GetVendorBasePrice(what a vendor charges),GetVendorSellPrice(what it pays you) - Random suffixes, enchants, gems —
BuildItemString,GetSuffixLink,GetRandomProperty,GetRandomProperties,HasRandomProperty,ResolveSuffix,GetGem,GetGems - Where it comes from —
GetSources,HasSources,HasSourceData,GetInstances,GetInstanceItems,GetInstanceEncounters,GetLootModules,GetLootCategories,GetLootSections - Sets —
GetItemSet,GetSet,GetSetBonusStats,GetSetBonusEP - Who can use it —
GetItemFaction,FactionUsable,GetPlayerFaction,GetItemClasses,ClassUsable,GetPlayerClass,IsHidden,GetSeason,IsSeasonalRealm - Scoring & ranking —
GetItemScore,GetItemScoreBreakdown,ScoreStats,RankItems,GetSlotRanking,GetRaidBiS,GetWeightStats,GetScoreModel,GetScoringVersion,HasScoring,HasBiSWeights - Best-in-Slot lists —
GetBiS,GetBiSItem,IsBiS,HasBiS,GetBiSSources,GetBiSSpecs,GetBiSPhases,GetDefaultBiSSource,SetDefaultBiSSource,GetBiSWeights - Buffs, consumables, talents —
GetAuraBuff,GetAuraBuffs,GetBuffCategories,GetBuffsInCategory,GetConsumableCategories,GetConsumableBuffs,GetConsumableGroup,GetTalentTree,GetTalentClasses,GetTalentEffect - Bring your own data —
LoadBiS,LoadBiSWeights,LoadScoreModel,RegisterScoring
Tooltip bridge (all optional, all no-ops when the other addon isn't there): ApplyExternalTooltipHooks, AttachExternalRecipeInfo, GetExternalPrices, GetExternalMaterialInfo, GetAvailableIntegrations.
-- Carry every installed addon's tooltip lines onto a tooltip you drew yourself.
-- Your tooltip must be a NAMED frame inheriting GameTooltipTemplate, and must be
-- populated first -- handlers ask it what it is showing. Call this BEFORE adding
-- your own lines. GameTooltip itself is never touched.
myTooltip:SetOwner(parent, "ANCHOR_RIGHT")
myTooltip:SetItemByID(itemID) -- or SetSpellByID
DB:ApplyExternalTooltipHooks(myTooltip, "OnTooltipSetItem")
myTooltip:Show()
-- Or read the numbers and lay them out yourself.
for _, p in ipairs(DB:GetExternalPrices(itemLink) or {}) do
print(p.label, p.formatted or p.value) -- formatted is nil for non-money sources
end
Calling it in a hot loop
Every getter is a decode of one packed string, so the library is cheap per call and the thing that actually costs you a frame is call volume. Measured against the shipped Vanilla data (17,604 items) on desktop Lua 5.1 — the game client is slower, so treat these as a floor:
GetInfo~2 µs ·GetStats~3.8 µs ·GetItemScore~7.8 µsGetSlotRankingwith nopool~8.4 ms — it is slot-indexed, so asking for all seventeen slots costs one pass over the database, not seventeen
The trap is not this library, it is what you recompute around it. A row builder that scores a few thousand items will call the scorer a few thousand times, which is fine; what is not fine is rebuilding the same constant context inside that loop. If you are reading the player's equipped weapons, or re-scoring their worn gear, once per row, that is the cost — not the lookup. Hoist it, and invalidate on PLAYER_EQUIPMENT_CHANGED, UNIT_INVENTORY_CHANGED (filtered to "player") and PLAYER_ENTERING_WORLD. That last one matters: GetInventoryItemID answers nil both for “slot empty” and “inventory has not loaded yet”, and you cannot tell them apart, so a cache built before login lands stays wrong all session.
Two smaller guarantees worth knowing: items that score equal come back in a stable order within a session, so a redrawn ranking will not reshuffle; and GetSlotRanking's speed-up carries no MINOR bump — same signature, same results, nothing to feature-gate.
Asking for something, or reporting a fault
Requests and findings between this library and the addons that consume it live in files rather than in anyone's memory, so a fix and its reason survive the session that produced them:
docs/LIBRARY_CONTRACTS.mdin this repo — where LibItemDB raises something with a consumer, and where a consumer's reply is mirrored back.- Your own
docs/LIBRARY_CONTRACTS.md— where you raise something with LibItemDB. Reply there rather than here: a session working your addon cannot write into this repo, so the loop is that each side writes in its own tree and LibItemDB mirrors the answer across. docs/AUDIT.md— this library's own defect record, append-only. Every fault above is in it with what it cost and how it stayed hidden.
Data coverage
Stats and item levels are language-independent and ship once; names ship per language (untranslated items fall back to English, so every language is complete). LibItemDB is available for every version except Retail.
- Vanilla (Era / Hardcore / SoD) — 24,127 items
- The Burning Crusade (Anniversary realms) — 30,032 items
- Mists of Pandaria (Classic) — 88,259 items
Every version is in all 12 client languages. Wrath and Cataclysm are added when those game versions are live again. (Retail is not supported.)
Not every feature is available on every version yet. Item lookups and consumable buffs work everywhere. Vanilla and Burning Crusade also have where-items-drop, item sets and set bonuses, class and faction restrictions, hidden-item filtering, and gear scoring. Ready-made best-in-slot gear lists are Vanilla-only for now. Nothing breaks where data is missing — those features simply don't appear.
Requirements
- Ace3 and VersionCheck-1.0 — auto-installed by CurseForge (they back the optional guild version-check)
- Nothing else is required. AllTheThings, Recipe Master, Leatrix Plus, TradeSkillMaster, Auctionator and SmexyMats are all optional — if you have one, its tooltip lines are carried through; if you don't, nothing changes and nothing is missing.
Recent Updates
v0.7.1 (2026-08-22) — A gear planner that froze the game is five times faster; and two data faults that every check had passed
- Fixed: opening a gear planner could freeze the game long enough for WoW to kill the script. A player on a brand-new character hit “script ran too long” twice. Asking this library for the best items in a slot made it read and score every one of the 17,604 items in the database — and then do it again for the next slot, and the next. Seventeen slots on one screen meant seventeen full passes over everything. It now sorts items by slot once and looks only at the ones that could possibly fit, which is five times faster per slot and takes a full planner screen from three quarters of a second to under a seventh — measured, on a desktop machine that is considerably faster than the game client.
- The error message named the wrong place, and chasing it would have fixed nothing. WoW's “too long” warning points at whatever line the game happened to be running when it gave up, not at whatever was slow. Both reports pointed at two-line functions that cannot take any time at all. The real cost was found by timing the library against its own shipped data rather than by reading the error.
- Fixed: on Classic, required-player-level was answering for seasonal items on non-seasonal realms. Seasonal content is meant to be kept in a separate file that only loads on the realms that have it. One file had escaped that split and shipped with all 15,652 rows in the always-loaded half as well — 5,108 of them seasonal. Nothing errored and every count matched, which is exactly why nobody had spotted it.
- Fixed: a data-build tool replaced 41,777 real Traditional Chinese item names with English, and reported success. When Blizzard's data source returns an incomplete set of translations, the tool is designed to fall back to English for the few names that are genuinely missing. A half-empty response is not an error, so it fell back for most of the file and overwrote good translations with English. The bad names were reverted, and the tool now refuses to write any language whose translations come back suspiciously incomplete — it leaves the existing file alone instead. It caught three more languages the very next time it ran.
- Nothing an addon calls has changed. Same functions, same arguments, same answers — there is no version to check for and nothing to update on your side. Ranked lists do now return items of equal score in a consistent order rather than shuffling between calls.
v0.7.0 (2026-08-20) — Both sides of a vendor transaction; and chance-on-hit effects valued by what actually sets them off
- Fixed: a shield that procs when you are hit was rated by how fast YOU attack. Every chance-on-hit effect was assumed to fire on a weapon swing, so its value moved with your weapon speed. That is right for a proc weapon and wrong for everything else — and it quietly affected around two dozen well-known items, Skullflame Shield, Freezing Band, Girdle of Reprisal, the Grand Marshal / High Warlord shields, Darkmoon Card: Vengeance among them. The game files record which of four things sets an effect off — a swing, a spell cast, one of your damage-over-time ticks, or you being struck — and each is now rated by the thing that actually causes it. Only the swing case follows your weapon.
- Fixed: a damage-over-time trinket was rated as though you were casting. Timbal's Focusing Crystal and the Ashtongue Talisman fire when your existing damage-over-time effects tick, which happens whether or not you are casting anything. They are now rated by how often those tick.
- The rates behind all of this come from measurement, not guesswork. How often a boss swings at you is read from the tested server data (two seconds, which is what the great majority of raid bosses use); how often a damage-over-time effect ticks is read from the game files (three seconds, for every standard one). Where a judgement remains — how many damage-over-time effects a spec keeps running — it is written down alongside the number rather than buried.
- A “+Fire damage” item can now be told to count only for specs that cast fire. An addon can hand the scorer the schools a spec actually uses, and school-restricted spell damage stops counting for the others — while the item's stamina, crit and everything else still count, and a plain “+spell damage” item is unaffected. Addons that don't ask for this see no change at all.
- Fixed: Alterac Valley and Arathi Basin reputation rewards lost their faction. A change in Blizzard's own data layout meant 155 items — the Stormpike and Frostwolf reward gear, both faction mounts — came back as available to everyone, so an Alliance/Horde filter stopped hiding the other side's rewards.
- Fixed: on Burning Crusade, the racial mounts were sold to everybody. The same data-layout change had gone uncorrected in the Burning Crusade data, where it cost 151 items — and what came back says exactly what was wrong: the racial mounts. The Horn of the Black Wolf and Horn of the Red Wolf read as available to Alliance, the Black Stallion, Pinto and Chestnut Mare Bridles as available to Horde. Those are the items whose faction comes from nothing but the race that can ride them, so they were the first to break and the last to be noticed. Burning Crusade now knows 284 faction-restricted items where it knew 133.
- Fixed: a fifth of Classic items had forgotten what level you need to be. Required player level was added in v0.5.0, but the Classic file shipped with only two thirds of its rows while claiming to have them all — so 5,108 items answered “no level requirement” when asked, which is a real answer rather than a blank one. An addon sorting a bag by level, or greying out what you cannot equip yet, got a confident wrong answer with nothing to suggest it. All 15,652 are there now, and the file's own count and contents were checked against each other rather than taken on trust.
- Items now know what a vendor will pay you — and they know it even for an item your character has never seen. The game can answer this, but only once it has loaded that item, so an addon valuing a bank or a bag of loot gets blank rows that fill in a moment later, or not at all. Reading it here means the number is simply there. 18,140 items on Classic and 21,720 on Burning Crusade.
- Items now know what a vendor would charge you for them. The game tells an addon what a vendor will pay you for an item, but never what it would cost to buy one — that number only exists while you are stood at a merchant with their window open. So an addon working out what a craft costs had no way to price the pieces you would simply buy: thread, vials, dye, flux, salt. Those now carry a price whether or not a vendor is anywhere near you. 862 items on Classic and 1,708 on Burning Crusade.
- Only things a vendor really sells are priced. The game files carry a nominal price for almost every item in existence, including ore, herbs and leather that no vendor has ever stocked — so listing those prices would have invented a shop that does not exist. An item is only priced here if a vendor genuinely keeps it in unlimited supply for gold, which is why Thorium Ore has no price and Fine Thread does.
- It is the standard price, before reputation discounts. The discount you get for standing with a faction is worked out by the server at the moment you buy, and is never sent to your addons, so anything above Neutral will pay less than the figure shown. Addons that already track what you were actually charged — or read Auctionator's record of it — will keep using that in preference; this fills in the gap where nothing else can answer at all.
v0.6.0 (2026-08-06) — Your other addons' tooltip information, on tooltips they don't normally reach
- A bridge for the addons you already run. When an addon in the TOG suite draws its own tooltip — a recipe, a reagent, an item it built the display for itself — it can now carry the same lines you would see from AllTheThings, Recipe Master, Leatrix Plus, TradeSkillMaster, Auctionator and SmexyMats. Same information, same wording, same icons, because it is their output rather than a re-creation of it.
- It reaches addons that offer nothing to ask. Most tooltip addons don't provide anything another addon can call — they just quietly add their lines to the game's own tooltip. Rather than asking them for data, the bridge replays exactly what they already do, pointed at the tooltip in front of you. Recipe Master and Leatrix Plus are only reachable this way, and it means an addon we have never heard of can start contributing without a single change here.
- Nothing is required and nothing changes if you don't use them. Each one is detected only if you have it installed and switched on, every call is guarded, and an addon that updates or moves simply drops out of the tooltip — it never breaks the rest of it.
- It works where those addons normally can't reach. The clearest case is a profession recipe taught by a trainer, which has no scroll item for a tooltip to hang off — exactly where a hand-built tooltip used to come up blank.
- Recipe-scroll information moved to Lib: ProfessionDB. Knowing which item teaches which recipe is profession knowledge rather than item knowledge, so it now lives in the professions database alongside reagents, skill requirements and difficulty. Nothing is lost — addons ask ProfessionDB which item teaches a recipe, and ItemDB what that item is called and what its link is. If you use an addon that shows professions, make sure Lib: ProfessionDB is up to date.
v0.5.0 (2026-08-03) — Burning Crusade grows up: real Outland loot, the Classic raids, and a lot more item knowledge
- Fixed: Burning Crusade was showing Classic's raids. Where-it-drops on TBC listed Molten Core, Blackwing Lair and Ahn'Qiraj — the Classic instance list — with no Outland content at all, and it looked like it was working. TBC now has its own: Karazhan, Serpentshrine Cavern, Tempest Keep, Mount Hyjal, Black Temple, Sunwell Plateau, Zul'Aman, Gruul's Lair, Magtheridon's Lair and all fifteen Outland dungeons — 26 instances, 120 bosses.
- Seven kinds of item knowledge added for Burning Crusade. Item sets and their set bonuses, which classes can use an item, which faction it belongs to, the on-equip and “Use:” effects the game hides from addons, spell-school-specific damage, mounts, and the filtering of test items that were never really in the game.
- Fixed: every Blood Elf and Draenei item counted as neutral. Faction restrictions came back empty for Burning Crusade, so an addon couldn't tell Alliance-only gear from Horde-only gear.
- Fixed: hidden test items were showing up on Burning Crusade in item pickers and searches.
- Gear scoring now works on Burning Crusade. Stat weights for all 37 class specs, so items can be valued and ranked, and “what should I want from this raid” works there too — including the stats Classic never had, like expertise, haste and resilience. Ready-made best-in-slot lists are in as well, for 8 classes across every phase.
- Gem sockets count towards an item's value. An empty socket is worth whatever you put in it, so it's valued at the best gem that fits — and because that depends on your spec, a red socket is worth more to a warrior than to a mage. Meta sockets only ever count meta gems.
- Talents, buffs and reputation rewards for Burning Crusade. Every class's talent trees and the stat bonuses they grant, raid and world buff values, and the reputation and PvP reward gear — Honor, all four Arena seasons, and the Outland zone quartermasters.
- Where every Burning Crusade item comes from. Over 13,000 items now say where they're found — the quest and its zone, the vendor, the profession that crafts it, or the creature that drops it — instead of reading “Other”. Consumables also know the Burning Crusade rules: which are battle elixirs, which are guardian elixirs, and that a flask replaces both.
- Each game version now has its own gear-scoring rules. Burning Crusade uses combat ratings where Classic uses flat percentages, and Classic has weapon skill where Burning Crusade has none — so they can no longer affect one another, and a gear-weight editor only ever offers the stats that version really has.
- Instances now say which expansion they belong to. With Burning Crusade carrying both its own raids and the Classic ones, an addon had no way to tell them apart — so a planner couldn't put current content at the top and tuck the older, still-runnable raids into their own group. Each instance now carries its expansion, so “Karazhan” and “Molten Core” can be grouped separately on the same character.
- Fixed: on Burning Crusade, nothing from the base game had a drop source. Where-it-drops on TBC listed only the 26 Outland instances — Molten Core, Blackwing Lair, Ahn'Qiraj, Onyxia, Zul'Gurub and Naxxramas were missing entirely, so none of that gear could be looked up or planned for. Those raids are still there and still runnable at 70, and people still farm them for mounts, transmog and old-content clears. Burning Crusade now carries both: 59 instances and 3,846 items, Molten Core through Sunwell Plateau. (Classic itself is unchanged.)
- Fixed: the Chronoboon Displacer was missing on Classic Era. Items added to Classic Era after the original game — the Chronoboon and its supercharged form, the Love is in the Air and Midsummer event items, and a few others — were being treated as Season of Discovery content and left out on Era realms, so an addon couldn't identify one sitting in a bag or guild bank. Eleven items are back. The separation now comes from AllTheThings' own curated lists rather than a guess based on the item's number, which is what got these wrong; the Season of Discovery items it was meant to keep out are still kept out.
- Items now know what level you need to be to use them. The database carried an item's item level but not the level a character must reach to equip it — and those are different numbers (Thunderfury is item level 80 but usable at 60). Sorting a bag or bank by “level” almost always means the second one, and until now an addon had to ask the game and cope with it answering nothing until the item had been seen. 15,652 Classic items and 18,279 Burning Crusade items carry it.
- Enchants and gems survive a rebuilt item link. When the library reconstructed a link it kept the item and its random suffix but silently dropped any enchant — so an addon that stored a link and rebuilt it later showed the item as unenchanted. Enchants are preserved now, and on Burning Crusade so are all four gem sockets.
v0.4.7 (2026-08-02) — Consumables know which ones can't stack, and buffs score like gear
- One of each kind — the database now knows the rule. WoW only lets you hold one agility elixir, one strength buff, one flask, one food, one weapon oil and so on at a time, but it never records that grouping anywhere an addon can read. Each consumable buff now carries its “one active at a time” group, so a buffs planner can stop you picking two that would cancel each other — and it correctly knows the finer Classic rules the game is vague about (Mageblood Potion counts as a mana elixir, so it happily sits alongside an agility or strength elixir). Drawn from the same tested WoWSims data behind the gear rankings, not guessed.
- Buffs, consumables, enchants and talents can now be valued like gear. The gear scorer only ever accepted an item, so an addon wanting to know what a flask or a talent build is worth had to add up the stats itself — and that gets it wrong in a way nobody spots, because the buff data and the stat weights spell mana-regen and spell-power differently, so those consumables silently came out as zero. Hand the library any set of stats and it now returns the same EP value it would give those stats on an item, so gear, buffs and talents finally add up on one scale. Flat health and mana pools are valued too, so Flask of the Titans and Flask of Distilled Wisdom stop scoring as nothing.
- Fixed: every bandage claimed to give mana. A wrong reading of the game's data had heal-over-time effects recorded as mana — so all 24 bandages, plus several restore potions, were listed as buffs granting mana they never gave (a Heavy Runecloth Bandage read as “+250 mana”). Bandages and restore potions heal; they don't buff a stat, so they no longer appear as buffs at all. This affected all three game versions and is corrected in each.
v0.4.6 (2026-07-31) — Buffs, talents, and a self-building buff / consumable browser
- Plan a talent build for any class, offline. Every class's full talent tree — all three trees, with tiers, prerequisites, ranks and names — is now in the database. The game only lets an addon read the talent tree of the class you're currently on, so a planner could never lay out a build for another class; now it can, for any class on any character.
- Talents feed gear scoring. The stat bonuses a build grants — crit, hit, % to your stats, attack power, armor, dodge/parry/block, weapon skill — are read too, so a planner can value gear for the build you're actually playing. Weapon-specific bonuses are handled properly (an axe-crit talent only counts while you're holding an axe).
- Buffs now carry their stats, at every rank. The strength a buff adds — Mark of the Wild, Battle Shout, Blessing of Might and Wisdom, Power Word: Fortitude, the Dragonslayer and Songflower world buffs, hunter aspects, shaman totems, and more — is now in the database, so a planner can fold a player's active buffs into their totals instead of hardcoding them. Every rank is there; read whichever one you want.
- Percentage buffs count as real percentages. Blessing of Kings (+10% stats), Spirit of Zandalar (+15%), Mol'dar's Moxie (+15% stamina) and the Sayge's Dark Fortune buffs are stored as true percentages a planner applies on top of your gear — not a flat number that can't scale.
- Buff and consumable pickers build themselves. Ask for every buff in a category (raid / world / self / totem), or every use-effect consumable, and the database hands back the whole list — so a buffs tab stays complete on its own instead of drifting from a hand-maintained list. Anything added to the database appears automatically, and flagged test items stay out.
- Every consumable buff, sorted into the right shelf. Flasks, elixirs, potions, scrolls, food, sharpening stones and weapon oils are all captured — including the Dire Maul Jujus, the Zandalar and Badlands buffs, and the resistance Protection Potions. Because the game files every vanilla consumable as one undifferentiated type, the library sorts them into flask / elixir / potion / scroll / food / weapon for you.
Credits
Drop-source loot tables are derived from AtlasLootClassic. Best-in-Slot gear sets come from WoWSims — which also provides the weapon-skill scoring maths (the Classic attack-table formula) and the handful of feral-attack-power values the game keeps only in tooltip text. The EP stat weights are HawsJon's Classic weights (tbcwowaddons.weebly.com), as shipped with Pawn by Vger — used unchanged and with thanks. Weapon and trinket proc rates and item source locations (quests, vendors, crafting, PvP and reputation gear) come from the tested CMaNGOS vanilla server database. The list of items that exist in the game files but were never actually obtainable (or were removed in a past patch) comes from AllTheThings. LibItemDB doesn't redistribute any of their files; it re-expresses the underlying facts in its own format. All other item data is built from Blizzard's own client data via wago.tools.
Support
Questions, bug reports, or coverage requests — reach out on Discord.

