Skip to content

v1.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 25 Aug 22:18
· 3 commits to main since this release

Changelog

Release notes for Warband.pro Companion. The packager sends the section matching the tag to CurseForge, Wago, and WoWInterface verbatim, so this is what players read — not the commit log.

The release workflow looks for ## [1.0.1] exactly. A tag without a matching heading here fails the release before anything is published. Write the section first, then tag.

It also reads the section for machine-written marketing voice and fails on that — same check, so run it yourself before you tag:

node tools/slop.mjs 1.0.2

CI runs it against ## [Unreleased] on every push, so notes written as you go are already clean at tag time. The rules are in tools/slop.mjs and they only flag borrowed phrasing, keynote voice, and adjectives standing in for numbers — the terse fragments and em dashes here are the house style and stay.

Format follows Keep a Changelog.
Versions follow semver, with the wire format as the thing being versioned:

  • MAJORwb1!wb2!. The website rejects old strings with "update your addon".
  • MINOR — a new optional field or capture. The website still reads older bundles.
  • PATCH — a fix. Payload shape unchanged.

The wire contract itself is specified in docs/CONTRACT.md.

Unreleased

1.5.0 — 2026-08-25 — one window, and three ways into it

Everything this addon does now lives behind one panel, and there is finally
an icon to open it with.
1.4.0 added the clear-out list as a second frame, so
there were two windows and no way from one to the other. This is one window
with tabs along the bottom the way the game's own panels do it, built from
Blizzard's frame templates so it follows your UI scale and fonts with no
setting of its own. Open it from the minimap, a key, the addon compartment or
/warband.

Added

  • A minimap button. Click it for the export string, right-click it for the
    options, drag it anywhere round the ring. Hovering says how many characters
    are stored and how fresh the freshest one is, which is usually the whole
    question. /warband minimap off takes it away and the addon compartment
    still opens the window.
  • A keybinding. Key Bindings > Warband.pro Companion > Open the export window,
    so the four to ten exports a play night cost one key instead of typing into
    chat. It ships unbound — picking a key for you would take one you had
    already spent.
  • An Options tab. Gear capture and item links were slash-and-SavedVariables
    toggles before; they are checkboxes now, and /warband gear on|off still
    works.
  • Open the clear-out list at merchants — off by default. When a merchant
    window opens and the list has something in your bags, the Import tab opens
    by itself and closes when you leave the merchant.
  • /warband options opens the window on that tab.
  • The panel says copied when you press Ctrl+C, and /warband status reports
    when you actually copied rather than when you last opened the window.
  • One line on your first login after installing, naming the command. Nothing
    else this addon does prints anything, which is right every night except the
    first.
  • The clear-out list says what to do with each item, not only why it is on the
    list. An item warband.pro says to delete by hand no longer shows a Sell
    button — the game would not let that button work anyway.
  • A paste into the clear-out box now says what it read, and says so when it
    replaced a list you already had.

Changed

  • One window instead of two. /warband junk goes to the Import tab; the
    clear-out list, its paste box, Sell and Disenchant all live there and work
    as before. Esc still closes, the export string still selects itself.
  • One icon everywhere. The addon compartment, the window's portrait and the
    minimap button are the same purple crystal. It used to be a bag, which is
    hard to pick out of a ring of other brown icons.
  • The tabs are named by direction: To warband.pro and From warband.pro.
    They read Export and Import, which is backwards from the site's own words:
    the site calls receiving this string an import, so a player who had just
    clicked import in the browser opened the tab called Import and was on the
    wrong one.
  • Step 2 of the copy instructions says what the site actually does: press i,
    paste, Enter. It said "warband.pro > Import", a destination that never
    existed.
  • Combat now closes only the Import tab (its buttons cannot be rewritten
    mid-fight). An export string left open through a ready-check stays open.

Fixed

  • Three warnings on every login, from Bindings.xml being listed in the
    .toc as well as loaded by the client. The keybinding also sat under a
    heading called WARBANDPRO as a row called WARBANDPRO_TOGGLE; it reads as
    words now.
  • Pasting a cleanup string into the clear-out panel errored before the
    decoder ever ran: the wbc1! prefix was defined in the test fixture but
    not in the addon.
  • Junk lists now clear when their character is gone — even from a manual
    SavedVariables edit. Matches the warbank orphan guard that already ran on
    every optimize.

