# v12.0.19 (2026-04-26)

## Restoration Druid — Raid Frame Glows

Lifebloom panic and Soul of the Forest glows now show up on **default Blizzard raid/party frames** again. Since the 12.0.5 patch the addon could only glow Target and Focus frames; the workaround in this update brings raid frames back. Two glow conditions are wired up so far:

- **Lifebloom in its pandemic window** — green glow, same color as the existing Target/Focus icon glow.
- **Rejuvenation or Germination boosted by Soul of the Forest** — cyan glow, matches the Target/Focus icon color.

If both conditions hit the same unit at once, Lifebloom wins and shows the green glow — refreshing LB on time matters more than tracking an empowered HoT.

### What it looks like

The glow is a thick segmented border that marches slowly around the entire raid frame. It's not the same as the per-icon glow on Target/Focus — that wasn't possible to recreate on default raid frames after Blizzard locked down the buff icons in 12.0.5. The whole-frame border is the next best signal: it tells you the unit needs attention, and you'll know which buff from context (LB needs the most attention is almost always the tank).

### The sister "Lifebloom Glow" addon situation

If you've been running `LifebloomGlow` to fill this gap since 12.0.5, you can drop it now — this update covers the same case and adds the SOTF-empowered detection on top.

### Compatibility note

Originally tried to add per-icon glow support for Dander's Frames so users on that addon could keep the precise icon-based highlight. Abandoned — Dander's has its own built-in glow system that already covers Lifebloom and Rejuv, so no integration was needed.

### New: `/nha cufglow`

A diagnostic command for the raid-frame glow path. Prints whether the hooks installed, how many frames are being tracked, and what auras the addon sees on each unit. Useful if a glow doesn't appear when you expected one — run the command with the buff active and send me the output.

### Bug fixes

- Fixed an issue where the **first Lifebloom cast after `/reload`** didn't glow at pandemic. Subsequent casts worked fine, but the very first one of a session would silently miss. The cause was a race between Blizzard creating the raid frames and the addon installing its tracking hook — the addon now catches up at install time.
- Fixed an issue where **Rejuvenation / Germination empowered by Soul of the Forest never glowed any raid frames**. The earlier detection path was reading the buff's icon through an API that returns a base-Rejuv icon in M+ even when the buff visually shows the empowered version. Switched to the same detection method `LifebloomGlow` uses, which sees the correct icon.
- Fixed a Lua error burst (~23 errors at once) from the Wild Growth cast handler when execution context was tainted in M+. The error didn't break gameplay — it'd just spam the error frame after a Wild Growth cast in a tainted state — but it's gone now.

---

## Restoration Druid — Performance

Big performance fixes for Resto Druid. The addon used a lot more CPU than it should have, especially in raid — bad enough to cause visible stutter on heavy pulls. After this update it uses roughly **8× less CPU** and the stutter is gone.

### Bug fixes

- Fixed a Lua error when running `/nha debug` while in a chat window, M+, or arena.
- Fixed a Lua error that could fire repeatedly while targeting a boss in raid.

### New: `/nha perf`

A new command that measures how much work the addon is doing. Mostly for me to chase down regressions, but if performance ever feels off, run `/nha perf on`, do a pull, then `/nha perf off` and send me the chat output.

---


# v12.0.18 (2026-04-25)

## Core Refactor — NHA / NPA Alignment

A structural refactor of the core engine to bring **Nem: Healer Alerts** and its sister addon **Nem: Pet Alerts** into a near-identical layout. No gameplay behavior changes — same alerts, same triggers, same sounds, same display, same proc glows.

### Why

The two addons grew side-by-side and accumulated stylistic drift — different section ordering, different spec-matching strategies, different debouncing strategies, dead code on both sides. Future bug fixes and feature work are cheaper if both cores look the same. Both files now share the same 23 sections in the same order, with feature-specific divergences (glow infrastructure, group-units cache, multi-alert OnUpdate display, timer FontStrings, frame border) confined to clearly-bounded blocks.

### Spec matching simplified

`FindActiveModule` previously did a primary check on `mod.specIndex` with `mod.specID` as a fallback. The new code uses a single check: `mod.specID == NHA.GetSpecID()`, where `GetSpecID` is the same secret-value-safe helper NPA uses. All seven healer spec files already carried `specID` and were unaffected; the now-vestigial `specIndex` field is ignored.

