WoW Forever Addon Patterns: Forever Is a Third Client
Forever shares Mainline's UI. On build 70338, its project ID is 18 (WOW_PROJECT_CAMELOT); compare that constant, check the feature's API and retest on your current client.
Ask Our Sweaty Degenerate AI About Forever Addon Patterns
Secret Values, Camelot Detection, Aura Containers, Settings Panels & More
Anything our guides cover. Answers come from this page and the rest of our guides, with the real values charted and the guide sections linked. It's AI, so check the source before you quote it.
Classic Era is permissive and old. Midnight is restrictive and current. Forever is the original world running the Midnight UI family. Write for that overlap, or the addon won't load, or it loads and reports the wrong thing.
- Addon API
- Modern API
- API family
- Mainline 12.1.5
- WOW_PROJECT_ID
- 18 (Camelot)
- Player health
- Secret number
This pillar is part of the WoW Forever addon developer guide, alongside the Forever API cheat sheet, common AI addon pitfalls and the Forever Beacon reference addon.
Three Clients, One Mistake
The trap models and developers fall into most often is treating Forever as Classic Era with new zones, or as Midnight with the old world. It is neither.
| Surface | Classic Era | Midnight | Forever |
|---|---|---|---|
| World | Original world | Current expansion | Original world, new zones, cap 60 |
| UI code | Classic API | Mainline, 12.x | Mainline family, game type Camelot |
| Interface | 11509 | 120100 | 16001 on the beta |
| Combat log | Open to addons | Registering CLEU errors | Reported unavailable |
| Health math | Plain numbers | Secret under restrictions | Secret number seen on build 69913 |
WOW_PROJECT_ID | 2 | 1 | 18 (WOW_PROJECT_CAMELOT) on build 70338; 1 reported on 69913 |
Interface numbers come from the Warcraft Wiki TOC table, and the Midnight combat log change comes from the wiki's Patch 12.0.0 API notes. The beta rows in the Forever column are community tests.
Detect Forever Without Trusting the Project ID Alone
The older build 69913 report returned WOW_PROJECT_ID = 1, the Mainline value. The retained October 12 probe on build 70338 instead records 18, and Blizzard's client constants name it WOW_PROJECT_CAMELOT. Compare that named constant when it exists, then check the API your feature needs. Blizzard said it would rename the internal name Camelot before launch, so retest it on your build.Source: Blizzard's Camelot project constants, retained 70338 extract inspected Oct 13, 2026; WFG probe captured Oct 12. The mirror may show a later build.
local function IsForever()
return WOW_PROJECT_CAMELOT ~= nil
and WOW_PROJECT_ID == WOW_PROJECT_CAMELOT
end
-- Example capability: check the API your feature actually uses.
local canReadPreset = C_GameRules
and type(C_GameRules.GetForeverExperiencePreset) == "function"
local function HasSecrets()
return type(issecretvalue) == "function"
end
-- For logs only: 16001 on the beta. Do not hardcode it as the test.
local iface = select(4, GetBuildInfo())Check this probe against the API reference tables and the traps in Twelve traps to avoid, and run it on your build before you rely on it.
The retained Warcraft Wiki example pairs WOW_PROJECT_MAINLINE with LE_EXPANSION_LEVEL_CURRENT == LE_EXPANSION_CLASSIC, or reads a TOC game-type variable. Its Mainline project-ID condition is false on the captured 70338 client. Mainline UI architecture does not imply a Mainline project ID. The revised example is source-checked, not tested in game.
The Secret Pipeline
Midnight introduced secret values to limit combat automation, and Blizzard said Forever has them too.
- Call the API.
type()still reports number, string or boolean. - Ask
issecretvaluebefore you compare, branch on or print it. - If secret, use a widget.Otherwise show a fixed label.
- Don't trust
pcallwith protected actions.
You still get a value from the call, with its real type. StatusBar:SetValue is the wiki's example of a widget that accepts secrets. Do not wrap a protected action in pcall and call it handled: testers report the failure can be silent and sticky.
Under the Warcraft Wiki's Midnight rules, addon code can store secrets, pass them to functions, and concatenate or string.format them. It cannot do math on them, compare them, test them as booleans, index them or use them as table keys. The rules block those operations; an attempt throws a Lua error right away. Warcraft Forever reports that printing a secret throws on Forever, so guard before you print.