1.4.0 — 2026-08-23 — the clear-out panel

The first thing warband.pro has ever sent back. Until now this addon only
talked outward: you pasted a string into the site and that was the end of the
conversation. /warband junk is the other half. Copy the cleanup list off
warband.pro's gear page, paste it here, and you get a list of what to get rid
of — with a Sell button that works at any merchant and, if you are an
enchanter, a Disenchant button beside it.

Added

  • /warband junk — the clear-out panel. Paste box at the top, one row per
    item, an age line so you can see how old the list is.
  • Sell at a merchant. The button is dark until a merchant window is open, and
    the item it sells is the one on that row.
  • Disenchant, for enchanters. This is your click, not the addon's — the game
    does not allow an addon to cast for you, and this addon does not try. Your
    profession is checked when the panel draws, not when the list was made, so
    dropping enchanting does not leave a button that casts nothing.
  • Grey vendor trash is listed too, and it never came from the website. Your
    bags right now are the only honest source for that, and the site's copy is
    as old as your last paste.
  • wbc1!, the return format. Its own prefix rather than the reserved wb2!,
    which is still for a breaking change to the export string.

How it finds your items

Not by bag position. The list is made from an export you took earlier, and
by the time it comes back you have looted, sold, sorted and run a dungeon —
bag slot 14 is not what it was. Selling by remembered position would eventually
sell the wrong thing, so the panel matches items by their full item string and
takes the position from the bags as they are at that moment.

A consequence worth knowing: items you have already got rid of, or moved to the
bank, simply drop off the list, and the header counts them as no longer in your
bags. Two copies of the same item both get listed from one entry.

Safety

  • The panel closes when you enter combat and comes back when you leave. Nothing
    is rewritten mid-fight, which is also why nothing goes stale behind you.
  • Pasting your export string into the paste box says so, rather than calling it
    invalid — it is a perfectly good string, just the wrong direction.
  • The decoder is hand-written and reads exactly one shape. It does not run
    anything it reads, and 49 tests run against it on every push, including the
    real string the website produces.
  • Nothing is ever deleted. The panel can say an item is worth deleting; the
    keystrokes are yours.

1.3.0 — 2026-08-23 — bag gear actually reaches the wire, and it has a name

Every bag, bank and warband-tab gear entry was being dropped before it
reached the wire — since 1.1.0.
The classifier read GetItemInfoInstant's
icon (return 5) where it meant the equip location (return 4). The lookup that
sorts an item into its slot is keyed by INVTYPE_* strings, an icon file id
matches none of them, and every owned item fell through. Equipped gear walks
fixed slot numbers and never consults the equip location, so the export looked
populated the whole time — warband.pro's best-in-bags, upgrade column and
cleanup list have been reading an empty array for two minor versions. Found
from a user's real export: 16 gear[] entries, all where:"equipped", beside
a bag holding seven items another tool could see.

Fixed

  • Bag, bank and warband-bank gear entries are captured again. One destructuring
    read equipLoc at the wrong position; tools/gear-test.lua now stands a
    fake client in front of the classifier — with a valid INVTYPE_* string
    planted in the icon position — so this exact drift sorts items into the
    wrong slot and fails CI loudly instead of dropping them and passing as an
    empty bag.
  • A ding is noticed when it happens. Scan.Identity — the pass that reads your
    level, XP, rested XP, zone and item level — only ran at login and on a loading
    screen. Level in the open world, type /warband copy, and the string carried
    the level you were an hour ago; it corrected itself the next time you zoned or
    logged out. PLAYER_LEVEL_UP and PLAYER_LEVEL_CHANGED now run the same pass,
    one second later so UnitLevel has caught up.

