KERZO ADDONS
Kerzo Classic Quest Log (v6.4.0)

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.

Global Namespaces

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:

Certified Multi-Client Matrix

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

THEME KerzosQuestLogAPI:RegisterTheme(themeID, themeData)
▼

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

boolean success, string? errorMessage

Example

Lua — Register Custom Theme
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,
})
THEME KerzosQuestLogAPI:UnregisterTheme(themeID)
▼

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

boolean success, string? errorMessage
THEME KerzosQuestLogAPI:ApplyTheme(themeID)
▼

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

boolean success, string? errorMessage

Example

Lua — Apply Theme Programmatically
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
QUERY KerzosQuestLogAPI:GetCurrentTheme()
▼

Returns the identifier string of the visual theme currently active in KCQL.

Returns

string currentThemeID (e.g. "classic", "dark", "elvui", "ellesmere")
QUERY KerzosQuestLogAPI:GetRegisteredThemes()
▼

Returns a dictionary copy containing metadata of all external registered themes.

Returns

table registeredThemes — [themeID] = { id, name, author, description, isDetected }

4. UI Extension Points

BADGE KerzosQuestLogAPI:RegisterQuestBadge(badgeID, badgeData)
▼

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, texCoords
    • getText (function, optional): function(questID) -> stringText, r, g, b
    • onTooltip (function, optional): function(tooltip, questID)
    • onClick (function, optional): function(questID, mouseButton)

Returns

boolean success, string? errorMessage

Example

Lua — Register Quest Coordinate Badge
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,
})
BUTTON KerzosQuestLogAPI:RegisterDetailButton(buttonID, buttonData)
▼

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) -> boolean
    • tooltip (string|function, optional): Tooltip text.

Returns

boolean success, string? errorMessage

5. Control & Lifecycle Methods

EVENT KerzosQuestLogAPI:RegisterCallback(eventName, callbackFunc)
▼

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

boolean success, string? errorMessage

Example

Lua — Listen to Quest Selection
local API = _G.KerzosQuestLogAPI
if API then
    API:RegisterCallback("OnQuestSelected", function(questID)
        print("|cff00ff00[MyAddon]|r User selected quest ID:", questID)
    end)
end
QUERY KerzosQuestLogAPI:GetSelectedQuest()
▼

Returns the numeric questID of the quest currently selected in the quest viewer.

Returns

number? questID — Returns quest ID or nil if no quest is selected.
NAV KerzosQuestLogAPI:OpenQuest(questID)
▼

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

boolean success

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.

Lua — Canonical Skin Registration Pattern
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:

Badge Rendering Pipeline

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

KCQL v6.2.5 — Public Extension & Theming API Release November 9, 2026
  • Public Extension API: Published canonical _G.KerzosQuestLogAPI / KerzosQuestLog.API with 10 sandboxed methods.
  • Open Theming Engine: Full decoupling of themes. External developers and UI suites can register custom themes cleanly via RegisterTheme and UnregisterTheme.
  • Zero-Taint Security: Encapsulated all external callbacks and hooks inside protective pcall wrappers.
  • 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).
KCQL v6.2.0 — Dual-Panel Architecture & Theme Engine October 2026
  • Dual-panel classic layout with responsive high-DPI scaling.
  • ElvUI and EllesmereUI native skin adapters.