Changelog
The realm's development history, newest first. Each week has a quick player-facing summary and the technical detail behind it - a lot of it driven by player feedback.
10 - 16 August 2026
For players
- Racial traits bought from Swirl, the racial trait swapper, now stay with your character. Until this release they disappeared at the next login and never came back, however many times you bought them again: on the way in, the realm refused to hand a character a trait belonging to another race. Nothing was lost in the meantime — every character who already paid for a swap gets it back at his next connection, with nothing to do.
- Bringing a character in from another AzerothCore server carries its pets across. Hand the operator a standard character dump and it is restored onto your account here with gear, bags, bank, quests, achievements, reputations, professions and the pets in your stable intact. Anything the dump carries that cannot exist here is dropped on the way in rather than landing broken: a quest this realm does not have, a spell it does not know, a \"crafted by\" stamp naming someone who never had the profession. The buffs you happened to be running at logout do not come across either — they would have expired anyway — unless one of them is what lets you continue a quest.
- A new optional add-on, Warden, folds commanding a squad of bots into one window: click a bot and click a talent spec to apply it, summon a whole raid class by class, and give movement or target orders to everyone at once. Nothing it does is exclusive to it — every one of those orders can still be typed by hand — so installing it is purely a comfort choice. You install it like any add-on, by unzipping the folder into
World of Warcraft/Interface/AddOns; the download sits in the PlayerBots card on the Modules page. Druid bots also gain a bear pvp talent preset, so asking a feral tank for its PvP build now gives you one instead of being quietly ignored. - The Warstorm-Warden panel for commanding your bots now has its own section in the PlayerBots card on the Modules page — a short description, install instructions and a download button. And the home page's CustomItemFix panel now presents that add-on as strongly recommended rather than required: the realm plays fine without it, it only affects how the realm's custom items are displayed.
- New mirror images: type
.mirror <n>—.mirror 4summons four exact copies of your character, gear included, that follow you and fight the way you fight: they run into melee when you swing a weapon, and when you attack at range — bow, gun, crossbow, even a wand — they shoot alongside you, at your own cadence and your own ranged damage, holding their fire exactly when you cannot fire (throwing weapons are the one exception: those images stay in melee). They also repeat the combat spells you deliberately cast, heals and totems included, computed with your own power — same spell damage, same healing bonus, same talents — so an image's spell or heal lands just like your own; a heal you cast on yourself lands once more per image, and damage- or healing-over-time effects stack once per image. Monsters can neither target nor hurt the images, and everything they do draws the monsters' attention onto you, so a fight unfolds exactly as if you had done it all yourself. They are strictly for fighting monsters: they never act against another player, and they step down on their own the moment any player-versus-player situation starts — flagging for PvP, a duel, a free-for-all zone. They also vanish when you die, teleport anywhere or log out;.mirror 0dismisses them on the spot. If you lead a party of PlayerBots, your images extend to them:.playerbots mirrorgives every bot under your command as many images of itself as you currently have —.playerbots mirror <name>for just that one bot — and with zero images of your own it dismisses theirs instead. Each bot obeys the same rules you do, and a bot's images vanish on their own when it dies, leaves your command or logs out. - The Adventure Assistant's automatic buffs and automatic healing now also cover the PlayerBots under your command. With the option on, every bot under your own command in the group is kept under the same buffs as you and your pet, and receives the same emergency heal when its health drops low — a real player in your group is never touched, nor is a bot commanded by another player. One click on the buff or heal toggle in the Settings menu covers you, your pet and your bots together;
.aa enable automaticbuffs botsand.aa enable automatichealing bots(ordisable) adjust just the bot part, exactly like the existingpetvariants. - Bonus loot enchants now follow the item's own stats rather than your talents. A piece with Intellect and Spell Power rolls caster enchants no matter who loots it, a Strength breastplate rolls melee enchants, a shield stacked with defense rolls tank enchants — so a drop you pass to an alt or trade to a friend arrives with enchants that fit the piece. When an item's stats do not commit to a role — a stat-less weapon, a piece with nothing but Stamina — the enchant matches your current talents, exactly as before.
- In Icecrown Citadel, the door to the Crimson Hall opens again once the four darkfallen guarding its entrance are defeated, restoring the way to the Blood Prince Council in 10- and 25-player mode alike. Pulling one of those guards also draws its nearby allies into the fight together again, as intended.
- A new craftsman answers the Adventure Assistant: Karl Fabergem, a dwarf jeweler, rewrites the bonuses on the gear you are wearing. Summon him with
.aa→ "Call the Reforger", show him a piece you have on, pick one of its seven bonus slots, pick the kind of bonus and how strong you want it, and he writes it in. He also sets gems into pieces that have no gem holes at all, cutting the opening himself at no extra charge. He invents nothing — only bonuses the game already contains — but he puts no restriction on which piece receives what, so a bonus normally reserved for boots can go on a breastplate. Each entry shows in green or red whether your character is already high enough level, or trained enough, to feel the effect; you may buy it anyway and grow into it later. Before you confirm, he names the price and everything the operation will write over. What you pay follows the strength of the bonus rather than the worth of the piece, so kitting out a beginner costs a few coins while a fully optimized set is a serious investment — the price is per operation, redoing the same spot costs again, and there are no refunds. He never empties a spot, and a bonus that makes a piece untradeable while it sits there is undone by writing a bonus that does not bind over the same spot. Two everyday actions of your own write over his work: setting a gem by hand, and applying an oil, a sharpening stone or a poison. Nothing he writes runs out on its own, and entering the arena takes none of it away — worn on the character or stowed in your bags, the piece comes through untouched. He also speaks your own language: the menus, the prices, the confirmation box and every word he says follow your game client.
Under the hood
- Two follow-ups on the same seam, one of them a defect players lived with.
Player::CheckSkillLearnedBySpellnow exempts the ten racial skill lines (101, 124, 125, 126, 220, 733, 753, 754, 756, 760), on the core fork branchfeature/racial-swap-core-support. mod-racial-trait-swap grants its traits withlearnSpell(), so the purchase IS persisted incharacter_spell— 38 characters carried such a row. The loss happened on the way back in:Player::_LoadSpellsgates every row on that validator, which requiresGetSkillRaceClassInfo(skill, race, class)to resolve, andSkillRaceClassInfolists only the OWNING race for a racial line (Dwarven Racial 101 has a single row, raceMask 4). What follows is worse than a refusal: theelsebranch callsremoveSpell(), which returns immediately because the spell was never added tom_spells, so nothing is removed in memory and nothing is deleted in the database — the row survives, the trait does not, and the log line claims the row 'will be deleted' while it stays there forever. The whole skill line is exempted rather than a list of spell ids: the ten lines are a closed set, one per playable race, holding racial spells and nothing else, so the exemption needs no extending when the module's catalogue grows; theirSkillLineCategory(9) is deliberately not used, since it also holds First Aid, Cooking, Fishing and every riding skill. Same shape asfeature/beastmaster-core-supportand for the same reason — re-teaching after login works, butlearnSpell()makes the client repopulate the action bar. No migration: the rows were never deleted, so stripped characters recover on their next login. Separately, mod-reforge's own strings move tomodule_string/module_string_locale, the mechanism mod-transmog already uses here: 141 strings in nine languages, resolved per session at display time, with the English kept compiled in as the fallback so the module stays usable with none of its SQL applied. A generator emits the SQL and a checker compares the English column against the literals recovered from the C++ — ids reached through the slot-name arrays and the two switch-return tables included — and re-runs the generator to catch a stale.sql; it refuses a translation that would not consume exactly the arguments the English consumes, sinceAcore::StringFormatis handed a format string read from the database, while accepting{1} … {0}reordering for languages whose word order differs. AndPlayer::RemoveArenaEnchantmentsnow testsGetEnchantmentDuration(slot) > 0in its two inventory passes as well (fix/arena-keep-permanent-temp-slot-enchants), so a permanent bonus sitting in the temporary slot survives arena entry whether the item is worn or stowed — upstream stripped the stowed one, a distinction no player can predict and none of his own actions triggers. - Character imports allocate pet ids from one past
ObjectMgr::_hiPetNumber. That counter holds the LAST number handed out rather than the next free one —GeneratePetNumber()pre-increments, whereGenerateMailID()andGenerateEquipmentSetGuid()post-increment — so offsetting from it directly gives the dump’s first pet an id a summoned pet already owns. MySQL rejects that row with[1062] Duplicate entry … for key character_pet.PRIMARYand the whole.pdump loadtransaction rolls back, silently: the SOAP caller only sees a command that returned successfully. Only a realm that has generated no pet since worldserver startup escapes it, because the startup path seeds the counter withMAX(id) + 1; with PlayerBots summoning constantly that window closes seconds after boot, so every character import fails. Carried on the core fork’sfix/pdump-pet-id-offsetbranch, which touches no realm-local surface and is a clean upstream PR candidate. - The
/admindashboard state badges — build and release, both running and queued — stay on one line. They are flex children of the card heading, so they carrywhitespace-nowrapandshrink-0: without the pair a flex item is free to be squeezed below its own content width, and a narrow grid column broke the label across two lines. - Registry publication pushes the platform manifest alone —
docker push --platform, defaulting tolinux/amd64and overridable withAC_PUSH_PLATFORM. buildx attaches an attestation manifest to every image it builds, and current BuildKit emits that attestation as an OCI artifact whosesubjectfield points at the image manifest. The GitLab registry enforces strict referential integrity onsubjectand refuses the whole index withMANIFEST_BLOB_UNKNOWN— an error whose detail names the IMAGE MANIFEST digest, not a layer, so it reads as a missing blob while the blob is on disk, in the registry metadata database, linked to the target repository and served correctly by HEAD and GET. The only true absentee is the attestation subject. Pushing the platform manifest leaves the attestation behind and the registry accepts it; the realm images are single-platform, so a deploy loses nothing. See moby/buildkit#7007 and gitlab-org/container-registry#1217. - Client add-ons join the fork fleet under the same derived-branch model as the C++ modules:
repackis the base plus the branches pinned inrepack-branches.tsv, and a newbuild-addons.shderives it throughrebuild-repack.shwithout compiling anything. The scheduled pipeline re-derives them right after the nightly upstream mirror, so a tag cut the next day ships the night's commits. A conflict there is contained by design:rebuild-repack.shaborts naming the stale branch and leaves the publishedrepackuntouched, and the players' ZIP — built from tags by each add-on project's own pipeline — keeps serving its previous release. Warden (mirrored from MathMasse91/Warstorm-Warden) carries two realm branches: the three server commands move to the.playerbotsprefix, and the whisper queue floors its send interval at 0.15s, because the queue drains one message per tick and 0.10s is exactlyChatFlood.MessageCountoverChatFlood.MessageDelay— crossing it mutes the player forChatFlood.MuteTimeand strands the rest of the queue with no error shown. Thebear pvppreset is checked against the realm's own talent grid: every rank within its maximum, every tier's five-per-row prerequisite met, 51 points at level 60 and 71 at 80. - Character import gained two mechanisms, and neither trusts the bundle. BEFORE anything is written, every statement is validated against an allowlist — the target table must be one the core's pdump loader accepts and the row must be scoped to the freshly allocated character, so a crafted bundle cannot touch another character, another account, or
account_access; aCHECKSUM TABLEon the rights tables taken before and after is the tripwire behind it. AFTER the load, one transaction deletes rows whose whole purpose is a dead reference (unknown spell, quest, faction, achievement, creature or item entry) and zeroes claims that are impossible while the row still means something — notablyitem_instance.creatorGuidwhen the named local character lacks the profession and skill level the item's recipe requires. Every rule judges against this realm's own data, and the pass FAILS CLOSED: if a reference source is empty or unreadable — a deploy without full MPQs, or an import racingbootstrap_aowow --build, which truncates and refills those tables — the import aborts before loading anything rather than deleting what it cannot validate. Auras are not imported at all, since their durations, casters and granting items point at the source realm; the exception is an aura whose spell appears inspell_areawith a quest that resolves here, because it gates that quest's continuation. A bundle exported from this realm is otherwise scrubbed of nothing. - The in-game assistant's knowledge base gains a Discord answer and loses a wrong one. Asked about Discord it now says there is none, why, and that an unofficial one reaches nobody — before, it improvised. The dungeon-scaling entry opened with "there are no player commands" and described
.autobalance scalingtwo sentences later, so a bot quoting the first half contradicted the realm; it now gives the real shape — three independent switches (up, down, group), the bare command that reports your setting and the instance's, and reset — and names the case players actually ask about: a 40-player raid entered by a handful has its creature stats scaled down to match, which is why nothing hits hard, and.autobalance scaling group offrestores the original tuning. Its keywords gained the complaint phrasings, since the old set indexed the feature's name but not the question that leads to it. - mod-mirror is a new first-party module:
.mirror <n>summons guardian TempSummons of creature entry700400, visually cloned throughSPELL_AURA_CLONE_CASTER, replicating deliberate combat casts hooked atOnPlayerSpellCast. Threat is redirected, not suppressed: each image registers a 100%RegisterRedirectThreatto its owner (the Misdirection machinery), so every threat event the core credits with the image as source lands on the player at exactly the point the core would have credited the image, while the image's own reference stays permanently offline through its untargetable flags — an unattackable unit that holds threat is an evade-bug factory; one that forwards it keeps the victim's threat list reachable. "Images never act against players" is one behavioral invariant rather than a stack of state gates, because this fork's three PvP states are independent — a duel never raises the PvP flag (Player::UpdateDuelFlagonly setsPLAYER_DUEL_TEAM), free-for-all zones raiseUNIT_BYTE2_FLAG_FFA_PVPthrough their own hook, and the cast hook fires before the contested-PvP update — so a flag-only gate would leave duels and Gurubashi open: the melee loop refuses player-controlled targets and replication drops harmful casts aimed at them, with the PvP/duel/FFA gates and dismissal hooks closing the state on top. Ranged mirroring delivers weapon damage through a per-cadence triggered cast of the real Auto Shot spell — its single effect is pure weapon damage, so the shot consumes the image's copied ranged weapon fields verbatim — spell and heal parity rides a hidden module-valued aura carrying the owner's live flat bonuses, and the never-act-against-players invariant reaches players charmed by a creature and DoT ticks alike: an image's direct damage and every periodic tick are zeroed at impact against any player body. Replication is filtered by exception — triggered, item-bound, tradeskill, taunt, mount, teleport, resurrection and summon effects are all dropped (a totem is the one summon that passes) — and the residual risk the filter cannot screen statically, aSpellScriptthat assumes a player caster, has an operational valve:Mirror.DisabledSpells, a conf CSV blacklist reloadable with.reload config. Nothing persists: images are session state by design, so there is no characters-DB schema at all. The controlled-bot arm,.playerbots mirror [<name>], grafts amirrorleaf onto mod-playerbots' own.playerbotscommand root — the core merges same-named roots from differentCommandScripts into one tree, colliding only on a shared leaf, so mod-playerbots is never edited — and enumerates the invoker's ownPlayerbotMgrmap, never the random pool, running each controlled bot through the player's summon path with every per-owner gate applied per bot; a bot released from its master fires no hook, so the image AI's periodic tick enforces the per-bot lifecycle (dismiss unless still under a real, connected master's control), which makes "random bots never have images" an enforced invariant; and thePlayerbotMgr.h/PlayerbotAI.hincludes make mod-playerbots a hard, one-way build dependency, matching the mod-ollama-chat precedent. - mod-random-enchants' smart-loot scoring resolves its priority key hybrid:
getSmartLootItemProfileKeyclassifies the item_template stat block into three disjoint super-groups (caster / physical / tank) weighted by stat value — Stamina and the school-generic hit/crit/haste ratings carry no role information and are ignored — and a winner at least 1.5x the runner-up is decisive, then splits into six profiles keyed as virtual spec_ids 10901..10906 inclass_spec_stat_priority, beside the player specs and the Druid-Bear key 10281; anything non-decisive falls back to the looter's spec, byte-identical to the previous behavior. One table keeps driving the scoring query;RandomEnchants.SmartLoot.ItemStatProfile = 0restores pure player-spec selection via.reload config. - Upstream's Blood Orb rework gave the Crimson Hall darkfallen C++ AIs by setting
creature_template.ScriptNamewhile leaving their SmartAI rows in place — andFactorySelector::SelectAIreturns a ScriptName AI before ever consultingAIName, so the per-spawn on-death rows feedingBloodPrinceTrashCountwent silently dead and the passage door of the Crimson Hall never opened. The realm carries upstream's own follow-up (#26850) verbatim on the core fork'sfix/icc-crimson-hall-doorbranch, ahead of thePlayerbotbase:DarkFallenAI::JustDiedfeeds the counter, gated on the four entrance-pack spawn ids — map 631 holds 18 spawns of those four entries, and only the entrance pack may count — and the commit's own SQL deletes the dead SmartAI rows. The branch retires the day the nightly-synced base contains the upstream commit. - mod-reforge is a new first-party module: a
CreatureScripton entry700500(Karl Fabergem, Master Reforger) selling one write at a time across the seven usableEnchantmentSlotvalues — permanent, temporary, the three gem slots, the socket-bonus slot, and the prismatic slot, which is offered for sockets only because an ordinary enchantment written there does apply its stats and never reaches the tooltip. The catalog is built once inWorldScript::OnStartup()and never mutated, so the gossip path reads it lock-free:OnBeforeConfigLoadandOnAfterConfigLoadboth fire long beforeLoadDBCStores, and a catalog built at config load would index empty stores and yield an empty menu with no error anywhere. Five passes feed it — spell effects 53/54/156, a directSpellItemEnchantment.dbcscan fortype == 8(socket3848is targeted by no spell in the game and is the only one that is both profession-free and non-binding),GemProperties.dbc, one synchronousitem_templaterecipe read, then tiers and display indexes. Tiers are derived rather than tabulated: an entry carrying a numeric value is ranked inside the span of its OWN (kind, statistic) scale — pooled, a best-in-slot gem prices like a starter enchantment, the best spell-power gem granting 23 against an enchantment's 81 — and a multi-stat entry is ranked on the SUM of its components, while a value-less proc is ranked by the profession skill its recipe demands, located by matching the craft spell against thespellid_Ncolumns. The load-bearing constraint is the prismatic slot:Player::ApplyEnchantmentapplies a gem sitting in slots 2-4 of an item with no native socket at that index only when the slot-6LookupEntryreturns non-null AND its required skill is satisfied, so a gem sale writes a socket there first whenever that exact test would fail, player included, at no charge.Player::ToggleMetaGemsActiveskips any item whose template declares no socket — correct for the core, exactly wrong here — so the module walks the complement of that set itself; the item's own socket bonus follows the core's XOR only while slot 5 holds nothing or the item's ownsocketBonusid, and is left strictly alone over a purchase. Every condition is re-checked server-side after the client-side confirmation box, with the item re-resolved byObjectGuid(Item::SetEnchantmentdereferences the owner's session with no null check) and an explicitGetMoney() >= price, becausePlayer::ModifyMoneyclamps a debit at zero and returnstrue. Menus are the other crash surface:GossipDef.cppasserts at 32 items and an AzerothCoreASSERTcallsCrash(), so every insertion goes through a bounded helper capped at 29 andReforge.PageSizeis clamped into 5..30 then capped again. Per-tier prices are hot-reloadable and the menu stamps the configuration generation it rendered under, so a.reload configlanding between the confirmation box and the click declines the sale rather than billing a price the player never saw. The Adventure Assistant carries entry700500in its entry constant, its despawn registry and itsspawn_on_selectdispatch alike, and the website card, the Adventure Assistant summon list and the in-game assistant's knowledge base all describe the same service.
3 - 9 August 2026
For players
- Want to play rated arena and earn arena points? You do not need a second player, and the in-game assistant now walks you through it. Rated arena requires a registered team, and you can put one together on your own: buy an Arena Team Charter (2v2) from an Arena Organizer — they stand in every capital city and in Dalaran — then have the PlayerBots sign it. Target any level 80 bot and use the charter on it; a bot already in a team of that size declines, so just move to the next one. Hand the signed charter back to the Arena Organizer to register your team, then queue rated 2v2 or 3v3 from the PvP window. Bot teams keep both of those queues busy, so a match forms quickly. Arena points are a weekly payout: play at least 10 rated games during the week and they land every Tuesday.
- Your own bots keep the quests you give them, grey ones included. Hand an alt bot an old quest to finish a chain, an achievement, or a zone you skipped, and it stays in their log instead of being cleared out a few moments later. In exchange, their 25 quest slots are yours to manage: a bot with a full log cannot accept anything new, so drop what you no longer need by whispering it
dropfollowed by the quest name or link. The realm's roaming bots are a separate population and are unaffected.
Under the hood
- The RAG knowledge base documents the rated-arena entry path — charter from an Arena Organizer, PlayerBot signatures, registration, then the rated 2v2/3v3 queues the bot teams keep populated — so the assistant answers arena-point questions with concrete steps rather than stopping at "form a team". The qualifying game count resolves from
Arena.GamesRequiredthrough a newarena.games_requiredregistry placeholder. Note for operators:MinPetitionSignsgoverns guild charters only, so an arena charter always needs (team size - 1) signatures, and the bots supply them. AiPlayerbot.DropObsoleteQuests = 0disarms mod-playerbots' CleanQuestLogAction, which fires off a random non-combat tick and deletes every quest past a hardcoded trivial gap (5 levels below 20, then 6 / 7 / 8). The action resolves a requester from the event owner or the bot's master and bails when there is none, so masterless random bots never ran it: the override reaches only player-owned and grouped bots. It is also their sole automatic quest-log pruning, since the module's DropQuestType is dead code -- which incidentally makesQuest.LowLevelHideDiff, its only reader, inert for bot behavior.
27 July - 2 August 2026
For players
- You now decide how dungeons and raids adjust to you. Talk to the Adventure Assistant (Settings), or use
.autobalance scaling, and pick one of three profiles: standard (creature levels follow your party, as before), original levels (creatures keep the level the dungeon was built for, while the game still adjusts their strength to your group size — so an old dungeon feels its age and a 25-player raid is still doable with a handful), or none at all (the instance is left completely untouched). Your choice applies to the instances you open from then on, so nothing ever changes level under a group already inside; in a party, the leader's profile is the one that counts. Dungeon Master runs are unaffected either way. - Your appearance wardrobe now fills itself in. Everything you already own — equipped, in your bags, in your bank — is added to your collection automatically, so looks you earned before the wardrobe existed count too. You can also collect a look straight out of your bags without equipping it first:
.transmog claimwith an item link for one piece, or.transmog claim allto sweep up everything claimable at once. Selling or trading the item afterwards keeps the look. - Bot raids now handle Icecrown Citadel noticeably better. The Blood Prince Council tanks no longer fight over Prince Keleseth, the raid spreads out properly when Blood-Queen Lana'thel's shadows chase someone, and the ice tombs of Sindragosa's last phase are marked and broken far more reliably. Bots in the other raids also keep a steadier grip on boss mechanics — their internal timers no longer reset at the wrong moment mid-fight.
Under the hood
- mod-autobalance gains per-character scaling profiles (character_autobalance_prefs, three axes: creature levels up, creature levels down, group-size stats). A creature has one level for every client that sees it, so the profile is instance-wide: it resolves once from the group leader when a human leads and from the entering player otherwise, then locks for the life of the map. No scaling logic changed -- the profile writes into the per-map fields the scaling condition already reads.
- Upstream mod-transmog update: retroactive appearance backfill across equipped slots, bags and bank at login, the player-facing
.transmog claimcollector, and a GM.transmog checkdiagnostic. Its string tables live in module_string, applied by the release's db-import. - Upstream mod-playerbots update: the ICC strategy's duplicated per-boss loops move into shared helpers, and all shared bot state lives in one per-instance struct reset shortly after combat ends — fixing data races between concurrent ICC instances and a slow memory leak. Taunt, crowd-control and heroic-buff checks are throttled to twice a second, and the cross-raid boss helpers erase mechanic-tracking state only behind a three-layer out-of-combat guard (bot inside the instance, no nearby combat, boss absent from its threat list).
20 - 26 July 2026
For players
- Need to reach the operator? Open an in-game GM ticket — press Escape → Help → Open a ticket — and it is answered on your next login. There is no Discord and no live GM, so replies are asynchronous rather than real-time, but a ticket is the direct line for a bug, a stuck character, or anything the automated systems cannot sort out on their own.
- A bug-fix round from a full code audit of the realm's modules: turning off login announcements now takes effect from your very first login; the Adventure Assistant's arena entry no longer errors on Traditional Chinese clients; guild-house and emblem-upgrade messages no longer print a raw %u placeholder; the automatic revive no longer leaves your corpse on the ground; free ammunition no longer tops up (and so can never duplicate) crafted ammo you supplied yourself; and emblem bonuses now apply only to emblems you earn — not ones bought at the emblem exchange.
- Hundreds of translation fixes across all nine languages, from a native review of every text on the realm: menu names quoted in the guides now match what your game client actually displays, place names follow each language's WoW canon, and the moderation notices read naturally in every language.
- New Class change service on Gabriella the Assistant: turn your character into another class instead of making a new one. Right-click her (or summon her from the Adventure Assistant), pick "I want to change my class", and choose from the classes your race can be. Only combinations your game client already supports are offered, so nothing needs to be installed or patched. The change applies the next time you log out and back in: all your equipped gear is unequipped and mailed back to you for safety, your talents and glyphs are reset, and your old class abilities are removed — relearn your new class from any class trainer, or in one click from the Adventure Assistant's "Learn spells". Becoming a Death Knight requires your character to already be level 55 or higher, and the Death Knight introduction is completed for you, with its starter items sent to your mailbox so a full bag never loses them. The queued change also survives a server restart: if the realm goes down before you log out, it simply applies at your next clean logout.
Under the hood
- Full-fleet audit follow-up: every fork's divergence documentation normalized to one canonical model; decomposition branches made self-contained (two emptied and retired); the maintenance scheduler now catches up missed jobs instead of skipping a day or week; the nightly mirror sync tally distinguishes updated from already-current; reserved-account guards key on the account name instead of a database id.
- Class change is a realm-local
feature/class-changeonmod-assistant(Gabriella), no client edit: only race/class combinations the stock 3.3.5a client renders (GetPlayerInfo(race, class)non-null) are offered, so no DBC is touched. The switch is deferred to the character's next logout and applied with direct character-DB writes - equipped items are mailed back, class-category spells (SkillLineAbility) are purged (keeping the fly-anywhere mount, riding tiers and the universal beastmaster pet spells unless leaving Hunter), talents/glyphs/action bars are wiped, andcharacters.classis rewritten. A Death Knight target reusesmod-skip-dk-starting-area's Ebon Hold intro-quest completion (refactored into a reusable idempotent helper) on the next login, gated on the level-55 heroic floor; its bonus starter items are mailed rather than added to the bag, because the core'sPlayer::AddItemsilently drops an item a full inventory cannot hold.
6 - 12 July 2026
For players
- New PlayerBots guide on the Modules page: the most-asked-for commands and macros in one place - how to bring your alts in as bots, order them (follow, stay, attack, pull, gear up, loot), fine-tune their behavior, aim orders at just the tanks/healers/a class, plus ready-to-paste macros. It also links the two upstream pages people ask for constantly: the raid completion status and the raid strategy guide.
- New Crafting Artisans - one master craftsman per profession (Alchemy, Blacksmithing, Enchanting, Engineering, Inscription, Jewelcrafting, Leatherworking, Tailoring, Cooking, First Aid). Find them in Dalaran, or summon any of them on the spot from the Adventure Assistant (
.aa→ "Crafting artisans"). Each one will make any recipe of their craft from your raw materials for a small fee, so you do not need the profession, do not need to level it, and do not need to own the recipe. Right-click one, type part of an item's name to search, click it to see the materials and fee, and confirm. Because the artisan makes the item directly, recipes that normally carry a cooldown - transmutes, the cloth cooldowns, and the like - have none here. The Master Enchanter scribes enchants onto vellums, handing you the matching Scroll of Enchant. - Yogg-Saron with 0 Keepers is now beatable solo or with a bot raid. Diving into the brain room keeps the fight running even when your whole group goes in at once - what a solo player or a small bot group has to do - instead of wiping the instant you enter. The Sanity drain that made it unsustainable for bots - not fully handling Brain Link and Psychosis - has also been eased, and bots stay grouped during Brain Link instead of scattering. The Sanity easing is a realm setting that stays off for genuine human raids; the brain-room behavior is identical for a full raid, which always keeps players up top.
- Ranked arena queues now pop reliably. Bots keep plenty of 2v2, 3v3 and 5v5 teams queued (5v5 never filled before) and the matchmaking range was widened, so you find opponents quickly in every bracket - not only 1v1 and solo. (Arena points are still paid weekly, at the Tuesday reset.)
- Fixed character download - exports that were failing with "Character export failed" work again.
- Fixed fishing always giving the same catch. If you had a personal loot multiplier on (
.rate loot), it was collapsing "pick-one" loot tables to their first entry, so you caught the same fish every cast in a spot - and the zone fish behind a sub-roll (Nightfin, the salmon, Winter Squid, ...) that some cooking recipes need never turned up. Fishing rolls normally again even with your loot rates turned up (no need to reset them anymore). It was never seasonal or day/night on this realm. - The special flying mount from the Tome of World Flying now runs at full speed on the ground, not just in the air. It used to plod along at walking pace whenever it touched down; now it moves as fast as any epic mount on the ground, while still flying anywhere at full speed.
- Server restarts no longer cost you progress. When the realm goes down for maintenance it now waits for every character to be saved before it stops, instead of being cut short after ten seconds - so the questing, loot and gold from the minutes before a restart survive it.
Under the hood
- New
Yogg.BotFriendlyworldserver.conf toggle (default off) softens Yogg-Saron's Sanity economy for bot raids - Psychosis costs 9->3 Sanity and fires every 5s instead of 3.5s, and Brain Link deals no Sanity - on a core-forkfeature/yogg-bot-friendlybranch. A companionmod-playerbots feature/yogg-brain-link-fixrepairs two defects that left the Brain Link bot AI dead on this single-aura core (a dead-code early return in the range trigger, and a self-aura gate that could never be true), so bots now clump to the linked player. Server-side only - no client patch. - Sara holds the Yogg-Saron encounter while any living, sane player is inside the brain room - the mod-playerbots base's
HasAlivePlayerInIllusionguard on her 90-yard sanity leash - so a solo player or a small bot group diving through a Descend portal keeps the fight alive instead of emptying her target list and tripping a full evade/reset. Ungated: a full raid always leaves players up top, so it never fires for them. - Emblem transfers and one-tier upgrades no longer pass through the
.rate emblemsmultiplier:mod-personal-ratesnow exposes a suppression toggle thatmod-emblem-transferbrackets itsStoreNewItemgrants with, so moved or upgraded emblems stay 1:1 while genuinely earned ones still scale. - Rated-arena bot-fill raised (
RandomBotAutoJoinBGRatedArena2v2/3v3Count2->10,5v5Count0->6) andArena.MaxRatingDifference150->500 so a human matches the spread-out (1000-2000) bot ratings. - Character/account export was failing because the web container's
/opt/backupmount used a bare relative source that resolved to an empty path after an in-container release; it now uses${REPACK_REPO_HOST}like every other repo mount, so the backup scripts are present again. - mod-personal-rates'
OnItemRollapplied the per-quality.rate lootmultiplier inside the core'sLootGroup::Roll(grouped "pick-one" loot). That roll subtracts each entry's chance from a fixedrand[0,100), so inflating the chances made the first group entry win almost every time - fishing loot (mostly grouped) collapsed to a single fish and its Reference sub-tables (the zone fish) never fired. Grouped entries (groupid != 0) are now left untouched; only independent (groupid == 0) drops are scaled, so.rate lootstill boosts ordinary drops without breaking grouped tables. - The Crafting Artisans are a data-driven ALE (Lua) feature: the recipe list of every production profession is generated at build time straight from the client profession data, so it is complete and always in step with the game's own reagents and outputs (no hand-maintained recipe tables). The exchange is a pure server-side gossip + inventory operation - the trade spell is never cast, which is why cooldown recipes have no cooldown - so it needs no client patch and no C++ module. The service fee is operator-configurable from config.env (a rate on the item's value plus a flat floor), and each artisan is also summonable from the Adventure Assistant.
- The Tome of World Flying mount (spell 31700) spends all three of its effect slots on the mount model, +280% flight speed and the fly-anywhere aura (
SPELL_AURA_FLY, the whole reason this stock spell was chosen), leaving no slot for a ground-speed effect - and its spell data can't be edited without breaking the feature's "works against an unmodified 3.3.5 client" design. Sotome_of_world_flying.luanow pairs the mount with a hidden companion aura (stock spell 43266: a single +100%MOD_INCREASE_MOUNTED_SPEED, infinite duration,NO_AURA_ICON) added on the mount aura'sPLAYER_EVENT_ON_AURA_APPLYand removed on dismount. Mounted ground speed is server-authoritative and that aura only counts while mounted, so the +100% (the game's ground ceiling) is scoped to this mount and never leaks onto the player's other mounts. - The worldserver now gets a real graceful shutdown. It runs as PID 1 in its container and handles
SIGTERMviaWorld::StopNow()- kicking and saving every character, logging out every bot, unloading the maps - which runs well past Docker's default 10s stop timeout, so the process wasSIGKILLed mid-save (costing every online player up toPlayerSave.Intervalof progress) and, killed that way, was never restored byrestart: unless-stopped.docker-compose.ymlnow setsstop_grace_periodto 300s on the worldserver and 120s on the database (so mysqld finishes its InnoDB shutdown instead of forcing a crash recovery). A grace period is a ceiling, not a delay: the container is reaped the instant the process exits. The host-reboot path is capped separately, bydocker.service's ownTimeoutStopSec. - /admin can now stop and start the realm, and rearm the watchdog. The web container has no Docker access, so both are files under the bind-mounted
/controlthat the cron container's newpower-from-web-trigger.shacts on: it announces the SOAP countdown, then stops auth and world (the database stays up, so /admin and the button that brings the realm back keep working) and records/control/world.halted. That flag is the interlock -- without it the watchdog, which cannot tell a deliberate stop from a crash, would restart the realm within one cycle. It also drives the site's maintenance banner. The stop usesdocker stop, never SOAP.server shutdown: a worldserver that exits on its own is brought straight back byrestart: unless-stopped. The watchdog's circuit breaker suspends it after too many restarts and never self-heals by design; since this deployment has no mail alerting, /admin now shows a red banner with the trip reason and a one-click rearm rather than letting the guard sit silently disarmed.
29 June - 5 July 2026
For players
- The Emblem Broker (Turco) can now upgrade your emblems one tier up the chain (Emblem of Heroism into Valor, on up to Frost), on top of transferring them between your own characters.
- New opt-in raid encounter skip in the Adventure Assistant for the gimmick fights that are rough solo or with bots (or that hit a core script bug) - Ulduar's Flame Leviathan and Mimiron, the Icecrown Gunship Battle, and Valithria Dreamwalker. Skip a stuck one so your run keeps moving - a skip advances the raid (and for Mimiron spawns the Watcher you need at Yogg-Saron) but leaves that boss's own loot behind; normal bosses are left for you to fight.
- The Dungeon Master now scales to your level and keeps every monster there for the whole run. It used to average the party, so high-level PlayerBots or levelling up mid-run shoved monsters to skull "??" level (and some briefly snapped back to their own level, becoming one-shot kills); now the dungeon locks to the player who started it and the levels hold steady - no more "??" monsters.
- New per-character gathering setting:
.rate gatheringmultiplies how much you harvest - the ore, herbs or leather each vein, plant or skinned corpse drops - separately from the skill-up speed of.rate skill. - New per-character option: grant yourself extra talent points (0-200, free, off by default) to experiment with deeper or hybrid builds. Set it from the Adventure Assistant's Settings menu or with
.extratalents <number>. The points always survive a level-up, and if you lower the value below what you have already spent your talents are reset for free so you can respec. - Lucky's menu (the Adventure Assistant) now groups the arena options - Spectator, Leaderboard, Replay, 1v1 Master and 3v3 Solo Queue - under a single Arena entry, keeping the menu short so every option stays reachable even when you are in a group or guild.
- You can now bring companion bots into a raid they were locked out of: type
.playerbots bot refresh=raid *before summoning them (the*targets every bot in your group; a bot name works too) and it clears their weekly raid save, so they zone into your copy instead of their own. - Wording and translations across the site were polished for clarity, in every language.
- Grant yourself more emblems: the new per-character
.rate emblems <multiplier>(also in the Adventure Assistant's Settings menu) multiplies the badges you earn from raid and heroic boss kills, the daily random-dungeon reward and quests. Off by default; capped by the realm limit.
Under the hood
- Local AI (Ollama) now runs GPU-accelerated on the server's GPU; the chat endpoint and model are driven from config instead of hardcoded.
- A new Adventure Assistant engine primitive (
Map:SetBossState) powers the encounter skip; both features are pinned into the build. - Dungeon Master scaling overhaul. The level reference is the run's leader instead of the bot-poisoned group average, and each monster's scaled level is now pinned server-side via a new core
Creaturefield, so it can never revert to its native "??" level on respawn, summon or a mid-run level-up.mod-autobalanceyields Dungeon Master monsters to the module so the two scalers stop fighting; full-health monsters stay full across a rescale and damaged ones are left alone. Party size still raises HP/damage. - Personal Rates' gathering-yield hook (
OnBeforeDropAddItem) now covers skinning: it recognizes gathering loot by its loot store (skinning, mining, herbalism) instead of the loot type, so skinned hides finally follow the.rate gatheringmultiplier like ore and herbs. Quest items are never multiplied and stacks still cap at their max size. - Extra talent points moved from Lua into a dedicated C++ module (
mod-extra-talents). A singleOnPlayerCalculateTalentsPointshook adds the bonus to the core's talent total, so the core computesfree = base + extra - spenteverywhere and only resets when you have spent more thanbase + extra. The earlier Lua version fought the core:Player::InitTalentForLevelwipes talents whenused > CalculateTalentsPoints(), which ignored the Lua bonus, so anyone who had spent bonus points was reset on every level-up and login - the hook fixes that at the source. The command is now.extratalents <n>(the Assistant Settings row bridges to it) with its owncharacter_extra_talentstable. - This changelog page, now served in every site language with inline
codeand emphasis styling. - Build robustness: the watchdog re-arms on targeted deploys, the build lock is held across releases, a root-run build no longer breaks user creation, and the AI service comes up best-effort so a GPU hiccup never fails a deploy.
- Every container is now individually (re)buildable and deployable from both
/adminpickers: the service containers (world/auth/web/aowow) plus the data images (lua,rag,clientdata,aowow-assets,aowow-db-seed) anddb-import/maintenance— the build picker rebuilds any single image and pushes it to the registry, and release deploys it. A data image has no long-running container, so a release re-runs its one-shot seeder and restarts the consumer (world for lua/rag/clientdata, aowow for the aowow seeds); selecting one used to abort withno such service. - The website locks sign-in and registration only in the final 5 minutes of a scheduled release countdown, not for the whole thing - scheduling a deploy an hour out no longer blocks the site for the hour. The cron wrapper publishes the scheduled go-down time and the site defers the lock + banner until then (in-game SOAP warnings still run the full countdown).
- Personal Rates' gathering multiplier no longer mutates the shared loot template in place.
OnBeforeDropAddItemis handed aLootStoreItem*straight from the cached template, so scaling its count stuck permanently - it compounded on every subsequent gather up to theuint8ceiling and leaked to every player, and the inflated yield persisted even after the rate was lowered. It now stashes the original count in athread_localmap and restores it inOnAfterLootTemplateProcess(called once per fill, after the count has been rolled and split into stacks), so the multiplier applies per-gather only. - Adventure Assistant gossip menu kept under
GOSSIP_MAX_MENU_ITEMS(32): the main menu had reached 30 unconditional items, so the conditional rows (guild vault, summon / resurrect party, warlock renamer) pushed a grouped or guilded player past the cap and the client silently dropped the trailing rows (Settings first). The five arena services moved into an Arena submenu, taking the main menu down to 26 with headroom. - Build and release survive flaky networking. Every network step -
gitfetch / clone / push anddockerlogin / push / pull - retries 5 times, 3 seconds apart, re-priming the resolver (getent) between attempts instead of aborting on the firstcould not resolve hosthiccup (tunable viaAC_NET_RETRIES/AC_NET_RETRY_SLEEP). The host LAN-IP detection is also cached to the realm control directory: a web-triggered build/release runs inside the maintenance container, which cannot see the host network, so it reuses the value a host run cached rather than falling back to loopback and writing a broken realmlist address. - PlayerBots raid lockout is now player-clearable on any grouped bot:
AiPlayerbot.ResetInstanceIdForAltBots = 1lets.playerbots bot refresh=raidunbind raid saves on invited roaming bots and alt bots too, not just addclass standby bots. A raid binds every character to a weekly instance id, so a bot carrying an older save would otherwise zone into its own copy;UnbindInstanceis a DB-light delete. - Emblem multiplier added to
mod-personal-rates. WotLK emblems are items, so a newOnPlayerStoreNewItemhook grants the bonus copies when one enters the bags -- boss loot, the LFGRewardQuestreward, quests -- with athread_localguard so its ownAddItemdoes not recurse. The emblem item ids arePersonalRates.EmblemItemIdsand the cap isPersonalRates.MaxEmblemRate; a newemblems_ratecolumn (idempotent migration) and an Adventure Assistant Settings row complete it.
22 - 28 June 2026
For players
- You can download your own characters from the website as a portable file, importable on any AzerothCore server - the realm does not lock you in.
- Your conduct score now shows on your profile.
- Smoother, safer updates with far less downtime when the realm is patched.
Under the hood
- Major build/deploy refactor: an images-only build that pushes to a container registry, plus a separate release that pulls those images and deploys (no game files or bootstrap needed on the live server).
- Cron and watchdog containerized; aowow, Lua, the AI knowledge base and client data baked into self-sufficient images.
- Backup/restore hardened end to end - arena teams, guilds, transmog appearances, explicit item/auction id allocation, and a longer character-load timeout.
- Whole stack moved to a self-hosted Git server; database commit-throughput tuning.
15 - 21 June 2026
For players
- Live online player and bot counts now refresh every minute in the footer.
- Auction House tuning: more epics in circulation (raised from 2% to 6% of volume), fewer greens.
- Cleaner, easier-to-read moderation history.
Under the hood
- Guildhouse module fixed for the current core API.
- Build simplified: the watchdog safety breaker re-arms after a successful build; dropped now-redundant per-build backup branches.
- Website CSS cache-busting and layout polish.
8 - 14 June 2026
For players
- The Adventure Assistant is now fully translated into all 9 in-game languages.
- The website is reorganized into clear Modules, Rules and FAQ pages.
- New profession skill-rate multiplier in your settings; the weekly arena payout day is now shown in the FAQ.
- Clickable item / NPC / spell tooltips (from the realm's own database) across the site.
- Support tickets fixed so replies append correctly.
Under the hood
- Site layout reworked to host the self-hosted aowow tooltips (language-aware).
- Player-facing values (rates, arena day) now read live from the server config on both the site and the AI bots, so they never drift out of sync.
- Background battleground-queue announcer fix.
1 - 7 June 2026
For players
- Solo arena always finds opponents now: bots fill unrated 1v1 and solo 3v3 queues.
- New Ammo-Free (hunters / warriors / rogues) and Free Soul Shards (warlocks) toggles.
- A "Call the Dungeon Master" entry added to the Adventure Assistant.
- Weekly arena point payouts enabled; the World chat channel is human-only (no bot spam).
- Bots are quieter and roll more varied gear.
Under the hood
- The AI knowledge base was split into its own repository; chat-module support added.
- The Adventure Assistant was refactored from one 2200-line script into five focused modules, with no player-facing change.
- Server customizations moved to a cleaner "derived" build model that is easier to maintain and fork.
- Learn-Spells became an opt-in Adventure Assistant choice instead of being forced on everyone.
25 - 31 May 2026
For players
- Eight new modules: Anticheat, World Chat, Flightmaster's Whistle, Arena Replay, 3v3 Solo Queue, Warlock Pet Rename, the Dungeon Master (scaled / procedural dungeons), and Pet Loot.
- Auto-revive: a spirit healer (Lucky) appears when you die and can resurrect you on the spot, no corpse run.
- Death Knights fully enabled (creation had been wrongly blocked); the DK starting-zone skip is now opt-in, not forced.
- One-click Vault of Archavon access, plus a menu option to clear Resurrection Sickness / Deserter.
- A Census dashboard with class / race / spec breakdowns and icons, in all 10 languages.
- Smarter playerbots: spec-appropriate gear, better following, more even spread across level brackets.
Under the hood
- Eight modules integrated with Lua gossip / quest hooks; a per-character Vault-of-Archavon opt-in table.
- Local AI chat + moderation wired up (Ollama), with hardened prompts, an addon-chat allow-list, and usage tracking.
- Admin suite: live log viewer, bulk account / character queries, ticket triage, async backups - all from the web.
- All website assets self-hosted (no third-party CDN at runtime).
- A 24/7 watchdog with auto-restart and a circuit breaker; daily backups and log rotation.
18 - 24 May 2026
For players
- The website took shape: responsive header, 10-language dropdown, the full module catalogue with icons and descriptions, and a registration flow with an age gate and anti-bot.
- The Adventure Assistant settings menu landed - toggle the major modules in-game.
- A Census dashboard (live player count, daily peak, human vs bot tabs).
- Character backup / export for data portability.
- The local AI chat moderation went live.
Under the hood
- Full website internationalization (language auto-detect, formal register, SEO / OpenGraph, mobile nav).
- Per-player settings table; login and peak tracking; backup-state plumbing.
- AI tuning (model choice, GPU support including an integrated-GPU workaround, bot-to-bot silencing).
- Module sync hardened (merge-on-sync, conflict fail-fast, partial clones for big repos).
11 - 17 May 2026
For players
- Development began. The server, website and AI groundwork were laid - WotLK 3.3.5a on AzerothCore, 10-language support, and the first form of the Adventure Assistant companion.
- Mostly foundations this week; the player-facing features ramp up from here.
Under the hood
- Orchestrator and Docker stack bootstrapped (world, auth, database, aowow).
- Client-data extraction pipeline (maps, DBC, mmaps / vmaps) with resumable, multi-locale builds.
- A one-script build system with host-tool checks and per-step caching.