Added

  • Owned gear entries carry five new optional fields, so warband.pro's cleanup
    view can name what it judges: n (display name, from the item's own
    hyperlink — the website has no item-id-to-name lookup), q (numeric
    quality), b (soulbound, sent only when true — absence means not bound),
    cls and sub (item class and subclass ids, which is what lets the website
    call plate on a mage unwearable). Equipped entries never carry them: the
    Profile API already answers all five for what is worn. All additive on
    wb1!; older bundles keep decoding.

  • Measured on the six-character sample: +0.85KB of JSON and +0.15KB of wire
    per character
    , or about +3KB of wire at the 20-character cap. Names repeat
    their words across a warband and deflate folds the repeats. Update and paste
    again; nothing about your stored data needs clearing.

1.2.0 — 2026-08-21 — every vault slot, not only the summary

The Great Vault has two axes and this addon was sending one. A raid slot
has a threshold and a difficulty it will pay at, and the difficulty is not
chosen — the game pays each slot at the difficulty of the kill sitting at that
slot's threshold, so slot 1 pays your second best kill and slot 2 your fourth.
What went on the wire was one collapsed summary per row: the furthest any slot
had got, and the next threshold still reachable. The thresholds of slots
already earned were gone with it, so warband.pro could not say the most useful
sentence there is about a raid night — that the slot you already own goes up a
difficulty if you kill one more boss — and told a live camp 2 more for vault slot 2 when slot 1 was already theirs at normal, one heroic kill from paying
heroic.

  • weeklyVault.rows[], per bucket. One entry per slot: its own threshold,
    its own progress, the client's raw level, and — on the raid row — the
    difficulty that level resolves to. About 90 bytes per bucket before deflate
    folds the repeated keys; the new v1-vault contract vector round-trips 705
    bytes of JSON to 476 on the wire.

  • The difficulty is resolved here rather than guessed at by the website.
    level means a different thing on every row — a keystone level on mythic+, a
    difficulty id on raid — so it is looked up against the client's own
    difficulty table, on the raid row only, and left out entirely when that
    lookup declines to answer. GetDifficultyInfo(14) returns "Normal" whether
    the 14 arrived as a raid difficulty or as a +14 key, and a plausible wrong
    answer is worse than none at all.

  • level is no longer sent on the raid bucket. It was a max across slots,
    which is fine for a keystone level and wrong for a difficulty id: raid ids
    sort LFR (17) above Mythic (16), so the "best" slot it named could be the
    worst one. Nothing ever read it, and rows[].d is what it was reaching for.

  • Wire stays wb1!. rows is additive and optional. A site that ignores
    it reads this bundle exactly as it read the last one, and warband.pro still
    reads bundles from every earlier version.

  • Fixed — a bag move rebuilt gear[] from a fresh walk of every container,
    closed bank and warband tabs included. A closed bank reports no slots, so
    bank and warband-tab gear could vanish from the next bundle until you stood
    at a banker again. Bag, bank, and warband-tab gear are now tracked
    separately and only replaced when that scope is actually rescanned.

  • Added /warband perf — scan timing per section, container and slot
    counts, item-info cache hit rate, and addon memory.

  • Moving one item no longer walks the bank and every warband tab checking for
    gear and consumables — each scope now walks only its own containers.

  • Container, gear, and talent scans hold off during combat and run the moment
    it ends, the same way the export panel already does.

  • /warband status and a repeat /warband copy no longer rebuild and
    recompress the whole bundle when nothing has changed since the last call.

1.1.0 — 2026-08-20 — gear and talents on the wire

warband.pro's gear profile and SimC exporter shipped reading only the
Blizzard API, which already covers everything equipped.
What it cannot see
is inventory — a bag or bank holding a better piece than what you're
wearing — and that is what this release sends.

  • gear[], per character. Every equipped item, plus anything in a bag,
    personal bank, or warband bank that could be equipped. Each entry carries
    the item string verbatim — the same substring SimulationCraft's own addon
    exports, and the same one the in-game item link uses between |H and
    |h — so bonus IDs, enchant, gems, and crafted-stat choices all make the
    trip losslessly, along with the item level Blizzard's API cannot see for
    anything you are not wearing. Shirt and tabard are skipped everywhere, same
    as the website's own gear model.
  • talents, per character. The active spec's talent loadout string, plus
    every other spec you have played on that character — only the spec you are
    standing in is readable at any moment, so the list fills in over time rather
    than replacing itself.
  • race, per character. The last field the SimC exporter needed that
    this addon was not already sending.
  • /warband gear on / off. Gear capture is on by default. Turning it
    off leaves what was already captured in place and just leaves it out of the
    next copied string — turn it back on and it is there again, no rescan
    required. /warband status now reports gear piece count and known specs.
  • Wire stays wb1!. Both fields are additive and optional; warband.pro
    reads bundles from every earlier version exactly as before, and a bundle
    from this version still imports on a site that has not added support for
    the new fields yet.