### Database access — `self.db` design

Every database read and write inside a `:` method now uses `self.db` instead of `NHA.db`. This is purely stylistic — `self == NHA` inside any `function NHA:foo()` — but it makes the database access pattern uniform with NPA. Affected sites: 7 `NHA.db.enabled` references in the slash command handler, plus 2 `local _db = NHA.db` captures in the Target/Focus aura hooks inside `InitGlowHooks`. The `NHA.db` form remains in non-method local functions (`CreateDisplay`, `BuildAlertRows`, `ApplyDisplaySettings`, `Evaluate`, etc.) where there is no `self` in scope.

### Helper extraction

- `ResolveRelativeFrame(db)` extracted as a shared helper. Previously the 4-line "look up `db.relativeTo` in `_G` or fall back to `UIParent`" block was inlined twice — once in `CreateDisplay`, once in `ApplyDisplaySettings`. Now both call sites use the helper.

### Panel alignment with NPA

The options panel previously used widths that drifted between the two addons. Both now use identical canonical values:

- Panel width `PW: 664 → 668`
- Content width offset `CPW: CW → CW - 4`
- Display slider X position: `340 → 358`, width `270`
- Sound dropdown anchor offset: `306 → 324`
- Drag-stop saved fields now write the full 5-tuple including `relativeTo`, matching NPA. Previously dropped that field, which prevented the frame from anchoring to a non-`UIParent` parent across reloads if a future feature needed it.
- Restore button structured as one-property-per-line column form matching NPA's style. Button positioning variables renamed (`btnSpacing`, `totalBtnW`, `btnStartX`).
- `CORE_DEFAULTS` and `coreState` `=` columns aligned to the wider canonical position so shared keys land in the same column position as NPA.

### Lock / Unlock

- `SetLockState` now adopts NPA's pattern: `coreState.unlocked` is updated unconditionally first, then the frame is touched only if it exists. Previously bailed early if no display, which meant the state flag and the chat message would silently not fire if `SetLockState` was ever called pre-display. The frame border (NHA-specific) and lock-button text update remain inside the `if f` guard.
- Lock/unlock chat message now uses colored formatting: `Frame |cff00ff00unlocked|r — drag to reposition.` / `Frame |cffff4444locked|r.`

### `f:SetSize`

- Display frame size remains `(900, 160)` (unchanged). NPA was bumped from `(900, 150)` to match this canonical value.

### New: Debug command

- `/nha debug` — prints class, active module, enabled state, group/raid status, LibCustomGlow status, glow-hook installation state, and then delegates to `mod:Debug(db)` if the active spec module provides one.
- The contract documentation now lists `Debug` as an optional module hook.

### Slash command unification

- Command order, help text, and colored status strings now match NPA's format exactly.
- The addon-compartment handler now uses the `_panelWasOpen` tracking pattern so the WoW Settings panel closes cleanly when reopened from the dropdown.
- `ToggleTest()` now respects `IsFullyImplemented()` and silently no-ops if no spec is active, instead of letting the test ticker spin against a missing module.
- Redundant `if not IsFullyImplemented() then return end` removed from the event handler — the preceding `if not mod then return end` already covers it.

### Sound fallback

- `GetSoundPath` now falls back to the bundled `RobotBlip` sound when the requested sound is missing or LibSharedMedia returns nothing. Previously it returned nil, which silently dropped the alert sound. An enabled sound now always plays something.

### Comment cleanup

- File header capabilities list collapsed to a 5-line summary pointing at the spec contract.
- 80-line spec module contract block compressed to ~25 lines documenting the table fields without prose paragraphs.
- Verbose secret-value commentary in `GetSpecID` collapsed.
- 5-line `InitGlowHooks` explanation block collapsed to 2 lines (the "compact frames inaccessible since 12.0.5" note).
- Section banners on tiny utility functions removed where redundant.
- Many redundant single-line comments above self-explanatory code dropped.
- `aoH` height calculation collapsed from a labeled stack of components into a single readable line.

### Removed