Test You Can Paste in Game
/run local h = UnitHealth("player"); print(type(h), pcall(function() return h + 1 end))On build 69913 this printed number false. A false from pcall means the engine refused the addition. For status-bar examples, see the code templates and the downloadable Beacon sample, then check them on your build.
Auras Are Containers, Not Tables You Own
Blizzard said the AuraContainer and AuraButton changes from 12.1.0 are available on Forever, and that later UI changes should land on both Standard and Forever. The wiki's Midnight notes flag aura data as secret while combat restrictions are active. What holds up is to let Blizzard's aura frames decide what to show, skin what they give you, and never read the aura payload to decide a play.
What Is Worth Building Now
Know what the client allows before you prompt a model or port old code:
| Surface | Verdict | Why |
|---|---|---|
| Bags, bank, vendor, tooltips | Build | Presents data the UI already shows |
| Quest log, map pins, route notes | Build | C_Map.SetUserWaypoint is the safe pin, not the super-track call |
| Nameplates and unit art | Build carefully | Warcraft Forever: NAME_PLATE_UNIT_ADDED can fire before the unit is populated. Check again a moment later |
| Secret-safe personal strip | Build | The Forever Beacon sample is the reference |
| Damage or healing meter | Do not | Built-in meter; do not assume addon access to its restricted data |
| Classic WeakAuras packs | Do not port | Wowhead: WeakAuras stopped development before Midnight |
| Click-cast healer frames | Wait | Secure snippets failed to compile on 69913; may be a bug |
| Action bar paging via snippets | Wait | Same compile failure |
Porting Order
From Midnight
Add 16001 to the interface line, or ship a _Camelot.toc. Remove any branch that reads project ID 1 as "this is Midnight" and turns on Midnight-only features. Retest every secret-value path on the Forever client before release.
From Classic Era
Treat it as a new addon that may keep your SavedVariables schema. Replace global item and spell calls with C_Item and C_Spell and their load events. The retained community notes report combat-log access unavailable. Test listener registration and reader results on your target build before you rely on the feature or delete it. Replace PlaySoundFile on interface .ogg paths with PlaySound and a SOUNDKIT ID. Replace faction checks that use UnitIsEnemy. Then read the file again for any math on health. For starter code, see the copy-paste code templates.
Beta Defects Versus Design
Label these in your patch notes so players don't blame your addon:
- Secure snippet compilation failure: WoW Forever Builds suspects a bug.
- SavedVariables not loading: reported after a restart in mid-September.
WOW_PROJECT_IDof 1: historical build 69913 report.
Retest snippets before you replace a working click-cast with a weaker one for good. Players reported saved data missing, and a September 25 forum reply says build 70009 loads it again; retest before you add workarounds. WoW Forever Builds left the project ID unclear on build 69913. The retained 70338 probe records 18, named WOW_PROJECT_CAMELOT, despite Forever remaining in the Mainline family. Retest each build; compare the named constant and check feature APIs.
The Addon Compartment Replaces the Minimap Button
Ask a model for a toggle button and it reaches for a minimap icon library from a Classic Era tutorial. Mainline has a lighter option: the addon compartment, a dropdown off the minimap that lists one entry per registered addon.Source: Addon compartment, checked Sep 28, 2026.
The beta client includes it. In build 1.60.1.70009, the Blizzard_Minimap TOC loads AddonCompartment.lua for the mainline game type, and a neighboring line that excludes camelot shows camelot counts as mainline.Reported, client file read An entry on a live Forever screen is still unconfirmed, as Beacon's compartment notes point out.
Registering With the TOC or With Lua
Three TOC fields register an entry with no Lua call: AddonCompartmentFunc for the click, plus the optional AddonCompartmentFuncOnEnter and AddonCompartmentFuncOnLeave for the tooltip. The client calls the global functions you name, and loads a load-on-demand addon first if it has to.
An addon that changes its label or icon at runtime uses AddonCompartmentFrame:RegisterAddon instead, passing a table with text, icon and func. The wiki says that table resembles legacy UIDropDownMenu button setup, so Retail examples transfer.
When a Minimap Button Still Makes Sense
A custom minimap button brings its own saved position and drag code, usually through a library. A compartment entry needs neither, because the client owns the menu. Start with the compartment. The same TOC still loads MinimapButtonTemplate for camelot, so a real minimap icon is still possible if players ask for one.
Options Panels Follow the Same Swap
Settings follow the same rule: write Mainline code, not a Classic template. The wiki says the Settings API was rebuilt in patch 10.0.0, with more breaking changes in 11.0.2.Source: Settings API, checked Sep 28, 2026. The beta's Blizzard_Settings.lua defines Settings.RegisterAddOnCategory, Settings.RegisterAddOnSetting and Settings.OpenToCategory.Reported, client file read
RegisterAddOnCategory adds your category to the game's options window. RegisterAddOnSetting binds a checkbox or slider to a key in your saved variables table, so the click writes the value with no separate handler to keep in sync. The settings panel template has a working checkbox with a callback.