No breaking change, no migration. docs/CONTRACT.md documents the item-string
parse rules for anyone building against this.

1.0.2 — 2026-08-20 — fix the empty export box

If /warband gave you an empty box on 1.0.0 or 1.0.1, this is the fix. Update and it works.

  • Empty export box fixed. The panel would say "Could not build the bundle" and hand you nothing, no matter how many characters were stored. The addon vendors LibDeflate to compress your bundle, and on any client where another addon had already registered LibDeflate first, ours never reached the addon and compression could not run. That is the common case, not the rare one — LibDeflate ships inside a lot of addons. We now fall back to the copy already loaded.
  • /warband status says why a build failed. The panel points at status for the detail, and status was not showing it. A failed bundle now prints its reason on its own line.
  • WoWInterface placeholder removed from the .toc. It was set to 00000. Harmless while no WoWInterface token exists, but the moment one was added the packager would have attempted an upload to a project that does not exist and failed the release instead of skipping the site.
  • Docs. /warband dump was documented in the README and wiki but has never existed. Removed. Wiki troubleshooting also gave the wrong cause for an empty string and now leads with /warband status.

No wire format change. Still wb1!, still v: 1, and warband.pro reads 1.0.0 and 1.0.1 bundles exactly as before.

One correction to the 1.0.0 notes: this addon still ships no LibStub and registers nothing with it, but it will now read one that another addon provides, which is what the fix above does.

1.0.1 — 2026-08-19 — wire CurseForge auto packaging

  • Set ## X-Curse-Project-ID: 1660174 so BigWigs packager targets the real CurseForge project instead of placeholder 000000. Enables CurseForge automatic packaging via org secret CF_API_KEY.
  • No code changes, no wire format change, still wb1!.

1.0.0 — 2026-08-19 — Warband.pro Companion launch

First CurseForge release.

Warband.pro Companion — companion addon for warband.pro (https://warband.pro). You play normally, log alts 2..6 through the week with zero extra steps — account-wide WarbandProDB GUID-keyed updates silently on login, bag move (.5s throttle), bank open, vault open, mail.

Any char: /warband → auto-highlighted box → Ctrl+C copies wb1!aH... (multi-char bundle default, 4-7KB for 6 chars, ~26KB with full bag contents). Paste on warband.pro Import (hotkey i) → preview 🟢🟡🔴 → Confirm. Missing chars stay ⚪ never, stale just lowers confidence.

What it captures — Altoholic + SavedInstances superset, pruned Midnight 12.1:

  • Bags, bank+bags, reagentBank, warbandBank with seenByGuid/tabs
  • Gold, currencies with weeklyMax/isAccountWide — Crests, Flightstones, Tender
  • Professions skill/max, mail count+goldPending, auctions count+goldHeld
  • Lockouts LFR/N/H/M with bosses killed + resetTime, worldBosses
  • Keystone level/dungeonID, M+ runs timed/chest, score, weeklyVault raid/mplus/world thresholds
  • Consumables rollup for Tonight Plan, per-section seenAt for staleness dots

Trust: no network ever, <200KB for 6 chars, no OnUpdate scanner, copy-only, vanilla Lua no Ace3/LibStub, zero deps except vendored LibDeflate MIT zlib (license in Vendor/LibDeflate.lua header).

Retail Midnight 12.1 only. Works with whatever UI you run.

Then future tags auto-upload via BigWigs packager once Project IDs are set.