WoW Forever Addon Patterns: Forever Is a Third Client

Published Updated Beta reports from build 1.60.1.69913

Share

Addon guide page 2 of 7

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

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.

SurfaceClassic EraMidnightForever
WorldOriginal worldCurrent expansionOriginal world, new zones, cap 60
UI codeClassic APIMainline, 12.xMainline family, game type Camelot
Interface1150912010016001 on the beta
Combat logOpen to addonsRegistering CLEU errorsReported unavailable
Health mathPlain numbersSecret under restrictionsSecret number seen on build 69913
WOW_PROJECT_ID2118 (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.

Detect.lua
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.

  1. Call the API.
    type() still reports number, string or boolean.
  2. Ask issecretvalue
    before you compare, branch on or print it.
  3. If secret, use a widget.
    Otherwise show a fixed label.
  4. Don't trust pcall with 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.

Questie GitHub release v12.0.1+v1.0.3 notes, with Added Forever client support first under New Features and Forever fixes below
Share Image: Questie GitHub release v12.0.1+v1.0.3 notes, with Added Forever client support first under New Features and Forever fixes below

Questie's release notes list a fix that adds safeguards against manipulating Secret Values in Forever.Source: Questie release notes on GitHub, captured Sep 30, 2026.

Test You Can Paste in Game

Chat command
/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:

SurfaceVerdictWhy
Bags, bank, vendor, tooltipsBuildPresents data the UI already shows
Quest log, map pins, route notesBuildC_Map.SetUserWaypoint is the safe pin, not the super-track call
Nameplates and unit artBuild carefullyWarcraft Forever: NAME_PLATE_UNIT_ADDED can fire before the unit is populated. Check again a moment later
Secret-safe personal stripBuildThe Forever Beacon sample is the reference
Damage or healing meterDo notBuilt-in meter; do not assume addon access to its restricted data
Classic WeakAuras packsDo not portWowhead: WeakAuras stopped development before Midnight
Click-cast healer framesWaitSecure snippets failed to compile on 69913; may be a bug
Action bar paging via snippetsWaitSame 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_ID of 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.

WoW Forever Options window on Languages and Social, with the Preferred Online Language dropdown listing English, LatAm Spanish and Brazilian Portuguese
Share Image: WoW Forever Options window on Languages and Social, with the Preferred Online Language dropdown listing English, LatAm Spanish and Brazilian Portuguese

The WoW Forever Options window, as Blizzard showed it in its Preferred Online Language screenshot.Source: Blizzard, Deep Dive Panel Recap

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

  1. World of Warcraft Developer Q&A (September 17 stream), add-on answer at 01:20:52Blizzard Entertainment (YouTube)
  2. WoW: Forever Will Have Addon Changes from MidnightWowhead
  3. What the WoW Forever beta breaks for addons: secret health values, dead secure snippets, new APIsWoW Forever Builds
  4. AddonsWarcraft Forever
  5. TOC formatWarcraft Wiki
  6. WOW_PROJECT_IDWarcraft Wiki
  7. Secret ValuesWarcraft Wiki
  8. Patch 12.0.0/API changesWarcraft Wiki
  9. WOWF Beta: Addon SavedVariables appear to write correctly to disk but are not restored at startupWorld of Warcraft Forums (player bug report)
  10. Addon compartmentWarcraft Wiki
  11. Settings APIWarcraft Wiki
  12. World of Warcraft Forever guides are up for order nowRestedXP
  13. Zygor's World of Warcraft: Forever guides launching this NovemberZygor Guides
  14. Blizzard client source: ProjectConstants.lua (retained build 70338; mirror may change)Blizzard Entertainment (source mirrored by Gethe)
  15. Questie release notes on GitHub
  16. Blizzard, Deep Dive Panel Recap