- Unused constant `MAX_ALERT_ROWS = 6` (set, never read).
- Unused upvalue `local UnitExists = UnitExists` (no caller in NHA core).
- 8 `NHA.X = X` exposures that no spec file uses: `FONTS_PATH`, `MEDIA_PATH`, `UI_FONT`, `GetSoundPath`, `SOUND_NAMES`, `MergeDefaults`, `InvalidateGroupUnitsCache`, `ApplyDisplaySettings`. Internal locals retained.
- `f:EnableMouse(false)` in `CreateDisplay` (immediately overridden by `ApplyDisplaySettings`).
- Login chat message (`"Loaded. Type /nha for options."`) — for parity with NPA, which has no login greeting. The addon still loads silently and you can check status with `/nha status`.
- Spec-switch chat messages (`"Alerts paused"` / `"Alerts active"`) — same parity reason.

### Spec module contract

- Contract comment now documents the full set of optional hooks: `NeedsTicker`, `Debug`, plus the existing `EvaluateFrameGlow`, `RefreshGlows`, `ClearAllGlows`, `OnEvent`, `BuildAlertOptions`, `noTest`, `noSound`, etc.
- Mention of `specIndex` removed — `specID` is the only required identifier.

### Section banner

- `-- Spec Helpers` matches NPA's banner.

---

# v12.0.17 (2026-04-21)

## Bug Fix — 12.0.5 Compatibility

### Root Cause

`CompactUnitFrame_UtilSetBuff` was removed by Blizzard in patch 12.0.5 as part of their compact frame API cleanup. The call to `hooksecurefunc` on this function threw a hard Lua error at `PLAYER_LOGIN`, crashing `OnLogin` before `ActivateModule` was ever called. This left the addon in a "no active module" state, which the options panel displays as **"Spec Not Supported"** — affecting all specs, not just Monk.

### Changes

**`NemHealerAlerts.lua`**
- Replaced the removed `CompactUnitFrame_UtilSetBuff` hook with a `CompactUnitFrame_UpdateAuras` hook, using the same `frame.buffFrames` iteration pattern already used by the Target and Focus frame hooks. Wrapped in an existence check so it degrades gracefully if Blizzard renames it again in a future patch.
- Moved `_glowHooksInstalled = true` to the *end* of `InitGlowHooks` so a future hook error cannot permanently disable glow hook installation.
- Added `pcall` protection to `FindActiveModule`'s spec index comparison as a secondary guard against the 12.0.5 secret-value API changes, with a `GetSpecializationInfo` spec ID fallback path.

**All spec modules** (`MonkMistweaver`, `DruidRestoration`, `PriestDiscipline`, `PriestHoly`, `ShamanRestoration`, `EvokerPreservation`, `PaladinHoly`)
- Added `specID` field to each module table. Used by the `FindActiveModule` fallback path when `GetSpecialization()` returns a secret value and direct index comparison is not possible.

---

# v12.0.16 (2026-04-19)

## Mistweaver Monk — Major Rework

### Statue Alerts Removed

After extensive in-combat testing, both **Place Jade Statue** and **Statue Idle** alerts have been removed. The root cause is Blizzard's secret-value API restrictions in M+ combat:

