promotional bannermobile promotional banner
premium banner
ForgeDMC is a suite of lightweight, standalone Lua modules designed for the modern World of Warcraft API . It provides all the functionality of the aging Ace3 library suite—plus common utility libs—without the heavy memory footprint!

Description

Send a donation to help keep this project going :  Square Donation  Venmo Donation  CashApp 

ForgeDMC Toolkit — Native-First WoW Addon Framework
Stop building for 2008. Build for the Warband Era. 21 surgical, standalone modules that replace Ace3, LibStub, and every legacy static library — by doing the only sensible thing: using the game's own C++ engine APIs directly.
21
Modules
4,592
Total Lines
0
Dependencies
26
Libs Replaced
~92%
Less Memory
Performance by the Numbers
The Core Advantage: Native Intelligence
ForgeDMC modules are engineered to be dependency-free and zero-bloat. By leveraging modern APIs introduced in Dragonflight and The War Within, ForgeDMC delivers a premium development experience with a fraction of the CPU and memory overhead of the legacy Ace3 stack.
~92%
Memory Reduction
~180 KB vs ~2.4–4.1 MB for a full legacy stack
~88%
CPU Efficiency Gain
<0.1ms idle vs 0.8–1.4ms with Ace3 loaded
~80%
Faster in Combat
<0.8ms vs 2.5–5.0ms during raid-level activity
0
Micro-Stutters
Native frame pooling eliminates Lua GC spikes
Metric Legacy (Ace3 + LibStub Stack) ForgeDMC Toolkit
Static Memory 2.4 MB – 4.1 MB of Lua tables loaded on every login ALWAYS LOADED ~180 KB total. Cached lazily only when accessed. ON DEMAND
CPU (Idle) 0.8ms – 1.4ms continuous overhead <0.1ms. Practically invisible when idle. ~88% FASTER
CPU (Combat) 2.5ms – 5.0ms under high aura load <0.8ms. Native C++ handles the heavy lifting. ~80% FASTER
GC Churn High — simulated frames generate frequent Lua "trash" GC SPIKES Minimal — ForgeGlow and ForgeDialog pool and reuse frames. POOLED
Patch Resilience Breaks on every UI reskin until library authors ship updates. FRAGILE Inherits Blizzard's UI updates automatically. Zero maintenance. AUTO
Taint Risk Shared global mutation tables across 50+ addons. HIGH RISK Isolated per-addon. No shared mutable globals. No cross-addon contamination. ISOLATED
Dependency Chain LibStub → CallbackHandler → AceEvent → AceAddon → [your code] No chain. One file. Zero external requirements. STANDALONE
Root Cause Analysis
What Is Actually Wrong With Legacy Libraries
This is not a rant — these are engineering facts. Ace3 was a genuine achievement when written in 2007. Blizzard has since rebuilt the entire UI layer. The libraries never meaningfully adapted.
Blizzard spent the last four years systematically rebuilding the WoW engine surface. The Settings API arrived in Dragonflight. The C_Map system was rewritten. The C_Reputation API was modernised. The AddonCompartment tray replaced minimap chaos in The War Within. C_Timer, DropdownButtonMixin, C_Spell.IsSpellInRange — the game now provides natively, in C++, almost everything Ace3 was invented to provide in Lua. Ace3 kept shipping. ForgeDMC uses what the engine actually offers.
✗ LibStub
Maintains a single global mutation table that every Ace-based library in every installed addon writes into simultaneously. When one addon ships a broken version, it corrupts the registry for all 50 others. This has caused mass addon failures on patch day for fifteen consecutive years.
✗ AceDB-3.0
Routes every SavedVariables read through five function calls and three metatable lookups. Hundreds of these reads happen per frame across all running addons. Direct table access is always faster — AceDB offers zero benefit over it on modern WoW.
✗ AceGUI-3.0
Constructs every settings widget as a custom Lua frame with custom backdrop textures. When Blizzard changes the UI skin — as they did in Dragonflight and again in The War Within — every widget breaks visually until library maintainers ship an update you don't control.
✗ AceConfig-3.0
Requires settings defined as deeply nested tables-of-tables with type strings, validation callbacks, and multi-level option group hierarchies. It is effectively its own DSL embedded inside Lua — new developers spend hours deciphering why a checkbox isn't appearing.
✗ LibBabble × 3 (Boss / Faction / Zone)
Ships tens of thousands of hardcoded string literals in every supported locale, loaded into memory on every login whether accessed or not. Every patch that adds an instance requires a human to update a text file before users see correct data again.
✗ LibDBIcon + LibDataBroker + CallbackHandler
Four libraries to place a 32×32 pixel button on the minimap. The button does not correctly save its angle when the minimap shape is non-circular. Shape-aware math for SQUARE, SIDE, and CORNER variants requires additional code not provided out of the box.
✗ ChatThrottleLib
Written for a bandwidth era that no longer exists, using OnUpdate frame hooks that predate C_Timer by many years. The priority system was designed when connections could disconnect at 10 messages per second. The same code runs untouched today.
✗ HereBeDragons
Maintained large internal tables of map transformation data for pre-Legion coordinate spaces. Since the map system was rebuilt for Battle for Azeroth, C_Map handles all coordinate transformations natively in the C++ engine. The library ships thousands of lines the game already does for free.
The cumulative load of a fully Ace3-equipped addon — AceAddon, AceEvent, AceDB, AceConsole, AceHook, AceTimer, AceBucket, AceComm, AceConfig, AceConfigDialog, AceConfigRegistry, AceDBOptions, AceGUI, LibStub, CallbackHandler, LibSharedMedia, LibDataBroker, LibDBIcon — is over 12,000 lines of Lua executing before your first line of addon code runs. Every character login. Every UI reload. Every /reload.
Tier 1 — Core Toolkit v1.1.0
The Core Eight
Direct replacements for the Ace3 library suite. Familiar lifecycle and API conventions, rebuilt from the ground up on the modern WoW API surface. Zero shared global state.
ForgeCore
↳ AceAddon-3.0 · AceEvent-3.0 · AceConsole-3.0
The spine of the toolkit. OnInitialize → OnEnable → OnDisable lifecycle fires at ADDON_LOADED and PLAYER_LOGIN respectively. All addons share a single hidden bootstrap frame — no per-addon frame overhead. Events auto-register and auto-unregister with Blizzard as listeners come and go. Every handler runs through pcall so one broken callback cannot bring down the rest.
NewAddon · NewModule · RegisterEvent · RegisterChatCommand · Print · Printf · Enable · Disable · OpenOptions
291 lines
ForgeDB v1.1.0
↳ AceDB-3.0
SavedVariables across three scopes. db.global is account-wide. db.char is keyed as "Name-Realm" for true per-character uniqueness. db.profile supports switchable named profiles. Reading a value is direct table access — one lookup, no metatable chain. Full profile copy, reset, and deletion. Fixed in v1.1.0 from a critical missing constructor bug.
ForgeDB:New · db.global · db.char · db.profile · SetProfile · CopyProfile · ResetProfile · GetProfiles · DeleteProfile
201 lines
ForgeComm v1.1.0
↳ AceComm-3.0
Addon messaging over C_ChatInfo.SendAddonMessage. Safe to register before PLAYER_LOGIN — prefixes queue automatically. SendChunked handles any payload size transparently — splits into 250-byte packets, receiver callback fires once with the fully reassembled string. Zero chunking logic required in your addon code.
Register · Send · SendChunked · Unregister · IsRegistered
223 lines
ForgeHook
↳ AceHook-3.0
Mixin-style hooking via Embed. Three hook types: restoreable method hooks; restoreable frame script hooks with correct no-previous-script handling; permanent taint-safe SecureHook via hooksecurefunc. Hook state stored in weak-keyed tables so abandoned objects do not leak memory.
Embed · Hook · HookScript · SecureHook · Unhook · UnhookScript · UnhookAll
129 lines
ForgeLocale v1.1.0 — Rewrite
↳ AceLocale-3.0
Per-locale proxy tables with automatic enUS fallback. L["key"] = true uses the key itself as the string. Reading any unregistered key returns the key string — never nil, never an error. Fully idempotent registration. Rebuilt from scratch in v1.1.0 — previous file contained a copy of ForgeWidgets.
Register(addonName, locale) · Get(addonName) · GetRegisteredLocales · IsLocaleRegistered · DumpLocale
199 lines
ForgeOptions v1.1.0
↳ AceConfig-3.0 · AceConfigDialog · AceConfigRegistry · AceDBOptions
Injects settings directly into Blizzard's native Interface Options window using the Settings API (Dragonflight 10.0+). Controls inherit the current game skin, scale, and fonts automatically. Imperative API — no nested option tables, no type strings, no callback registry. Requires Dragonflight 10.0+.
Create · AddHeader · AddCheckbox · AddSlider · AddDropdown · CreateSubcategory · Register · Open
253 lines
ForgeTimer v1.1.0
↳ AceTimer-3.0 · AceBucket-3.0
All timers backed by C_Timer — not OnUpdate frame hooks. One-shot, repeating, Debounce (restart delay per call, fire once after silence — right for search boxes), Throttle (fire immediately then block — right for cursor tracking), and BucketEvent (coalesce rapid events like BAG_UPDATE into one batched callback).
Embed · ScheduleTimer · ScheduleRepeatingTimer · CancelTimer · Debounce · Throttle · RegisterBucketEvent · CancelAllTimers
242 lines
ForgeWidgets v1.1.0
↳ AceGUI-3.0
Native WoW frame and widget factories using Blizzard's own XML templates. Widgets inherit the current skin automatically. Dropdown auto-detects TWW 11.0+ DropdownButtonMixin; falls back to legacy template on older clients. All anonymous frame crash bugs fixed. Includes CreateTabStrip. Escape closes windows via UISpecialFrames.
CreateWindow · CreatePanel · CreateButton · CreateCheckBox · CreateSlider · CreateDropdown · CreateEditBox · CreateScrollFrame · CreateTabStrip
297 lines
Tier 2 — Extended Toolkit v1.0.0
The Extended Thirteen
Professional-grade replacements for the most common WoW addon libraries beyond Ace3. Every file is standalone. Drop in only what your addon needs.
Versioning & Data Intelligence
ForgeStub
↳ LibStub
Solves the version collision problem LibStub was invented for — when multiple addons bundle the same file, the newest wins. Version metadata lives in a private internal registry — library tables are clean Lua tables with no internal bookkeeping fields. Adds GetVersion, IsLoaded, and sorted Iterate that LibStub doesn't provide.
New · Get · GetVersion · IsLoaded · Iterate
117 lines
ForgeBabble
↳ LibBabble-Boss-3.0 · LibBabble-Faction-3.0 · LibBabble-SubZone-3.0
Three libraries in one file containing zero static string data. Boss names from C_EncounterJournal. Zone names from C_Map.GetMapInfo. Faction names from C_Reputation.GetFactionDataByID. Always current, always localised. Results cached lazily after first call.
Boss:GetByID · Boss:FindID · Zone:GetByMapID · Zone:Scan · Faction:GetByID · Faction:Scan · PrintStats
244 lines
ForgePacker
↳ LibDeflate serialisation · AceSerializer
Table serialisation to/from a compact delimiter-separated string for addon messages or SavedVariables. Handles all Lua primitives including nested tables, booleans, and nil. The format is human-readable in a debugger — you can understand serialised data without a decoder during development.
Pack(tbl) · Unpack(str) · PackArray · UnpackArray
125 lines
ForgeMedia
↳ LibSharedMedia-3.0
Shared name→path registry for fonts, statusbar textures, sounds, borders, and backgrounds. Ships the five standard WoW fonts pre-registered. Any custom media type string accepted. Lowercase-normalised keys mean "Font" and "font" are identical. No LibStub registration loops required.
Register · Fetch · List · HashList · Exists
67 lines
Minimap, UI & Presentation
ForgeBroker
↳ LibDataBroker-1.1 · LibDBIcon-1.0
LibDataBroker and LibDBIcon merged into one self-contained module. Correct position math for all 14 minimap shape variants. Smart tooltip anchoring by screen quadrant. AddonCompartment support for TWW 11.0+. Zero external dependencies.
Register · Show · Hide · SetShown · Lock · Unlock · SetIcon · SetPosition · SetMouseoverOnly · AddToCompartment
426 lines
ForgeMinimapButton
↳ LibDBIcon-1.0
Fine-grained minimap button control independent of any data object concept. Uses native Blizzard minimap texture IDs — visually indistinguishable from built-in WoW buttons. Per-button icon tint via iconR/G/B. Full AddonCompartment support.
Register · Show · Hide · Lock · Unlock · SetShowOnEnter · SetPosition · Refresh · AddToCompartment · RemoveFromCompartment
523 lines
ForgeDialog
↳ LibDialog-1.0
Modal dialogs with full widget pooling — frames, buttons, editboxes, checkboxes recycled between spawns. Up to 4 simultaneous dialogs stacked below native StaticPopups. Supports multiple editboxes, timeouts, exclusive mode, Escape-to-close, and OnUpdate callbacks.
Register · Spawn · Dismiss · DismissAll · IsActive · GetActive
567 lines
ForgeSkin
↳ Masque
Dark flat 1-pixel border theme for your addon's own frames. SkinAll(frame, true) recursively walks all children applying the correct skin by object type. Unlike Masque, ForgeSkin gives pixel-precise control over only your frames.
SkinFrame · SkinButton · SkinEditBox · SkinScrollFrame · SkinCheckButton · SkinAll · SetTheme
133 lines
Spatial, Interaction & Network
ForgeGeo
↳ HereBeDragons
World-space distance and proximity checks via native C_Map coordinate APIs. Zero static coordinate tables. Always accurate after any map system update.
WorldDistance · IsUnitNearby · GetPlayerMapPosition
79 lines
ForgeGlow
↳ LibCustomGlow
Proc highlight and action glow effects via pooled frame recycling — eliminates GC micro-stutters that LibCustomGlow's allocation pattern causes during heavy aura activity.
ShowGlow · HideGlow · ShowActionGlow · SetGlowColor
155 lines
ForgeWindow
↳ LibWindow
Frame position and scale persistence. Register restores position immediately and hooks drag to auto-save on move — no manual save calls needed anywhere in your addon.
Register · Restore · Reset · Clamp · GetPosition
119 lines
ForgeQueue
↳ ChatThrottleLib
Addon message throttle via C_Timer — not legacy OnUpdate hooks. Priority queuing with configurable burst rate for modern connection speeds.
Enqueue · SendAddonMessage · Flush · SetThrottle
107 lines
ForgeRange
↳ LibRangeCheck
Unit range bracket detection via C_Spell.IsSpellInRange. No static spell ID tables per patch. Register probe spells once, query range brackets on demand.
GetMinRange · GetRangeBracket · RegisterProbeSpell
95 lines
ForgeStub
↳ LibStub (versioning layer)
Private internal version registry keeps library tables as clean Lua objects. Prevents the global mutation contamination that has caused mass addon failures on patch days for fifteen years.
New · Get · GetVersion · IsLoaded · Iterate
117 lines
All 21 Modules
Quick Reference
Module Lines Replaces Key Methods
◆ CORE TOOLKIT — v1.1.0
ForgeCore 291 AceAddon · AceEvent · AceConsole NewAddon · RegisterEvent · RegisterChatCommand · Print
ForgeDB 201 AceDB-3.0 New · SetProfile · CopyProfile · ResetProfile
ForgeComm 223 AceComm-3.0 Register · Send · SendChunked
ForgeHook 129 AceHook-3.0 Hook · HookScript · SecureHook · UnhookAll
ForgeLocale 199 AceLocale-3.0 Register · Get · GetRegisteredLocales · DumpLocale
ForgeOptions 253 AceConfig × 4 modules Create · AddCheckbox · AddSlider · AddDropdown · Register
ForgeTimer 242 AceTimer · AceBucket ScheduleTimer · Debounce · Throttle · RegisterBucketEvent
ForgeWidgets 297 AceGUI-3.0 CreateWindow · CreateSlider · CreateDropdown · CreateTabStrip
◆ EXTENDED TOOLKIT — v1.0.0
ForgeStub 117 LibStub New · Get · GetVersion · IsLoaded · Iterate
ForgeBabble 244 LibBabble × 3 Boss:GetByID · Zone:GetByMapID · Faction:GetByID
ForgeBroker 426 LibDataBroker · LibDBIcon Register · Show · Hide · AddToCompartment
ForgeMinimapButton 523 LibDBIcon-1.0 Register · SetShowOnEnter · Refresh · SetPosition
ForgeDialog 567 LibDialog-1.0 Register · Spawn · Dismiss · DismissAll
ForgeGeo 79 HereBeDragons WorldDistance · IsUnitNearby · GetPlayerMapPosition
ForgeGlow 155 LibCustomGlow ShowGlow · HideGlow · ShowActionGlow · SetGlowColor
ForgeMedia 67 LibSharedMedia-3.0 Register · Fetch · HashList · Exists
ForgePacker 125 LibDeflate · AceSerializer Pack · Unpack · PackArray · UnpackArray
ForgeQueue 107 ChatThrottleLib Enqueue · SendAddonMessage · Flush · SetThrottle
ForgeRange 95 LibRangeCheck GetMinRange · GetRangeBracket · RegisterProbeSpell
ForgeSkin 133 Masque SkinButton · SkinAll · SetTheme
ForgeWindow 119 LibWindow Register · Restore · Reset · Clamp
Getting Started
Integration in Four Steps
ForgeDMC uses familiar syntax. The transition from Ace3 is a drop-in experience for most addons — no architectural rewrites required.
01
Download
Grab the full 21-file pack or individual modules. Every file is standalone — include only what your addon uses.
02
Add to .toc
Place modules in a Libs\ folder and reference them in your .toc before your main addon file. No LibStub required.
03
Initialize
Call ForgeCore:NewAddon("MyAddon") and define OnInitialize / OnEnable. The Ace3 lifecycle works identically.
04
Verify Performance
Run /console scriptProfile 1 and compare CPU usage against your previous Ace3 implementation to confirm the gains.
Example .toc — register only what you use
## SavedVariables: MyAddonDB