Opening Options From the Compartment
A compartment click can call Settings.OpenToCategory instead of showing a frame you built. In the beta file it hands off to C_SettingsUtil.OpenSettingsPanel, a client function. Neither the wiki nor that file says whether the call works in combat, so test it in combat, or queue it until PLAYER_REGEN_ENABLED the way Beacon does.
Route Addons Follow the Same Client
Quest and route addons are the biggest "Build" row in the table above, and two guide makers already sell them for Forever. RestedXP opened Forever orders on September 14, 2026. Zygor Guides says Elite members get its Forever guides at launch. Both run inside this client, so the same compartment and settings rules apply to them.
The prompt templates for Forever addons build both patterns into the system prompt, so a model reaches for the compartment and the Settings API before a library.
Key Facts
- Addon API ChangedForever uses the modern addon API, with Midnight's combat restrictionsClassic: Classic Era keeps the older API with the combat log open to addons.
- API family ChangedShares Mainline UI architecture and "the vast majority of APIs available in 12.1.5"
- WOW_PROJECT_ID Changed18 (WOW_PROJECT_CAMELOT) in the October 12 WFG probe on build 70338; older build 69913 reported 1Classic: Classic Era returns 2 (WOW_PROJECT_CLASSIC).
- Combat log RemovedCombatLogGetCurrentEventInfo reported unavailable to addons on the betaClassic: Classic Era addons read every event through COMBAT_LOG_EVENT_UNFILTERED.
- Player health ChangedUnitHealth came back as a secret number: type() says number, adding 1 failsClassic: Classic Era returns a plain number addons can do math on.
Sources
- World of Warcraft Developer Q&A (September 17 stream), add-on answer at 01:20:52Blizzard Entertainment (YouTube)
- WoW: Forever Will Have Addon Changes from MidnightWowhead
- What the WoW Forever beta breaks for addons: secret health values, dead secure snippets, new APIsWoW Forever Builds
- AddonsWarcraft Forever
- TOC formatWarcraft Wiki
- WOW_PROJECT_IDWarcraft Wiki
- Secret ValuesWarcraft Wiki
- Patch 12.0.0/API changesWarcraft Wiki
- WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startupWorld of Warcraft Forums (player bug report)
- Addon compartmentWarcraft Wiki
- Settings APIWarcraft Wiki
- World of Warcraft Forever guides are up for order nowRestedXP
- Zygor's World of Warcraft: Forever guides launching this NovemberZygor Guides
- Blizzard client source: ProjectConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
- Questie release notes on GitHub
- Blizzard, Deep Dive Panel Recap