- `GetTotemInfo()` returns secret booleans — unreadable in M+ combat
- `UnitExists("totemN")` returns secret booleans in M+ combat
- Spell 198533 (statue's Soothing Mist) has every aura field secret in M+ combat — spellId, icon, name, and isFromPlayerOrPlayerPet are all unreadable
- Spell 115175 (player's Soothing Mist) is whitelisted and readable, but only reflects the player's own channel — the statue's independent 12-second channel is undetectable once the player stops casting

The combination of unreliable placement detection (false positives with the statue visibly present) and completely undetectable statue activity in M+ made both alerts produce more noise than signal. They have been removed in favour of the two alerts that work reliably.

### Soothing Mist Icon Glow (new)

A new icon glow fires on buff frames when your Soothing Mist (spell 115175) is active on a target. Full-duration glow for the entire channel — no pandemic window, just a clean visual indicator of your current SM target. Uses monk teal (`#00FF98`), stored in `db.alertColors.sm` for future colour customisation. Works alongside the existing Renewing Mist pandemic glow and Enveloping Mist full-duration glow.

### Renewing Mist Threshold — Options Panel (new)

Two new numeric inputs appear in the Alert Options section below the font dropdown:

- **Target Renewing Mist (Party)** — dungeon threshold, default 2, range 1–20
- **Target Renewing Mist (Raid)** — raid threshold, default 4, range 1–40

Both inputs are class-coloured and sit on the same row. Values take effect immediately without a reload.

### Code Cleanup

Removed all statue-tracking infrastructure that existed solely to support the two removed alerts (~750 lines):

- `CheckJadeStatueTalent`, `IsJadeStatuePlaced`, `TryRecoverStatueSlot`, `IsStatueInRange`, `IsStatueChannelingSoothingMist`, `FindStatueSoothingMistTarget`
- `SaveStatuePersist`, `SetStatuePlaced`, `ClearStatuePlaced`, `LoadStatuePersist`, `CombatSafeScan`
- `PLAYER_TOTEM_UPDATE` and `UNIT_SPELLCAST_SUCCEEDED` event handlers
- SavedVariables statue persistence (`statuePersistedPlaced`, `statuePersistedExpire`)
- `hasJadeStatueTalent`, `statueKnownPlaced`, `statueSlot`, `statueExpire` state fields
- `mwtrace` and `mwscan` debug slash commands (no longer needed without statue diagnostics)
- `SUMMON_JADE_STATUE_ID`, `STATUE_SOOTHING_MIST_ID`, `SM_ICON_ID`, `JADE_STATUE_NODE_ID` constants

The module now contains only what it needs: two alerts (Spread Renewing Mist, Enveloping Mist), three icon glows (RM pandemic, EM full-duration, SM active channel), and the options panel threshold inputs.

---

# v12.0.15 (2026-04-18)

## Options Panel — Alert Options Section (new)

A dedicated fourth section, **Alert Options**, now appears below the Alerts section. It is fully dynamic — its contents are driven by the active spec module, just like Sounds and Alerts.

- **Font picker** moved here from the Display section. The "Alert Font" label has been removed; the dropdown stands alone as a clean control at the top of the section.
- **Spec-specific options** (previously in the right column of Display) now live here with a proper vertical layout via a new `BuildAlertOptions` hook. The core provides a helpers API to spec modules: `MakeCheckbox`, `MakeCheckboxRow`, `MakeCheckboxWithNumeric`, `MakeNumericInput`, and `Spacer`.
- **Alert text editors** — every alert for the active spec gets a labeled two-column edit box showing the current alert text. Edits apply live on focus-lost. Clearing a box resets it to the built-in default. Saved per character in the saved variables.
- **Restore Defaults button** added as a fourth button alongside Test, Unlock Frame, and Center Position. Resets all alert colors, alert texts, font, scale, font size, and frame position back to built-in defaults.
- **Reset Position** renamed to **Center Position**.

## Options Panel — Display Section

- Checkboxes (Enable Addon, Flash Animation, Icon Glow) shifted left and spaced to match the Sounds section layout (x=8, 40px row gap).
- Display section height tightened by 20px to remove excess empty space below Icon Glow.
- Sound dropdowns shifted right to align their left edge directly under the slider tracks.
- Buttons shifted left 8px to align with the content panels.

## Restoration Druid — Alert Options

- **LB Timer** and **SOTF Timer** checkboxes now appear side-by-side on one row in the Alert Options section, with **Abundance Count** inline to the right, aligned to the same column as the Cast Lifebloom text editor below it.
- **Abundance Count** is now user-configurable (min 7, max 12, default 7). The value is saved to the database and read live by Evaluate on every tick. The edit box is class-colored.
- Alert text editors for all six Druid alerts: Lifebloom Expiring, Cast Lifebloom, Soul of the Forest, Wild Growth Ready, Tree of Life Ready, Abundance (Cast Regrowth).

## Restoration Druid — Default Sounds

- **Wild Growth Ready**: Lamp → Redfox
- **Abundance (Cast Regrowth)**: Ping → Lamp
- Lifebloom Expiring (Bell) and Soul of the Forest (Ping) unchanged.

---

# v12.0.14 (2026-04-18)

## Mistweaver Monk — Cleanup

- **Removed Zen Spheres** alert and all associated tracking code (talent check, aura scanning, state, DEFAULTS, alert definition)
- **Removed Shielun's Appeal** stack counter and all associated tracking code
- **Fixed default sounds** — Enveloping Mist changed from Redfox → Bell; Statue Idle changed from Bell → Lamp. Final defaults: Spread Renewing Mist (Ping), Enveloping Mist (Bell), Place Jade Statue (Lamp), Statue Idle (Lamp)

---

# v12.0.13 (2026-04-18)

## Mistweaver Monk — Bug Fixes

- **Fixed chat spam loop** — `IsJadeStatuePlaced()` had permanent debug `NHA.Msg("[IJP] ...")` prints baked in that fired on every evaluate tick and every `PLAYER_TOTEM_UPDATE` event. All debug output has been removed.
- **Fixed false "Place Jade Statue" alert** — In M+ combat, the icon and name matchers inside `IsJadeStatuePlaced()` silently return `false` even when the statue is present (tainted comparison results). The old code treated a clean-but-no-match scan as a confirmed absence and wiped `statueKnownPlaced`, overriding what `UNIT_SPELLCAST_SUCCEEDED` had correctly set. The function now preserves `statueKnownPlaced` if it was set by the cast event and hasn't expired, only clearing it on a confirmed expiry.

---

# v12.0.12 (2026-04-18)

## Restoration Druid — New Alerts

### Cast Lifebloom *(new)*
Fires in combat when no party or raid member has your Lifebloom active. This is the companion to the existing Lifebloom Expiring alert — Expiring tells you it's about to fall off, Cast Lifebloom tells you it's already gone. The two alerts are mutually exclusive and share the same screen position so you always know exactly what Lifebloom needs from you. Hidden during test mode to avoid overlapping with the Lifebloom Expiring preview.

### Abundance — Cast Regrowth *(new)*
Fires when you have the **Abundance** talent and your combined Rejuvenation + Germination count across the group reaches **7 or more**. At that stack count, Abundance gives Regrowth a meaningful cost reduction and critical hit bonus, making it an efficient filler cast. Each target can contribute up to 2 stacks (one Rejuv and one Germination). The alert is fully talent-gated — it won't appear if you haven't specced into Abundance.

### Wild Growth — Dynamic Cooldown Tracking *(new)*
The Wild Growth Ready alert now calculates the correct cooldown duration based on your actual build, so the alert fires at the right time regardless of how you're geared or specced:

- **Early Spring** hero talent reduces the cooldown by 1 second and is detected automatically when you switch talents
- **Sprouts of the Luminous Bloom 4pc set bonus** reduces it by 2 seconds in PvE, or 1 second in arenas (PvP scaling applied automatically)
- When the cooldown API is readable (outside M+ and rated content), the addon stores the real duration directly as ground truth, overriding the calculated values

Gear changes and talent swaps are detected in real time — no reload needed.

## Restoration Druid — Alert Text Updates

- **Reforestation** shortened from `* TREE OF LIFE NEXT SWIFTMEND *` → `* TREE: NEXT SWIFTMEND *`
- **Abundance** updated from `* ABUNDANCE - CAST REGROWTH *` → `* ABUNDANCE: CAST REGROWTH *`
- **Cast Lifebloom** — no longer plays a sound by default (sound channel removed)

## Options Panel — UI Improvements

The Settings panel has been cleaned up with a better visual flow throughout:

- Fixed right-side panels being clipped off-screen in the WoW Settings UI (panel width reduced by 15px)
- Removed redundant slider labels that were duplicating information already shown on the sliders themselves
- Dropdown controls shifted down for better visual separation from the section above
- Display section sliders shifted right for improved alignment

---

# v12.0.11 (2026-04-14)

## Mistweaver Monk — Jade Serpent Statue Alerts

Two new alerts for Mistweaver Monks who talent into Jade Serpent Statue:

- **Place Jade Statue** — fires in combat when the Jade Serpent Statue talent is selected but no statue is currently placed. Catches forgotten placements after dying, rezoning, or the 15-minute duration expiring. Uses the `GetTotemInfo` API (not affected by secret-value restrictions)
- **Statue Out of Range** — fires when you're channeling Soothing Mist on a target and the statue is placed, but the statue's copy (spell 198533) isn't healing anyone. Indicates a line-of-sight or range problem between the statue and your target. Includes a 0.5s grace period after channel start so the statue has time to begin casting

Both alerts are talent-gated via Node ID 101164 (Jade Serpent Statue / Jade Infusion choice node) and will not appear if you've selected Jade Infusion instead.

### Technical

- Added `PLAYER_TOTEM_UPDATE` event to the Mistweaver module for immediate statue placement/destruction detection
- Talent detection follows the same `C_ClassTalents` / `C_Traits` pattern used by Druid Reforestation, including `PLAYER_TALENT_UPDATE` / `TRAIT_CONFIG_UPDATED` re-checks
- Statue detection via `GetTotemInfo()` slot iteration with icon ID match (620831) and name fallback — works in M+ and rated PvP
- Debug command (`/nha debug`) now dumps totem slot info, statue placement status, statue Soothing Mist target, and talent state

## Spec Availability

Four specs have been temporarily disabled pending full customization and testing: **Holy Priest**, **Holy Paladin**, **Preservation Evoker**, and **Restoration Shaman**. These modules loaded but were not yet functional, leading to user confusion. Each spec file now exits at load time until implementation is complete. They will be re-enabled spec by spec as testing is finished.

---

# v12.0.10 (2026-04-12)

## Options Panel Improvements

- Non-healer specs now show a clean "Spec Not Supported" panel on first click — no more blank panel or flashing options
- All non-healer specs (including non-healer specs of supported classes like Windwalker Monk or Shadow Priest) now show the same unified message
- Removed the old "Class Not Supported" / "Class Support Coming Soon" distinction — everything is handled by one simple check
- Options panel uses the default cyan theme for non-healer specs instead of showing class colors

## Code Cleanup

- Removed overlay system — the unsupported-spec panel is now built directly into the UI rather than layered on top
- Standardized Mistweaver Monk module structure to match the Restoration Druid and Discipline Priest reference format
- Added debug slash command for Mistweaver (`/nha debug`)

---

# v12.0.9 (2026-04-10)

## Rebrand: Nem: HoT Alerts → Nem: Healer Alerts

The addon has been renamed from **Nem: HoT Alerts** to **Nem: Healer Alerts** to better reflect its scope — the addon tracks far more than just Heal over Time effects (beacons, procs, cooldowns, shields, etc.). This is a cosmetic rename with zero gameplay changes.

### What changed

- All user-facing text updated: title, options panel, chat messages, addon compartment, Settings category
- Internal identifiers renamed (`NemHotAlertsSV` → `NemHealerAlertsSV`, `_G.NemHotAlerts` → `_G.NemHealerAlerts`, frame names, slash command keys)
- **Existing settings migrate automatically** — your saved variables carry over on first login, no action needed
- New slash command `/healeralerts` added; `/hotalerts` kept as a legacy alias
- Addon folder renamed from `NemHotAlerts` to `NemHealerAlerts`

## All Healer Specs Now Supported

### Restoration Druid (existing)

- All existing alerts and glows carry over unchanged

### Discipline Priest (new)

- Atonement Expiring — alerts when your soonest Atonement enters its pandemic window, with countdown timer. Tracks the most urgent Atonement across your entire group
- Cast Void Shield — alerts when Master the Darkness procs, reminding you to cast an empowered Power Word: Shield
- Atonement icon glow on party/target/focus frames when inside the pandemic window
- Void Shield absorb icon glow on party frames when your Void Shield is active on a target

### Holy Priest (new)

- Prayer of Mending — alerts when you have no active Prayer of Mending bouncing on any group member
- Prayer of Mending icon glow on frames where PoM is active

### Preservation Evoker (new)

- Reversion Low — alerts when your Reversion/Echo Reversion coverage drops below threshold (configurable for dungeons vs raids)
- Echo icon glow on frames where Echo is active
- Echo Reversion synergy icon glow

### Mistweaver Monk (new)

- Renewing Mist Low — alerts when your Renewing Mist coverage drops below threshold (configurable for dungeons vs raids)
- Enveloping Mist — alerts when you're channeling Soothing Mist on a target that doesn't have Enveloping Mist yet
- Soothing Mist target icon glow

### Holy Paladin (new)

- Beacon Missing — alerts when no Beacon (Light, Faith, or Savior) is active on any group member
- Eternal Flame — optional alert when Eternal Flame coverage is low (off by default)
- Beacon icon glow on frames where any Beacon variant is active

### Restoration Shaman (new)

- Earth Shield Missing — alerts when Earth Shield isn't active on anyone (checks focus, then target, then group)
- Riptide Low — alerts when your Riptide coverage drops below threshold (configurable for dungeons vs raids)

## Architecture

The addon was completely restructured behind the scenes. Each healer spec is now a fully independent file — adding or changing one spec can never break another. Druid players will notice zero differences from v12.0.8.

---

# v12.0.8 (2026-04-06)

## Bug Fixes

- Alerts no longer fire in non-Restoration Druid specs (Balance, Feral, Guardian)
- Switching away from Restoration now immediately clears all alerts and glows
- Zone transitions in off-spec no longer cause stale alerts

## Changes

- Login message shows inactive status for Druids in non-Resto specs
- Chat feedback when switching specs in/out of Restoration

---

# v12.0.7 (2026-04-05)

## New Features

- Options panel now themes dynamically per healer class (Druid orange, Priest white, Evoker teal, Shaman blue, Monk green, Paladin pink)
- Non-healer classes see a "Class Not Supported" overlay listing supported classes
- Supported healers without a module see "Class Support Coming Soon"
- Slash commands blocked for non-implemented classes with a helpful message
- Updated subtitle to reflect multi-class scope

---

# v12.0.6 (2026-04-05)

## Bug Fixes

- Fixed a crash in M+ and rated content caused by a removed WoW API (`GetSpellCooldown` → `C_Spell.GetSpellCooldown`)

---

# v12.0.5 (2026-04-04)

## New Features

- **Wild Growth Ready** alert — shows when Wild Growth is off cooldown (combat only). Falls back to cast tracking when WoW restricts the cooldown API in M+/rated content
- **Reforestation / Tree of Life** alert — shows after your 3rd Swiftmend, reminding you the next one will proc Tree of Life. Automatically hides if you unspec the talent
- **Empowered Regrowth glow** — Regrowth icons on party frames glow when the Regrowth was cast with Soul of the Forest active. Clears when overwritten by a normal Regrowth
- Alert display order flipped: Tree of Life (top) → Wild Growth → Soul of the Forest → Lifebloom (bottom)
- SOTF alert text changed from "CAST REJUV" to "SOUL OF THE FOREST"
- Two new bundled sounds: Lamp and Redfox (15 total)
- All four alerts now have individual color swatches

## Bug Fixes

- Numerous fixes for Wild Growth cooldown tracking, Reforestation talent detection, and empowered Regrowth glow reliability in combat
- Death now properly clears all alert state
- Test mode now shows all four alerts
- Display section checkbox labels no longer invisible

---

# v12.0.4 (2026-04-02)

## Bug Fixes

- Test mode timers now display correctly alongside alert text
- Options panel spacing matches Nem: Pet Alerts layout

---

# v12.0.3 (2026-04-02)

## Performance

Major CPU optimization for raids and battlegrounds — reduced unnecessary processing from aura events, group roster changes, and glow updates. Most noticeable when joining a 40-player group.

## Bug Fixes

- SOTF alert no longer gets stuck when the proc expires without casting
- Lifebloom icon glow now fires correctly when targeting an enemy
- Ticker no longer runs indefinitely after disabling the addon
- SOTF alert state properly clears when the alert is toggled off mid-session
- Fixed a crash caused by glow cleanup running before glow tables were created
- Alerts now clear on player death and re-evaluate on resurrect
- SOTF alert clears immediately on Rejuv cast instead of waiting for the next evaluation tick
- Bell and Ping sounds now work without LibSharedMedia installed

---

# v12.0.2 (2026-04-01)

## Bug Fixes

- All alerts and sounds now work reliably in M+ and rated combat (WoW 12.0's secret-value aura restrictions)
- SOTF detection now uses spell-cast tracking as a fallback when the aura API is restricted in combat
- SOTF timer starts immediately on Swiftmend cast
- SOTF alert persists when entering combat with the proc already active

## Slash Commands

- Added `/nha on`, `/nha off`, `/nha toggle`, `/nha status`, `/nha version`, `/nha reset`, `/nha unlock`
- All commands also available via `/healeralerts` (and `/hotalerts` as legacy alias)

---

# v12.0.1 (2026-03-31)

Initial release of **Nem: Healer Alerts** (originally as Nem: HoT Alerts) — Restoration Druid alerts for Lifebloom pandemic tracking and Soul of the Forest proc consumption, with countdown timers, icon glows, configurable sounds, and full options panel. Part of the Nem addon suite.