# Include only what you use
Libs\ForgeCore.lua
Libs\ForgeDB.lua
Libs\ForgeOptions.lua
Libs\ForgeTimer.lua
Libs\ForgeWidgets.lua
Libs\ForgeComm.lua
Libs\ForgeLocale.lua
Libs\ForgeMinimapButton.lua

MyAddon.lua
MyAddon.lua — complete skeleton
local A = ForgeCore:NewAddon("MyAddon")
local L = ForgeLocale:Get("MyAddon")

function A:OnInitialize()
  self.db = ForgeDB:New("MyAddonDB", {
    profile = { scale=1.0, show=true },
  })
  local opts = ForgeOptions:Create("MyAddon", "My Addon", self.db.profile)
  opts:AddCheckbox("show", "Show", "", true)
  opts:AddSlider("scale", "Scale", "", 0.5, 2.0, 0.1, 1.0)
  opts:Register(self)
  self:RegisterChatCommand("myaddon", "Cmd")
end

function A:OnEnable()
  ForgeMinimapButton:Register("MyAddon", {
    icon    = "Interface\\Icons\\Gear",
    OnClick = function() self:OpenOptions() end,
  }, self.db.global)
  self:RegisterEvent("PLAYER_ENTERING_WORLD")
end
Supported Clients
Compatibility
The War Within 11.0+
Full feature set. AddonCompartment auto-detected for ForgeBroker and ForgeMinimapButton. WowStyle1DropdownTemplate auto-detected in ForgeWidgets. Recommended version.
Dragonflight 10.0+
Full feature set including ForgeOptions (requires Blizzard Settings API). Minimum recommended version for all 21 modules.
Shadowlands 9.x
All modules except ForgeOptions. Legacy dropdown path used in ForgeWidgets. Core lifecycle, database, communication, and timer modules fully compatible.
Zero External Dependencies
No LibStub. No CallbackHandler. No Ace3. Drop in only the files your addon needs. Nothing requires anything else.
Midnight 12.0 (Future)
Native API design ensures forward compatibility. ForgeOptions and ForgeWidgets wrap Blizzard's own systems, automatically inheriting any UI changes Blizzard ships.
Audience Note
ForgeDMC is a developer library. It provides no user-facing functionality on its own. Include only the modules your addon requires in your .toc. MIT-licensed.
For Your Addon Page
The Forge-Performance Badge
If your addon uses ForgeDMC, display this badge on your CurseForge, Wago, or GitHub project page to communicate the native-first advantages to your users.
⚒ ForgeDMC Certified · Native Performance
This addon is powered by the ForgeDMC Toolkit — a native-first framework replacing legacy static libraries.
Metric ForgeDMC Result What It Means for You
Static Data Bloat 0.0 MB Boss, zone, and faction names queried live from Encounter Journal and Map APIs — zero memory cost for unused locales.
Memory Footprint ~92% Reduction Every module stays under 300 lines. Results cached lazily only when accessed. No megabytes of preloaded tables.
CPU Overhead Native Optimised UI rendering offloaded to Blizzard's own C++ Settings and Widget APIs. Practically invisible to the profiler when idle.
GC Churn Rate Minimised Frame pooling in ForgeGlow and ForgeDialog eliminates micro-stutters by reusing objects instead of allocating new ones.
Patch Resilience Native-Auto Inherits Blizzard's UI updates, skins, and font changes automatically. No manual library updates required on patch day.
Taint Protection Isolated No shared global mutation tables. Logic is isolated per addon, significantly reducing "Interface action failed" risk in combat.
ForgeDMC Toolkit
Native-First · Zero Dependencies · Built for the Warband Era
Core v1.1.0  ·  Extended v1.0.0  ·  Released 2026-03-21  ·  21 Modules  ·  4,592 Lines  ·  Replaces 26 Libraries  ·  MIT License
The Ace3 team and WoW addon community built something remarkable for their era and set standards the community has worked from for nearly two decades. ForgeDMC exists because those standards deserve a modern implementation — one that grows with the game rather than against it.