Kerzo Classic Quest Log Public API
Authoritative technical documentation for World of Warcraft addon developers and UI customizers. Integrate custom skins, add quest metadata badges, inject custom action buttons, and control the quest viewer programmatically with guaranteed Zero-Taint execution and zero CPU idle in background.
The KCQL Public API is accessible through two identical global entry points:
_G.KerzosQuestLogAPI • KerzosQuestLog.API
All methods are strictly sandboxed using protective pcall wrappers. Third-party skin or badge exceptions will never break the core quest log interface or taint secure execution paths.
1. Technical Architecture & Zero-Taint Sandbox
World of Warcraft modern and classic clients strictly regulate secure execution paths. KCQL implements a decoupled event-driven architecture designed to withstand combat lockdown and cross-addon interactions:
| Principle | Implementation Detail | Addon Developer Guarantee |
|---|---|---|
| Zero Taint Propagation | All external callbacks and theme application hooks execute encapsulated inside pcall blocks. |
Runtime errors in third-party addons will not trigger Blizzard ActionBlocked UI taint errors. |
| Combat-Lockdown Safety | Header calibration, resize handlers, and layout updates evaluate InCombatLockdown() before modifying protected attributes. |
Safe opening and inspection during combat without frame stutter or secure execution crashes. |
| Zero CPU Idle | Event-driven reactive pipeline. KCQL uses zero permanent OnUpdate polling scripts. |
0.00ms CPU footprint when idle, meeting the Kerzo Suite performance protocol. |
| Dynamic Theme Synchronization | Themes registered via RegisterTheme are automatically registered into the core settings dialog and visual controller. |
Immediate availability in /kql config dropdown without modifying KCQL source code. |
2. Multi-Client & 10 Blizzard Locales
KCQL operates seamlessly across all active World of Warcraft branches and language clients:
WoW Classic Era (1.15.x) & Season of Discovery (SoD): Native full support with dual-panel classic layout.
WoW Cataclysm / Classic Anniversary / TBC / Wrath: Full backward and forward compatibility.
WoW Forever (1.60.x) & Modern Retail (11.x): High DPI scaling and dynamic font support.
10 Official Languages (12 Locales): enUS, enGB, esES, esMX, deDE, frFR, itIT, ptBR, ruRU, koKR, zhCN, zhTW with 100% localization parity (616 translated strings, 0 missing keys).
3. Theme & Skin Methods
Registers a custom visual skin into KCQL. The theme is immediately added to the valid theme catalog, made selectable in the configuration UI, and emits an OnThemeRegistered event.
Parameters
-
themeID
string, required
Unique alphanumeric identifier for the theme (e.g.
"leatrix","nordic_dark","cyberpunk"). -
themeData
table, required
Table containing metadata and lifecycle callbacks for the theme:
name(string|function, required): Display name in settings dropdown.onApply(function, required): Callback invoked when the theme is activated:function(kql).onRemove(function, optional): Callback invoked when the theme is deactivated:function(kql).author(string, optional): Author or suite name.description(string, optional): Short description.
Returns
Example
local API = _G.KerzosQuestLogAPI
if not API then return end
API:RegisterTheme("nordic_dark", {
name = "Nordic Dark",
author = "Community",
description = "Minimalist slate-grey appearance with thin 1px borders.",
onApply = function(kql)
-- Hide classic Blizzard parchment and stone NineSlice
if kql.NineSlice then kql.NineSlice:SetAlpha(0) end
if kql.IconLibro then kql.IconLibro:Hide() end
if kql.PortraitContainer then kql.PortraitContainer:Hide() end
-- Apply your custom backdrop or frame styling
end,
onRemove = function(kql)
-- Clean up custom frame borders when user switches theme
end,
})
Unregisters an external theme. If the theme is currently active, KCQL automatically falls back to "classic", invokes onRemove, and refreshes the display.
Parameters
-
themeID
string, required
Theme identifier to remove. Protected built-in themes (
classic,dark,contrast,light) cannot be unregistered.
Returns
Programmatically activates a registered theme. Saves the setting into the player's profile, triggers the theme's onApply callback, updates the interface, and fires OnThemeApplied and OnThemeChanged callbacks.
Parameters
-
themeID
string, required
Identifier of the theme to apply (e.g.
"leatrix","elvui","classic").
Returns
Example
local API = _G.KerzosQuestLogAPI
if API then
local ok, err = API:ApplyTheme("leatrix")
if not ok then
print("|cffff0000[MyAddon] Could not apply theme:|r", err)
end
end
Returns the identifier string of the visual theme currently active in KCQL.
Returns
Returns a dictionary copy containing metadata of all external registered themes.
Returns
4. UI Extension Points
Registers a custom badge or icon to be rendered next to quest entries in the main quest list.
Parameters
-
badgeID
string, required
Unique badge identifier (e.g.
"tomtom_waypoint","questie_source","kqe_expansion"). -
badgeData
table, required
Table with rendering logic:
getTexture(function):function(questID) -> texturePath, texCoordsgetText(function, optional):function(questID) -> stringText, r, g, bonTooltip(function, optional):function(tooltip, questID)onClick(function, optional):function(questID, mouseButton)
Returns
Example
local API = _G.KerzosQuestLogAPI
if not API then return end
API:RegisterQuestBadge("my_waypoint_badge", {
getTexture = function(questID)
if HasQuestWaypoint(questID) then
return "Interface\\AddOns\\MyAddon\\Media\\waypoint_icon.png"
end
return nil
end,
onTooltip = function(tooltip, questID)
tooltip:AddLine("Click to set active waypoint on map", 0.9, 0.9, 0.9)
end,
onClick = function(questID, button)
SetQuestWaypoint(questID)
end,
})
Injects an action button into the quest detail panel header or footer (e.g. Abandon, Share, Database lookup).
Parameters
- buttonID string, required Unique button identifier.
-
buttonData
table, required
Button specification:
text(string|function): Display label.onClick(function):function(questID, buttonFrame)isEnabled(function, optional):function(questID) -> booleantooltip(string|function, optional): Tooltip text.
Returns
5. Control & Lifecycle Methods
Registers an event callback function to listen to KCQL lifecycle events.
Parameters
-
eventName
string, required
Supported events:
"OnThemeChanged","OnThemeRegistered","OnThemeUnregistered","OnThemeApplied","OnQuestSelected","OnBadgeRegistered","OnDetailButtonRegistered". - callbackFunc function, required Function to execute when the event fires. Runs in a protected sandbox.
Returns
Example
local API = _G.KerzosQuestLogAPI
if API then
API:RegisterCallback("OnQuestSelected", function(questID)
print("|cff00ff00[MyAddon]|r User selected quest ID:", questID)
end)
end
Returns the numeric questID of the quest currently selected in the quest viewer.
Returns
Opens the KCQL quest log window if closed, selects the given quest, and scrolls the quest list into view.
Parameters
- questID number, required Quest ID to display in detail view.
Returns
6. External Skin Creation Guide (Community Skins & UI Suites)
KCQL provides an open, decoupled skinning engine. External addons and community UI suites (such as Leatrix, Tukui, or bespoke design packs) can customize the frame borders, title bars, and buttons while retaining full quest log functionality through the public API.
local kql = KerzosQuestLog
local API = _G.KerzosQuestLogAPI
if not API or not kql then return end
API:RegisterTheme("custom_skin", {
name = "Custom Theme",
author = "Community Developer",
description = "Sleek flat border with soft drop shadow and compact title bar.",
onApply = function(kqlFrame)
-- 1. Hide Blizzard classic stone NineSlice and book icon
if kqlFrame.NineSlice then kqlFrame.NineSlice:SetAlpha(0); kqlFrame.NineSlice:Hide() end
if kqlFrame.IconLibro then kqlFrame.IconLibro:Hide(); kqlFrame.IconLibro:SetAlpha(0) end
if kqlFrame.PortraitContainer then kqlFrame.PortraitContainer:Hide() end
if kqlFrame.Bg then kqlFrame.Bg:Hide() end
if kqlFrame.TopTileStreaks then kqlFrame.TopTileStreaks:Hide() end
-- 2. Style title text and custom components
if kqlFrame.TitleContainer and kqlFrame.TitleContainer.TitleText then
kqlFrame.TitleContainer.TitleText:SetTextColor(0.95, 0.95, 0.95)
end
if kqlFrame.CalibrarCabeceraYCierre then
kqlFrame:CalibrarCabeceraYCierre()
end
end,
onRemove = function(kqlFrame)
-- Restore Blizzard classic frame elements
if kqlFrame.NineSlice then kqlFrame.NineSlice:SetAlpha(1); kqlFrame.NineSlice:Show() end
if kqlFrame.IconLibro then kqlFrame.IconLibro:Show(); kqlFrame.IconLibro:SetAlpha(1) end
if kqlFrame.PortraitContainer then kqlFrame.PortraitContainer:Show() end
if kqlFrame.Bg then kqlFrame.Bg:Show() end
end,
})
7. Quest Badges Integration (e.g. TomTom, Questie, KQE)
Badges allow external addons to augment quest lines in the scrollable quest list without modifying KCQL buttons:
When a quest line is rendered, KCQL queries all registered badges via getTexture(questID).
If a texture is returned, a 16x16 icon is rendered on the right side of the quest title. Clicking or hovering over the badge routes events cleanly to onClick and onTooltip.
8. Lifecycle Events Reference
| Event Name | Payload Arguments | Trigger Description |
|---|---|---|
OnThemeChanged |
(themeID) |
Fired whenever the visual theme changes (via UI, API, or auto-detection). |
OnThemeRegistered |
(themeID, themeData) |
Fired when a new external theme is registered. |
OnThemeUnregistered |
(themeID) |
Fired when an external theme is removed. |
OnThemeApplied |
(themeID) |
Fired when a theme is successfully applied to the frame. |
OnQuestSelected |
(questID) |
Fired when the player selects a quest in the log. |
OnBadgeRegistered |
(badgeID, badgeData) |
Fired when an external quest badge is registered. |
OnDetailButtonRegistered |
(buttonID, buttonData) |
Fired when an external detail button is injected. |
9. Technical API Changelog
- Public Extension API: Published canonical
_G.KerzosQuestLogAPI/KerzosQuestLog.APIwith 10 sandboxed methods. - Open Theming Engine: Full decoupling of themes. External developers and UI suites can register custom themes cleanly via
RegisterThemeandUnregisterTheme. - Zero-Taint Security: Encapsulated all external callbacks and hooks inside protective
pcallwrappers. - Fixed Bug b9ty: Restored white text color reset on mouse release for track quest buttons.
- Multi-Language Parity: 100% localization parity across 10 official Blizzard languages (616 translated strings).
- Dual-panel classic layout with responsive high-DPI scaling.
- ElvUI and EllesmereUI native skin adapters.